nginx

Posted by 果然 on January 5, 2022

正向代理与反向代理

正向代理中,proxy和client同属一个LAN,对server透明。
如:由于防火墙的原因,借助VPN访问谷歌。正向代理“代理”的是客户端,而且客户端是知道目标的,而目标是不知道客户端是通过VPN访问的。
zd

反向代理中,proxy和server同属一个LAN,对client透明。
如:外网访问百度时,其实会进行一个转发,代理到内网去,即反向代理“代理”的是服务器端,而且这一个过程对于客户端而言是透明的。
fd

zfd

nginx

nginx 是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时长用于服务端的反向代理和负载均衡。

nginx

nginx 的 Master-Worker 模式

启动nginx后,其实就是在 80端口启动了 socket 服务进行监听,涉及了 master进程和worker进程。

Master 进程作用:读取并验证配置文件 nginx.conf;管理worker进程。
Worker 进程作用:每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。

常用的文件路径

  • /usr/local/etc/nginx/nginx.conf (nginx配置文件路径)
  • /usr/local/var/www (nginx服务器默认的根目录)
  • /usr/local/Cellar/nginx/1.17.9 (nginx的安装路径)
  • /usr/local/var/log/nginx/error.log (nginx默认的日志路径)

应用

动静分离

动静分离就是 nginx 服务器将接收到的请求分为动态请求和静态请求。
静态请求直接从 nginx 服务器所设定的根目录路径去取对应的资源,动态请求转发给真实的后台去处理。

server {  
        listen       8080;        
        server_name  localhost;

        location / {
            root   html; # Nginx默认值
            index  index.html index.htm;
        }
        
        # 静态化配置,所有静态请求都转发给 nginx 处理,存放目录为 my-project
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
            root /usr/local/var/www/my-project; # 静态请求所代理到的根目录
        }
        
        # 动态请求匹配到path为'node'的就转发到8002端口处理
        location /node/ {  
            proxy_pass http://localhost:8002; # 充当服务代理
        }
}

反向代理

反向代理的作用

  • 保障应用服务器的安全(增加一层代理,可以屏蔽危险攻击,更方便的控制权限)
  • 实现负载均衡
  • 实现跨域
server {  
        listen       8080;        
        server_name  localhost;

        location / {
            root   html; # Nginx默认值
            index  index.html index.htm;
        }
        
        proxy_pass http://localhost:8000; # 反向代理配置,请求会被转发到8000端口
}

即nginx 请求 localhost:8080 与请求 localhost:8000 效果是一样的。

负载均衡

在服务器集群中,Nginx 可以将接收到的客户端请求“均匀地”(严格讲并不一定均匀,可以通过设置权重)分配到这个集群中所有的服务器上。这个就叫做负载均衡。

负载均衡的作用

  • 分摊服务器集群压力
  • 保证客户端访问的稳定性
# 负载均衡:设置domain
upstream domain {
    server localhost:8000;
    server localhost:8001;
}
server {  
        listen       8080;        
        server_name  localhost;

        location / {
            # root   html; # Nginx默认值
            # index  index.html index.htm;
            
            proxy_pass http://domain; # 负载均衡配置,请求会被平均分配到8000和8001端口
            proxy_set_header Host $host:$server_port;
        }
}

正向代理

参考资料

  1. 反向代理为何叫反向代理?
  2. 8分钟带你深入浅出搞懂Nginx
  3. 连前端都看得懂的《Nginx 入门指南》
  4. 如何用Nginx来助力前端开发
  5. 负载均衡和动态负载均衡