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;
}
}
}
前后端分离部署
前端和后端分开部署到不同的服务器,我们需要处理跨域问题,关于处理跨域问题请见 前后端交互