文章目录
前言
部署的服务需要嵌入到其他网站页面,需要从主站平台做nginx转发到自己服务上,简单记录一下配置文件内容。
一、Nginx是什么?
一个高性能的开源 Web 服务器,也可以用作反向代理服务器、负载均衡器、HTTP 缓存以及作为邮件代理服务器等。它具有轻量级、高并发、低内存占用等特点,因此被广泛应用于构建高性能的 Web 服务。
二、配置文件详解
#指定 Nginx 进程运行的用户和用户组,通常是 nginx 用户。
user nginx;
#自动设置工作进程数,通常与 CPU 核心数相同,可以优化并发处理能力
worker_processes auto;
#定义错误日志文件路径和日志级别(这里为 notice)。
error_log /var/log/nginx/error.log notice;
#定义保存 Nginx 进程 ID 的文件路径。
pid /var/run/nginx.pid;
#事件模块
events {
#单个业务进程可接受连接数
worker_connections 1024;
}
http {
#引入http.mine类型:让浏览器知道如何渲染nginx数据
include /etc/nginx/mime.types;
#如果mine类型没有匹配上,则默认使用二进制流传输
default_type application/octet-stream;
#定义日志格式,记录客户端请求的详细信息。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#指定访问日志文件路径和使用的日志格式。
access_log /var/log/nginx/access.log main;
#使用linux的sendfile(socket,file,len)进行高效网络传输,即数据的0拷贝
sendfile on;
#启用 TCP_NOPUSH 选项。在 Linux 和 BSD 系统上,启用此选项后,Nginx 会尝试尽量发送完整的数据包,直到当前的数据包填满才发送出去。这通常用于减少 TCP 数据包的数量,优化网络传输效率。
#tcp_nopush on;
#连接的超时时间为65
keepalive_timeout 65;
# 启用 gzip 压缩。
#gzip on;
#引入额外的配置文件,通常用于包括虚拟主机配置。
include /etc/nginx/conf.d/*.conf;
#虚拟机
server {
#服务器监听的端口号为 8888。
listen 8888;
#服务器名称或 IP 地址。
server_name 102.168.0.110;
#定义一个 URI 前缀为 /web 的位置块。所有以 /web 开头的请求都会匹配到这个位置块,并按照该块中的配置进行处理
location /web {
#加的三个头是解决跨域问题(前端访问图片文件之类的)
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
#将请求代理到后端服务器
proxy_pass http://192.168.0.110:8088;
#设置代理请求头,传递客户端信息到后端服务器。
proxy_set_header Host $host:$server_port;
#设置 X-Real-IP 请求头,将其值设置为客户端的真实 IP 地址。这个头字段通常用于日志记录和访问控制。
proxy_set_header X-Real-IP $remote_addr;
#设置 X-Forwarded-For 请求头,用于记录客户端的原始 IP 地址,以及通过代理服务器的 IP 地址链。这个头字段在有多个代理服务器时特别有用。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#设置 X-Forwarded-Host 请求头,将其值设置为客户端请求的主机名。这个头字段用于传递客户端请求的原始主机名。
proxy_set_header X-Forwarded-Host $host;
#设置 Via 请求头,表明请求通过 Nginx 代理。这有助于在代理链中记录请求的经过路径,有助于调试和诊断。
proxy_set_header Via "nginx";
}
#定义一个 URI 前缀为 /server/ 的位置块。所有以 /server/ 开头的请求都会匹配到这个位置块,并按照该块中的配置进行处理
location /server/ {
#加的三个头是解决跨域问题(前端访问图片文件之类的)
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
#添加 Access-Control-Allow-Methods 响应头,允许的 HTTP 方法包括 GET、POST 和 OPTIONS。这确保了跨域请求可以使用这些方法。
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
#将请求代理到后端服务器
proxy_pass http://192.168.0.110:8082/;
#设置 Host 请求头,将其值设置为客户端请求的主机名和端口。这个头字段确保后端服务器能够正确识别客户端请求的主机名和端口。
proxy_set_header Host $host:$server_port;
#设置 X-Real-IP 请求头,将其值设置为客户端的真实 IP 地址。这个头字段通常用于日志记录和访问控制。
proxy_set_header X-Real-IP $remote_addr;
#设置 X-Forwarded-For 请求头,用于记录客户端的原始 IP 地址,以及通过代理服务器的 IP 地址链。这个头字段在有多个代理服务器时特别有用。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#设置 X-Forwarded-Host 请求头,将其值设置为客户端请求的主机名。这个头字段用于传递客户端请求的原始主机名。
proxy_set_header X-Forwarded-Host $host;
#设置 Via 请求头,表明请求通过 Nginx 代理。这有助于在代理链中记录请求的经过路径,有助于调试和诊断。
proxy_set_header Via "nginx";
}
#定义一个 URI 前缀为 /web/socket/ 的位置块。所有以 /web/socket/ 开头的请求都会匹配到这个位置块,并按照该块中的配置进行处理
location /web/socket/ {
proxy_pass http://192.168.0.110:8082/;
#设置与后端服务器通信时使用的 HTTP 协议版本为 1.1。WebSocket 连接需要 HTTP/1.1 版本才能正常工作,因为 HTTP/1.0 不支持 WebSocket 的长连接特性。
proxy_http_version 1.1;
#设置 Upgrade 请求头,将其值设置为 $http_upgrade。这个头字段用于告诉服务器客户端希望升级协议(通常是从 HTTP 升级到 WebSocket)。
proxy_set_header Upgrade $http_upgrade;
#这个头字段配合 Upgrade 头字段,表示客户端希望升级当前的 HTTP 连接到其他协议(如 WebSocket)。
proxy_set_header Connection "upgrade";
#设置 Host 请求头,将其值设置为客户端请求的主机名。这个头字段确保后端服务器能够正确识别客户端请求的主机名。
proxy_set_header Host $host;
#设置 X-Real-IP 请求头,将其值设置为客户端的真实 IP 地址。这个头字段通常用于日志记录和访问控制。
proxy_set_header X-Real-IP $remote_addr;
#设置 X-Forwarded-For 请求头,用于记录客户端的原始 IP 地址,以及通过代理服务器的 IP 地址链。这个头字段在有多个代理服务器时特别有用。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#设置代理服务器在读取客户端数据时的超时时间为 86400 秒(24 小时)。这个配置确保 WebSocket 连接能够长时间保持活跃,不会因为短暂的网络问题或其他延迟而断开。
proxy_read_timeout 86400s;
}
}
}
三.负载均衡算法
项目中使用的是单部署,没有做备份,所以没有用到负载均衡算法。但是还是了解一下写在这里,后面用到可以直接拿。
http {
upstream backend {
server server1.com;
server server2.com;
server server3.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
1. 轮询(Round Robin)
轮询是 Nginx 的默认负载均衡算法,它按顺序将请求依次分配给每个后端服务器。
upstream backend {
server server1.com;
server server2.com;
server server3.com;
}
2.最少连接数(Least Connections)
最少连接数算法将请求分配给当前活动连接数最少的服务器。这种算法适用于每个请求处理时间大致相同的情况。
upstream backend {
least_conn;
server server1.com;
server server2.com;
server server3.com;
}
3.IP 哈希(IP Hash)
IP 哈希算法基于客户端 IP 地址的哈希值,将同一 IP 地址的请求始终分配给同一台服务器。这种算法适用于需要会话保持的场景。
upstream backend {
ip_hash;
server server1.com;
server server2.com;
server server3.com;
}
4. 权重(Weight)
权重算法根据服务器的权重值分配请求,权重值越高,分配的请求越多。可以结合轮询和最少连接数算法使用。
配置示例(结合轮询)
upstream backend {
server server1.com weight=1;
server server2.com weight=2;
server server3.com weight=3;
}
配置示例(结合最少连接数)
upstream backend {
least_conn;
server server1.com weight=1;
server server2.com weight=2;
server server3.com weight=3;
}
5. 健康检查(Health Check)
虽然不是一种负载均衡算法,但健康检查可以与负载均衡算法结合使用,以确保请求只发送到健康的服务器。
upstream backend {
server server1.com;
server server2.com;
server server3.com;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "GET /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
本机测试负载均衡策略以备后用:
user nginx;
#业务进程:自动,根据cpu
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
#单个业务进程可接受连接数
worker_connections 1024;
}
http {
upstream backend {
server 192.168.0.110:8083;
server 192.168.0.111:8083;
}
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
server {
listen 8888;
server_name 192.168.0.110;
location /web/ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
proxy_pass http://192.168.0.110:8088;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header Via "nginx";
}
location /server/ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
proxy_pass http://backend/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header Via "nginx";
}
location /server/socket/ {
proxy_pass http://backend/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 86400s;
}
}
}