nginx部署

2023-06-15 20:15:00

技术

正向代理、反向代理

正向代理

作为客户端的代理,服务端只与客户端的代理进行交互。服务端实际上不会知道与它交互的客户端是哪个,它只与代理接收或发送消息,代理则转发消息给客户端。

例子: 魔法上网,服务端不会知道客户端的 ip

反向代理

作为服务端的代理,例如魔法上网,客户端只与服务端的代理进行交互。客户端只与代理接收或发送消息,代理则转发消息给服务端。

例子: 公司内网,服务端在局域网内,外网无法直接访问,需要通过网关这个代理来转发请求

Nginx 就属于反向代理

Nginx 常见命令

nginx -s stop    # 停止 Nginx 服务
nginx -s reload  # 重新加载配置文件
nginx -s quit    # 平滑停止 Nginx 服务
nginx -t         # 测试配置文件是否正确

Nginx 部署

Nginx 相关配置文件目录: /etc/nginx/ 主配置文件为: /etc/nginx/nginx.conf

# 进程
worker_processes  1;

# 连接数
events {
    worker_connections  1024;
}

# http 服务
http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        access_log   /var/log/web_app-access.log;
        error_log    /var/log/web_app-error.log;

        location / {
            proxy_pass                 http://127.0.0.1:8084;
            proxy_redirect             off;
            proxy_set_header           Host             $host;
            proxy_set_header           X-Real-IP        $remote_addr;
            proxy_set_header           X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    }
}

执行下面的命令检查配置文件语法:

nginx -t

执行下面的命令重新加载配置文件:

nginx -s reload

负载均衡

各种地方都说得高大上,但使用起来并不复杂,其中一种就是一套后端代码的服务部署到多个地址

使用 nginx 的 upstream 配置来添加多个服务器地址实现负载均衡。

轮询(默认)

即按时间顺序逐一分配到不同的后端服务器

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
    
    upstream backend {
      server 127.0.0.1:9000;
      # 这里需要填真实可用的地址,默认轮询
      #server backend1.example.com;
      #server backend2.example.com;
    }

    server {
        # nginx 的端口
        listen       80;
        server_name  localhost;

        access_log   /var/log/web_app-access.log;
        error_log    /var/log/web_app-error.log;

        location / {
            proxy_pass                 http://backend/;
            proxy_redirect             off;
            proxy_set_header           Host             $host;
            proxy_set_header           X-Real-IP        $remote_addr;
            proxy_set_header           X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    }
}

权重

weight 代表权重,默认为1,权重越高被分配的客户端越多

weight和访问比率成正比,用于后端服务器性能不均的情况。 例如

upstream backend{
    server 127.0.0.1:9000 weight=5;
    server backend1.example.com weight=1;
    server backend2.example.com weight=2;
}

其他部分与上述的轮询一样,下同

最小连接

分配到当前连接数最小的服务

upstream backend { 
    least_conn;
    server 127.0.0.1:9000; 
    server backend1.example.com;
    server backend2.example.com;
}   

ip_hash

每个请求按访问ip的hash值分配,每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题

upstream backend { 
    ip_hash;
    server 127.0.0.1:9000; 
    server backend1.example.com;
    server backend2.example.com;
}   

Nginx分离静态文件请求

将静态文件部分的请求直接使用 nginx 处理,而将 API 接口类的动态处理请求转发给后端的 Go 程序来处理。

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  web_app;

        access_log   /var/log/web_app-access.log;
        error_log    /var/log/web_app-error.log;

        # 静态文件请求
        location ~ .*\.(gif|jpg|jpeg|png|js|css|eot|ttf|woff|svg|otf)$ {
            access_log off;
            expires    1d;
            root       /data/app/web_app;
        }

        # index.html页面请求
        # 因为是单页面应用这里使用 try_files 处理一下,避免刷新页面时出现404的问题
        location / {
            root /data/app/web_app/templates;
            index index.html;
            try_files $uri $uri/ /index.html;
        }

        # API请求
        location /api {
            # 后端服务的地址
            proxy_pass                 http://127.0.0.1:9000;
            proxy_redirect             off;
            proxy_set_header           Host             $host;
            proxy_set_header           X-Real-IP        $remote_addr;
            proxy_set_header           X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    }
}

前后端分离部署

前端和后端分开部署到不同的服务器,我们需要处理跨域问题,关于处理跨域问题请见 前后端交互