高可用实战之Nginx + Apache篇
目录
[高可用实战之Nginx + Apache篇](#高可用实战之Nginx + Apache篇)
[一 . 准备4台服务器](#一 . 准备4台服务器)
[二. 安装Nginx使用ngx_http_upstream_module 模块](#二. 安装Nginx使用ngx_http_upstream_module 模块)
[1. 下载 Nginx 源代码](#1. 下载 Nginx 源代码)
[2. 解压源码包](#2. 解压源码包)
[3. 安装依赖](#3. 安装依赖)
[4. 配置编译选项](#4. 配置编译选项)
[5. 编译和安装 Nginx](#5. 编译和安装 Nginx)
[6. 验证启用的模块](#6. 验证启用的模块)
7.安装完成,启动
查看端口是否开启
[查看nginx 进程:](#查看nginx 进程:)
查看防火墙状态:
[开放指定端口(例如 80)](#开放指定端口(例如 80))
修改配置后重新加载配置重启
Nginx停止
[三. 另外 183,184 两台分配 安装 Apache HTTP Server (httpd)](#三. 另外 183,184 两台分配 安装 Apache HTTP Server (httpd))
[1. 安装httpd](#1. 安装httpd)
[2. 启动httpd](#2. 启动httpd)
[3. 查看httpd的状态](#3. 查看httpd的状态)
[4. 默认端口是80端口,把端口分别换成18091,18092](#4. 默认端口是80端口,把端口分别换成18091,18092)
[5. 检查配置文件是否有效](#5. 检查配置文件是否有效)
[6. 将ServerName 127.0.0.1 添加到文件的第101行](#6. 将ServerName 127.0.0.1 添加到文件的第101行)
[7. 检查端口是否被占用](#7. 检查端口是否被占用)
[8. 查看httpd的错误日志](#8. 查看httpd的错误日志)
[9. 检查和设置日志目录权限](#9. 检查和设置日志目录权限)
[10. 分别开放指定端口(例如18091|18092)](#10. 分别开放指定端口(例如18091|18092))
[四. 通过配置Nginx来实现支持负载均衡和故障转移](#四. 通过配置Nginx来实现支持负载均衡和故障转移)
[1. Nginx 之负载均衡](#1. Nginx 之负载均衡)
[2. 验证配置文件是否有问题](#2. 验证配置文件是否有问题)
[3. 加载配置并重启](#3. 加载配置并重启)
[4. 此时此刻完成了完整的负载均衡](#4. 此时此刻完成了完整的负载均衡)
[5. 把权重一个调整成2,一个调整成5](#5. 把权重一个调整成2,一个调整成5)
[6. Nginx 之故障转移](#6. Nginx 之故障转移)
[7. Nginx 之动静分离](#7. Nginx 之动静分离)
1.上传一张图片到183服务器的静态目录下,并界面验证访问,静态资源请求正常。
[2. 在184 上面新建目录,模拟后端请求json](#2. 在184 上面新建目录,模拟后端请求json)
[3. 配置nginx 动静分离](#3. 配置nginx 动静分离)
[4. 根据扩展名实现服务器的动静分离](#4. 根据扩展名实现服务器的动静分离)
[8. Nginx 之针对不同手机类型进行代理](#8. Nginx 之针对不同手机类型进行代理)
[9. Nginx 之针对不同浏览器进行代理](#9. Nginx 之针对不同浏览器进行代理)
[1.开启nginx 访问日志,并查询用户使用的浏览器类型](#1.开启nginx 访问日志,并查询用户使用的浏览器类型)
[2. 配置nginx 根据浏览器访问不通的服务器站点](#2. 配置nginx 根据浏览器访问不通的服务器站点)
[10. Nginx 负载均衡内核参数优化](#10. Nginx 负载均衡内核参数优化)
[1. net.ipv4.tcp_fin_timeout = 2](#1. net.ipv4.tcp_fin_timeout = 2)
[2. net.ipv4.tcp_tw_reuse = 1](#2. net.ipv4.tcp_tw_reuse = 1)
[3. net.ipv4.tcp_tw_recycle = 1](#3. net.ipv4.tcp_tw_recycle = 1)
[4. net.ipv4.tcp_syncookies = 1](#4. net.ipv4.tcp_syncookies = 1)
[5. net.ipv4.tcp_keepalive_time = 600](#5. net.ipv4.tcp_keepalive_time = 600)
[6. net.ipv4.ip_local_port_range = 4000 65535](#6. net.ipv4.ip_local_port_range = 4000 65535)
[7. net.ipv4.tcp_max_syn_backlog = 16384](#7. net.ipv4.tcp_max_syn_backlog = 16384)
[8. net.ipv4.tcp_max_tw_buckets = 36000](#8. net.ipv4.tcp_max_tw_buckets = 36000)
[9. net.ipv4.route.gc_timeout = 100](#9. net.ipv4.route.gc_timeout = 100)
[10. net.ipv4.tcp_syn_retries = 1](#10. net.ipv4.tcp_syn_retries = 1)
[11. net.core.somaxconn = 16384](#11. net.core.somaxconn = 16384)
[12. net.core.netdev_max_backlog = 16384](#12. net.core.netdev_max_backlog = 16384)
[13. net.ipv4.tcp_max_orphans = 16384](#13. net.ipv4.tcp_max_orphans = 16384)
[14. net.ipvip_conntrack_max = 25000000](#14. net.ipvip_conntrack_max = 25000000)
[15. net.ipv4.netfilter.ip_conntrack_max = 25000000](#15. net.ipv4.netfilter.ip_conntrack_max = 25000000)
[16. net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180](#16. net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180)
[17. net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120](#17. net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120)
[18. net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60](#18. net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60)
[19. net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120](#19. net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120)
总结配置:
[Nginx 模块及参数的详细解释](#Nginx 模块及参数的详细解释)
一 . 准备4台服务器
hostnamectl set-hostname Nginx01
hostnamectl set-hostname Nginx02
hostnamectl set-hostname Apache01
hostnamectl set-hostname Apache02
|-----------------|-------------------------------|-------|
| 服务器IP | 系统 | 主要组件 |
| 192.168.100.181 | Rocky Linux 10.0 (Red Quartz) | nginx |
| 192.168.100.182 | Rocky Linux 10.0 (Red Quartz) | nginx |
| 192.168.100.183 | Rocky Linux 10.0 (Red Quartz) | httpd |
| 192.168.100.184 | Rocky Linux 10.0 (Red Quartz) | httpd |
二. 安装Nginx使用ngx_http_upstream_module 模块
ngx_http_upstream_module:配置后端服务器组,支持负载均衡和故障转移。
Nginx 官网下载最新版本的安装包,不使用服务器yum安装,可能不是最新的,这样安装对扫漏又来进行打补丁解更方便。上传Nginx安装包至服务器,解压并进入目录执行安装。确保安装过程中包含ngx_http_upstream_module模块。编译安装时通过--add-module参数指定模块路径,若模块已内置则无需额外添加。安装完成后,修改Nginx配置文件nginx.conf,在http块中使用upstream指令定义后端服务器组,设置负载均衡算法如轮询、加权轮询或IP哈希等,同时配置server块中的proxy_pass指向定义的upstream名称,完成基础负载均衡配置。
Nginx 官网地址:nginx
ngx_http_upstream_module:模块地址 Module ngx_http_upstream_module
截止2025八月Nginx 版本1.29
下载Nginx1.29.0的地址:https://nginx.org/download/nginx-1.29.0.tar.gz
yum -y install wget vim tar net-tools
1. 下载 Nginx 源代码
wget https://nginx.org/download/nginx-1.29.0.tar.gz
2. 解压源码包
tar -zxvf nginx-1.29.0.tar.gz
cd nginx-1.29.0
3. 安装依赖
当前系统属于红帽系列
yum groupinstall "Development Tools"
yum install pcre-devel zlib-devel openssl-devel
4. 配置编译选项
ngx_http_upstream_module 是 Nginx 默认启用的模块,养成习惯安装指定启动模块。
常规安装包含的模块
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_upstream_module
--prefix=/usr/local/nginx:指定 Nginx 的安装路径。
--with-http_ssl_module:启用 SSL 支持,用于 HTTPS。
--with-http_upstream_module:启用上游模块,用于设置负载均衡和反向代理
备注:默认是不要显式地启用 --with-http_upstream_module,因为它已经是默认启用的模块
编译执行
./configure --prefix=/usr/local/nginx --with-http_ssl_module
这个错显示编译的时候缺少pcre库。
本次统一都是用二进制包安装;
pcre库官网地址:https://www.pcre.org/

下载地址:https://psychz.dl.sourceforge.net/project/pcre/pcre2/10.37/pcre2-10.37.tar.gz?viasf=1
tar -xzvf pcre2-10.37.tar.gz
使用 --with-pcre=<path> 指定 PCRE 库的路径编译通过
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-pcre=/home/pcre2-10.37
5. 编译和安装 Nginx
配置完后,继续使用 make 和 make install 来编译并安装 Nginx:
make && make install
6. 验证启用的模块
完成编译和安装后,你可以通过以下命令查看已启用的模块:
/usr/local/nginx/sbin/nginx -V
7.安装完成,启动
/usr/local/nginx/sbin/nginx
查看端口是否开启
ss -tuln | grep :80
查看nginx 进程:
ps aux | grep nginx
查看防火墙状态:
firewall-cmd --state
开放指定端口(例如 80)
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --reload
修改配置后重新加载配置重启
/usr/local/nginx/sbin/nginx -s reload
Nginx停止
/usr/local/nginx/sbin/nginx -s stop
三. 另外 183,184 两台分配 安装 Apache HTTP Server (httpd)
1. 安装httpd
yum install httpd -y
2. 启动httpd
systemctl start httpd
3. 查看httpd的状态
systemctl status httpd
4. 默认端口是80端口,把端口分别换成18091,18092
192.168.100.183 端口 18091
sed -i 's/^Listen 80$/Listen 18091/' /etc/httpd/conf/httpd.conf
192.168.100.184 端口 18092
sed -i 's/^Listen 80$/Listen 18092/' /etc/httpd/conf/httpd.conf
5. 检查配置文件是否有效
apachectl configtest
6. 将ServerName 127.0.0.1 添加到文件的第 101 行
sed -i '101i ServerName 127.0.0.1' /etc/httpd/conf/httpd.conf
7. 检查端口是否被占用
netstat -tuln | grep -E '18091|18092'
8. 查看httpd的错误日志
tail -f /var/log/httpd/error_log
9. 检查和设置日志目录权限
确保 Apache 有权访问日志目录。检查日志目录的权限,例如:
ls -ld /var/log/httpd/
确保 Apache 用户对日志目录具有写权限。如果没有权限,可以使用以下命令修复权限:
chown -R apache:apache /var/log/httpd/
chmod -R 755 /var/log/httpd/
解决方法: 如果您怀疑 SELinux 是问题的根源,可以临时禁用 SELinux,看看是否可以启动 Apache:
setenforce 0
10. 分别开放指定端口(例如 18091|18092 )
192.168.100.183 端口 18091
firewall-cmd --permanent --add-port=18091/tcp
firewall-cmd --reload
192.168.100.184 端口 18092
firewall-cmd --permanent --add-port=18092/tcp
firewall-cmd --reload
11. 自定义网站存放路径
mkdir -p /home/www/mywebsite/
设置权限
chown -R apache:apache /home/www/mywebsite/
chmod -R 755 /home/www/mywebsite
sed -i 's|DocumentRoot "/var/www/html"|DocumentRoot "/home/www/mywebsite"|' /etc/httpd/conf/httpd.conf
sudo sed -i '/<Directory "\/var\/www\/html">/,/<\/Directory>/c\<Directory "/home/www/mywebsite">\n Options Indexes FollowSymLinks\n AllowOverride All\n Require all granted\n</Directory>' /etc/httpd/conf/httpd.conf
12. 在183,184机器上自己的目录站点上分别添加index.html
root@Apache02 mywebsite\]# ll -ld ../mywebsite/
drwxr-xr-x. 2 apache apache 6 Aug 12 19:44 ../mywebsite/
\[root@Apache02 mywebsite\]# vim index.html
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Apache2 Site</title> </head> <body> <h1>这是 Apache02 站点!</h1> <p>IP地址:192.168.100.184</p> <p>端口:18092</p> <p>01和02站点内容一样</p> </body> </html>
|
root@Apache01 mywebsite\]# pwd
/home/www/mywebsite
\[root@Apache01 mywebsite\]# vim index.html
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| \ \ \
\
\
\
Apache2 Site\ \ \ \
这是 Apache01 站点!\
\
IP地址:192.168.100.183\
\
端口:18091\
\
01和02站点内容一样\
\  |
## **四. 通过配置Nginx来实现支持负载均衡和故障转移**
### ******1. Nginx 之负载均衡******
官网参考:[Module ngx_http_upstream_module](https://nginx.org/en/docs/http/ngx_http_upstream_module.html "Module ngx_http_upstream_module")
> cd /usr/local/nginx/conf
>
> cp nginx.conf nginx.conf_back
使用 sed 删除注释行让看起更加清爽:
> sed -i '/\^\\s\*#/d' /usr/local/nginx/conf/nginx.conf
vim nginx.conf
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream lb_webserver { server 192.168.100.183:18091 weight=5; server 192.168.100.184:18092 weight=5; } server { listen 80; server_name localhost; location / { proxy_pass http://lb_webserver; } } }  |
### ******2. 验证配置文件是否有问题******
> \[root@Nginx01 conf\]# /usr/local/nginx/sbin/nginx -t
>
> nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
>
> nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
### ******3. 加载配置并重启******
> \[root@Nginx01 conf\]# /usr/local/nginx/sbin/nginx -s reload
>
> \[root@Nginx01 conf\]#
### ******4. 此时此刻完成了完整的负载均衡******
weight:表示服务器的权重,权重值越高,Nginx 将分配给该服务器的请求就越多。在配置负载均衡时,如果没有指定 weight,则默认所有服务器的权重为 1。 都为5的时候,你一次我一次的轮询负责。根据生产实际的情况,权重大小调整越小轮询的值越小,意味着轮询的次数越少,权重值越大,轮询的次数越多。
示例:

> echo "这是 Apache01 站点!IP地址:192.168.100.183; 端口:18091; 01和02站点内容一样" \> /home/www/mywebsite/index.html
>
> echo "这是 Apache02 站点!IP地址:192.168.100.184; 端口:18092; 01和02站点内容一样" \> /home/www/mywebsite/index.html

### ******5. 把权重一个调整成2,一个调整成5******
> server 192.168.100.183:18091 weight=2;
>
> server 192.168.100.184:18092 weight=5;

### ******6. Nginx 之故障转移******
轮询节点可以是多台,备份节点也可以是多台。官网例子:

> server 192.168.100.183:18091 weight=5; #轮询节点
>
> server 192.168.100.184:18092 backup; #轮询节点全部故障后跳转到备份节点
让183服务停止,验证是否可以跳转到备份节点:


### ******7. Nginx 之动静分离******
动静分离(Static and Dynamic Separation)是指将静态资源(如图片、CSS、JavaScript文件等)和动态请求(如PHP、Python、Java等后端处理请求)分别由不同的服务器或不同的路径进行处理。Nginx作为反向代理服务器,可以帮助我们高效地实现这一分离。
静态资源:是指不需要服务器处理的文件,通常是图片、CSS、JavaScript、字体文件等。这些文件通常可以直接从磁盘读取,响应速度较快。
动态请求:是指需要服务器进行处理并生成动态内容的请求,通常包括数据查询、页面生成等操作。比如,PHP、Java、Node.js等后台语言处理的请求。
性能优化:
* 静态资源通常无需经过应用服务器的处理,可以直接由 Nginx 提供,减少了应用服务器的负担。
* 静态资源文件通常较大且请求频繁,直接通过 Nginx 提供可以大大提高响应速度。
|-----------------------|
| #静态缓存30天 expires 30d; |
#### ******1.上传一张图片到183服务器的静态目录下,并界面验证访问,静态资源请求正常。******
[http://192.168.100.183:18091/static/01.jpg](http://192.168.100.183:18091/static/01.jpg "http://192.168.100.183:18091/static/01.jpg")


#### ******2. 在184 上面新建目录,模拟后端请求json******

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| \ \ \ \
\
\
动态请求文件内容\ \ \ \
文件内容展示\
\
正在加载...\
\ \ | { "name": "张三", "age": 30, "phoneNumbers": \[ { "type": "home", "number": "028-11111111" }, { "type": "mobile", "number": "15908113332" } \], "isActive": true } |
|  ||
#### ******3. 配置nginx 动静分离******
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #静态请求的服务器组 upstream lb_static { server 192.168.100.183:18091 weight=5; } #动态请求的服务器组 upstream lb_dynamic { zone upstream_dynamic 64k; server 192.168.100.184:18092 weight=5; } server { listen 80; server_name localhost; location / { proxy_pass http://lb_dynamic; } location /static/ { proxy_pass http://lb_static; expires 30d; } } } |

备注: 同一个域名,动态请求走的动态服务器组,静态文件走的是静态文件组。


#### ******4. 根据扩展名实现服务器的动静分离******
# 静态资源的配置
> location \~\* \\.(gif\|jpg\|jpeg\|png\|bmp\|swf\|css\|js)$ {
>
> proxy_pass http://static_pools;
>
> include proxy.conf;
>
> }
# 动态资源的配置
> location \~\* \\.(php\|php3\|php5)$ {
>
> proxy_pass http://dynamic_pools;
>
> include proxy.conf;
>
> }
> vim proxy.conf
>
> # 关闭代理重定向 :Nginx 将不会修改它并将其直接转发给客户端。通常,如果你不希望修改响应中的重定向地址,这个配置是有用的。
>
> proxy_redirect off;
>
> # 设置代理头部信息 :这是为了保持客户端请求头中的主机信息,特别是在后端服务需要通过该信息来处理请求时
>
> proxy_set_header Host $host:$proxy_port;
>
> #设置 X-Forwarded-For 头部,传递客户端的原始 IP 地址。$remote_addr 是 Nginx 自动提供的变量,表示客户端的 IP 地址
>
> proxy_set_header X-Forwarded-For $remote_addr;
>
> # 设置代理连接超时和代理请求读取超时
>
> proxy_connect_timeout 90s;
>
> proxy_send_timeout 90s;
>
> proxy_read_timeout 90s;
>
> # 设置代理缓冲区和大小
>
> proxy_buffer_size 4k;
>
> proxy_buffers 4 32k;
>
> proxy_busy_buffers_size 64k;
>
> proxy_temp_file_write_size 64k;
### ******8. Nginx 之针对不同手机类型进行代理******
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #静态请求的服务器组 upstream lb_static_pools { server 192.168.100.183:18091 weight=5; } #动态请求的服务器组 upstream lb_dynamic_pools { zone upstream_dynamic 64k; server 192.168.100.184:18092 weight=5; } server { listen 80; server_name localhost; location / { ****if ($http_user_agent \~\* "android") {**** ****proxy_pass http://lb_dynamic_pools;**** ****break;**** ****}**** ****if ($http_user_agent \~\* "iphone") {**** ****proxy_pass http://lb_dynamic_pools;**** ****break;**** ****}**** # 默认代理 proxy_pass http://lb_dynamic_pools; } location /static/ { proxy_pass http://lb_static_pools; expires 30d; } } } |
### ******9. Nginx 之针对不同浏览器进行代理******
#### ******1.开启nginx 访问日志,并查询用户使用的浏览器类型******
> 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 logs/access.log main;
>
> 查看访问日志: tail -f /usr/local/nginx/logs/access.log
#### ******2. 配置nginx 根据浏览器访问不通的服务器站点******
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| worker_processes 1; events { worker_connections 1024; } http { include 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 logs/access.log main; # 其他配置... sendfile on; keepalive_timeout 65; map $http_user_agent $browser_type { default "other"; # 默认值为 "other" \~\*Chrome "chrome"; # 如果 User-Agent 包含 "Chrome" \~\*Firefox "firefox"; # 如果 User-Agent 包含 "Firefox" \~\*Safari "safari"; # 如果 User-Agent 包含 "Safari" \~\*MSIE "ie"; # 如果 User-Agent 包含 "MSIE"(IE 10 及以下) \~\*Trident "ie"; # 如果 User-Agent 包含 "Trident"(IE 11) } #静态请求的服务器组 upstream lb_static_pools { server 192.168.100.183:18091 weight=5; } #动态请求的服务器组 upstream lb_dynamic_pools { zone upstream_dynamic 64k; server 192.168.100.184:18092 weight=5; } upstream chrome_pools { server 192.168.100.183:18091 weight=5; } upstream firefox_pools { server 192.168.100.184:18092 weight=5; } upstream safari_pools { server 192.168.100.183:18091 weight=5; } upstream ie_pools { server 192.168.100.184:18092 weight=5; } server { listen 80; server_name localhost; location / { if ($browser_type = "chrome") { proxy_pass http://chrome_pools; break; } if ($browser_type = "firefox") { proxy_pass http://firefox_pools; break; } if ($browser_type = "ie") { proxy_pass http://ie_pools; break; } # 默认代理 proxy_pass http://lb_dynamic_pools; } location /static/ { proxy_pass http://lb_static_pools; expires 30d; } } } |


### ******10. Nginx 负载均衡内核参数优化******
#### ******1**** ****. net.ipv4.tcp_fin_timeout = 2******
* **描述** :该参数指定了 TCP 连接处于 FIN_WAIT 状态时的最大等待时间。FIN_WAIT 状态发生在连接关闭时,通常是因为对端发送了一个 FIN 包表示连接关闭。Nginx 作为 Web 服务器,处理大量的并发连接时,可以通过减少 FIN_WAIT 状态的超时时间来减少占用的系统资源。
* **建议值** :2 秒(较小的超时时间可以释放资源)。
> sysctl -w net.ipv4.tcp_fin_timeout=2
#### ******2. net.ipv4.tcp_tw_reuse = 1******
* **描述** :当 TCP 连接处于 TIME_WAIT 状态时,可以重新使用该端口进行新的连接。TIME_WAIT 状态发生在连接关闭后,通常会持续 2 到 4 分钟。启用此选项可以帮助提高系统的资源使用率,尤其是在高并发场景下。
* **建议值** :1 表示启用,允许重用 TIME_WAIT 状态的连接。
> sysctl -w net.ipv4.tcp_tw_reuse=1
#### ******3. net.ipv4.tcp_tw_recycle = 1******
* **描述** :启用 TCP 时间戳的快速回收(TIME_WAIT)状态的连接。该选项有助于快速清理旧的 TIME_WAIT 连接。请注意,这个选项可能会导致 NAT(网络地址转换)环境下的某些问题,因此不推荐在有 NAT 的网络环境下使用。
* **建议值** :1 启用,但要谨慎使用,特别是在有 NAT 或代理的网络环境中。
> sysctl -w net.ipv4.tcp_tw_recycle=1
#### ******4. net.ipv4.tcp_syncookies = 1******
* **描述** :启用 TCP 同步 cookies。此配置可以在 TCP 握手中防止 SYN 洪水攻击。它使用 cookies 来验证连接请求,确保请求是合法的,而不是攻击者伪造的。
* **建议值** :1 表示启用。
> sysctl -w net.ipv4.tcp_syncookies=1
#### ******5. net.ipv4.tcp_keepalive_time = 600******
* **描述** :此选项控制 TCP 保活包发送的时间间隔(以秒为单位)。如果设置为 600,则在 600 秒(10 分钟)后开始发送保活包,以确认连接是否仍然有效。
* **建议值** :600 秒对于很多服务器来说是一个合理的值,可以避免频繁的保活包。
> sysctl -w net.ipv4.tcp_keepalive_time=600
#### ******6. net.ipv4.ip_local_port_range = 4000 65535******
* **描述** :此选项设置本地端口的使用范围。默认情况下,系统的本地端口范围是 32768-61000,设置此项可以扩大可用端口的范围,从而提高服务器在高并发情况下的并发连接能力。
* **建议值** :4000 65535,意味着本地端口的范围从 4000 到 65535。
> sysctl -w net.ipv4.ip_local_port_range="4000 65535"
#### ******7. net.ipv4.tcp_max_syn_backlog = 16384******
* **描述** :此选项指定服务器可以为 SYN 请求排队的最大数量。增大这个值可以增加在高并发情况下处理 TCP 三次握手请求的能力,特别是在 SYN 洪水攻击时,提供更多的缓冲区。
* **建议值** :16384,这是一个合理的值,能有效提升高并发时的连接请求处理能力。
> sysctl -w net.ipv4.tcp_max_syn_backlog=16384
#### ******8. net.ipv4.tcp_max_tw_buckets = 36000******
* **描述** :指定在 TIME_WAIT 状态下允许的最大连接数。如果系统的 TIME_WAIT 连接数超出该阈值,新的连接请求将被丢弃。增大该值可以减少系统因 TIME_WAIT 状态而丢弃连接的概率。
* **建议值** :36000,这是一个较为宽松的值,能容忍更多的 TIME_WAIT 状态。
> sysctl -w net.ipv4.tcp_max_tw_buckets=36000
#### ******9. net.ipv4.route.gc_timeout = 100******
* **描述** :此选项控制路由垃圾回收超时时间(以秒为单位)。当路由条目不再被使用时,系统会清除这些条目。减少该值可以提高路由表更新的频率,适应动态变化的路由环境。
* **建议值** :100 秒。
> sysctl -w net.ipv4.route.gc_timeout=100
#### ******10. net.ipv4.tcp_syn_retries = 1******
* **描述** :此选项控制系统在 TCP 连接尝试时的最大 SYN 重试次数。通常,系统会在握手失败时重新尝试连接。设置为 1 表示仅尝试一次,减少网络延迟。
* **建议值** :1,即仅重试一次。
> sysctl -w net.ipv4.tcp_syn_retries=1
#### ******11. net.core.somaxconn = 16384******
* **解释** : 这个参数控制系统对每个监听端口的最大排队连接数。它影响到listen()系统调用中backlog的最大值。默认情况下,somaxconn的值比较小,可能会导致大量的连接请求被丢弃。增加这个值可以帮助系统在高并发情况下更好地处理请求。
* **适用场景** : 需要处理大量并发TCP连接的场景,比如Web服务器。
#### ******12. net.core.netdev_max_backlog = 16384******
* **解释** : 这个参数控制网络接口(如网卡)接收队列的最大长度。它影响到网络接口接收数据包时的排队能力。增加此参数的值可以帮助缓解网络接口因处理过多数据包而导致的丢包问题。
* **适用场景** : 高负载网络环境,特别是在大规模的数据传输时。
#### ******13. net.ipv4.tcp_max_orphans = 16384******
* **解释** : 这个参数控制在系统中存在的最大未连接的TCP socket数量。一个未连接的socket指的是客户端或服务端在进行TCP连接时,在连接过程中未正式完成的socket。此参数可以避免系统中因过多的挂起连接而导致资源耗尽。
* **适用场景** : 高并发应用,尤其是在有大量半连接或者连接尚未完全建立的环境下。
#### ******14. net.ipvip_conntrack_max = 25000000******
* **解释** : 这个参数控制Linux内核在防火墙或NAT(网络地址转换)操作中,允许跟踪的最大连接数。防火墙和NAT会维护每个TCP连接的状态信息,设置较高的conntrack_max值,可以提高系统处理大量网络连接的能力。
* **适用场景** : 高并发网络连接环境,尤其是涉及大量并发连接的应用,如P2P或大规模Web应用。
#### ******15. net.ipv4.netfilter.ip_conntrack_max = 25000000******
* **解释** : 这个参数与ip_conntrack_max类似,但是它针对的是网络过滤(Netfilter)模块使用的连接追踪表大小。Netfilter是Linux内核的防火墙框架,用于包过滤、NAT等。提高这个参数可以增加防火墙所能追踪的连接数量,适用于防火墙负载较大的环境。
* **适用场景** : 高流量防火墙设置或者NAT负载较重的网络环境。
#### ******16. net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180******
* **解释** : 这个参数设置TCP连接在"已建立"状态下的连接追踪超时时间(单位为秒)。如果一个连接的活动时间超过了该值,它将被从连接追踪表中删除。默认值通常较短,增加这个值有助于保持长期的TCP连接,如Web服务器与客户端的长连接。
* **适用场景** : 长时间保持TCP连接的应用,如WebSocket、数据库连接池等。
#### ******17. net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120******
* **解释** : 这个参数控制TCP连接在"TIME_WAIT"状态下的连接超时时间。TIME_WAIT是TCP协议中的一个状态,表示连接已经关闭,但仍然等待足够的时间来确保所有数据包都正确传输。延长TIME_WAIT的超时时间有助于减少系统中TIME_WAIT状态的连接。
* **适用场景** : 防止大量的TIME_WAIT连接占用系统资源,特别是在高负载的服务器上。
#### ******18. net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60******
* **解释** : 这个参数设置TCP连接在"CLOSE_WAIT"状态下的超时时间。CLOSE_WAIT状态表示连接的关闭请求已经收到,但对端还没有关闭连接。调整该参数可以帮助及时回收连接资源。
* **适用场景** : 处理频繁的TCP连接关闭操作的系统。
#### ******19. net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120******
* **解释** : 这个参数控制TCP连接在"FIN_WAIT"状态下的连接超时时间。FIN_WAIT状态表示连接的一方已经发送了关闭请求(FIN包),但另一方尚未回应。调整该参数可以影响系统如何处理未完成关闭的连接。
*** ** * ** ***
#### ******总结配置:******
> sysctl -w net.ipv4.tcp_fin_timeout=2
>
> sysctl -w net.ipv4.tcp_tw_reuse=1
>
> sysctl -w net.ipv4.tcp_tw_recycle=1
>
> sysctl -w net.ipv4.tcp_syncookies=1
>
> sysctl -w net.ipv4.tcp_keepalive_time=600
>
> sysctl -w net.ipv4.ip_local_port_range="4000 65535"
>
> sysctl -w net.ipv4.tcp_max_syn_backlog=16384
>
> sysctl -w net.ipv4.tcp_max_tw_buckets=36000
>
> sysctl -w net.ipv4.route.gc_timeout=100
>
> sysctl -w net.ipv4.tcp_syn_retries=1
>
> net.core.somaxconn = 16384
>
> net.ipv4.tcp_max_orphans = 16384
## **Nginx 模块及参数的详细解释**
|-----------------------------------------|-----------------------------------------------------|----------------------------------------------------------------------------------|
| ****模块名称**** | ****说明**** | ****示例**** |
| ngx_http_core_module | Nginx 核心模块,提供基本的 HTTP 功能和配置支持。 | worker_processes 4; 用于配置 Nginx 使用的工作进程数。 |
| ngx_http_access_module | 控制访问权限的模块,通过 IP 地址或其他条件来控制访问权限。 | deny 192.168.1.1; 阻止指定 IP 地址的访问。 |
| ngx_http_addition_module | 允许在响应中附加内容,用于动态地修改 HTTP 响应。 | add_header X-Frame-Options SAMEORIGIN; 在响应中添加 X-Frame-Options 头部。 |
| ngx_http_api_module | 提供 API 功能的模块。 | location /api { api; } 配置 API 路由。 |
| ngx_http_auth_basic_module | 支持基本认证的模块,通过用户名和密码保护资源。 | auth_basic "Restricted"; 启用基本认证,要求输入用户名和密码。 |
| ngx_http_auth_jwt_module | 支持通过 JWT (JSON Web Token) 实现认证的模块。 | auth_jwt "secret"; 使用 JWT 进行认证。 |
| ngx_http_auth_request_module | 支持通过外部请求进行认证的模块。 | auth_request /auth; 将认证请求转发给 /auth 路径。 |
| ngx_http_autoindex_module | 生成目录列表的模块,当目录没有 index.html 等文件时,会列出目录内容。 | autoindex on; 打开目录自动索引功能。 |
| ngx_http_browser_module | 根据浏览器的 User-Agent 提供不同的响应内容。 | if ($http_user_agent \~ "MSIE") { add_header X-Content-Type-Options nosniff; } |
| ngx_http_charset_module | 设置响应字符集的模块。 | charset UTF-8; 设置响应字符集为 UTF-8。 |
| ngx_http_dav_module | 用于支持 WebDAV 协议的模块,允许上传、下载和管理文件。 | dav_methods PUT DELETE MKCOL COPY MOVE; 配置 WebDAV 支持的 HTTP 方法。 |
| ngx_http_empty_gif_module | 返回一个 1x1 像素的空白 GIF 图像的模块,常用于占位或防止爬虫访问。 | location /empty.gif { empty_gif; } 返回一个空白 GIF 图像。 |
| ngx_http_f4f_module | 支持 F4F (FastCGI to FastCGI) 功能的模块。 | fastcgi_pass unix:/tmp/php-fpm.sock; 配置 FastCGI 后端服务器。 |
| ngx_http_fastcgi_module | 支持 FastCGI 协议的模块,用于连接 PHP、Perl 等动态语言的应用。 | fastcgi_pass 127.0.0.1:9000; 配置 FastCGI 服务器地址。 |
| ngx_http_flv_module | 提供对 FLV 视频格式的支持,允许流式传输 FLV 视频文件。 | location /video/ { flv; } 启用 FLV 文件的支持。 |
| ngx_http_geo_module | 根据客户端 IP 地址来设置变量,例如实现地理位置的限制。 | geo $country { default CN; 192.168.1.0/24 US; } 根据 IP 地址设置国家变量。 |
| ngx_http_geoip_module | 基于 GeoIP 数据库进行地理位置识别的模块。 | geoip_country /usr/share/GeoIP/GeoIP.dat; 根据 IP 地址识别国家。 |
| ngx_http_grpc_module | 支持 gRPC 协议的模块。 | grpc_pass grpc://localhost:50051; 配置 gRPC 服务器地址。 |
| ngx_http_gunzip_module | 支持解压 GZIP 压缩内容的模块。 | gunzip on; 启用 GZIP 解压缩功能。 |
| ngx_http_gzip_module | 支持压缩 HTTP 响应内容为 GZIP 格式的模块。 | gzip on; 启用 GZIP 压缩。 |
| ngx_http_gzip_static_module | 支持为静态文件启用 GZIP 压缩的模块。 | gzip_static on; 为静态文件启用 GZIP 压缩。 |
| ngx_http_headers_module | 设置 HTTP 响应头的模块。 | add_header X-Content-Type-Options nosniff; 设置响应头。 |
| ngx_http_hls_module | 支持 HLS (HTTP Live Streaming) 的模块。 | hls on; 开启 HLS 支持。 |
| ngx_http_image_filter_module | 图像处理模块,可以对图像进行裁剪、缩放等操作。 | image_filter resize 320 240; 对图像进行缩放操作。 |
| ngx_http_index_module | 配置默认的索引文件,例如 index.html。 | index index.html; 设置默认文件为 index.html。 |
| ngx_http_internal_redirect_module | 支持内部重定向的模块,可以在不发起新的请求的情况下重定向请求。 | error_page 404 = /404.html; 配置内部重定向到自定义页面。 |
| ngx_http_js_module | 支持 JavaScript 的模块,用于更复杂的 HTTP 请求处理。 | js_include some_script.js; 包含 JavaScript 文件。 |
| ngx_http_keyval_module | 支持通过键值对设置变量的模块。 | set $var value; 设置一个变量。 |
| ngx_http_limit_conn_module | 限制连接数的模块。 | limit_conn_zone $binary_remote_addr zone=addr:10m; 限制每个客户端的连接数。 |
| ngx_http_limit_req_module | 限制请求速率的模块。 | limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s; 限制请求频率。 |
| ngx_http_log_module | 提供日志记录功能的模块,常用于访问日志和错误日志。 | access_log /var/log/nginx/access.log; 配置访问日志。 |
| ngx_http_map_module | 根据条件设置变量值的模块,例如根据请求头或 URL 动态决定响应内容。 | map $http_ua $blocked { default 0; "BadBot" 1; } 根据 User-Agent 判断是否屏蔽访问。 |
| ngx_http_memcached_module | 支持连接 Memcached 的模块。 | memcached_pass 127.0.0.1:11211; 配置 Memcached 服务器地址。 |
| ngx_http_mirror_module | 支持请求镜像的模块,用于调试或故障排查。 | mirror /mirror; 启用请求镜像功能。 |
| ngx_http_mp4_module | 支持 MP4 视频流的模块,通常用于播放 MP4 格式的视频文件。 | mp4; 启用 MP4 文件流支持。 |
| ngx_http_oidc_module | 支持 OpenID Connect 的认证模块。 | oidc_provider http://oidc.example.com; 配置 OpenID Connect 提供者。 |
| ngx_http_perl_module | 支持 Perl 脚本处理的模块。 | perl_set $foo 'sub { return 42; }'; 设置 Perl 脚本变量。 |
| ngx_http_proxy_module | 支持反向代理的模块,将请求转发到后端服务器。 | proxy_pass http://backend; 配置代理服务器地址。 |
| ngx_http_proxy_protocol_vendor_module | 支持 Proxy Protocol 协议的模块。 | proxy_protocol on; 启用 Proxy Protocol 支持。 |
| ngx_http_random_index_module | 提供随机选择索引文件的模块。 | random_index on; 启用随机索引文件选择功能。 |
| ngx_http_realip_module | 通过 X-Real-IP 或 X-Forwarded-For 等头部获取客户端真实 IP 地址的模块。 | real_ip_header X-Forwarded-For; 配置获取真实 IP 地址的请求头部。 |
| ngx_http_referer_module | 用于访问控制和检查 HTTP Referer 头的模块。 | referer_check www.example.com; 检查 Referer 是否来自特定域名。 |
| ngx_http_rewrite_module | 进行 URL 重写的模块。 | rewrite \^/oldpage$ /newpage permanent; 将旧 URL 重写为新 URL。 |
| ngx_http_scgi_module | 支持 SCGI 协议的模块。 | scgi_pass 127.0.0.1:4000; 配置 SCGI 服务器地址。 |
| ngx_http_secure_link_module | 支持安全链接的模块,用于生成和验证带有签名的 URL。 | secure_link $arg_st $arg_e; 使用 URL 中的参数验证链接。 |
| ngx_http_session_log_module | 提供会话日志记录的模块。 | session_log /var/log/nginx/session.log; 配置会话日志。 |
| ngx_http_slice_module | 支持将大文件切片的模块,常用于大文件下载。 | slice 1m; 将响应内容切片为 1MB 大小。 |
| ngx_http_split_clients_module | 用于将请求分发到不同的服务器或路径的模块。 | split_clients $remote_addr $key { 0.5% /path1; 99.5% /path2; } 根据客户端地址分流请求。 |
| ngx_http_ssi_module | 支持服务器端包含 (SSI) 的模块,通常用于动态生成网页内容。 | ssi on; 启用服务器端包含功能。 |
| ngx_http_ssl_module | 提供 HTTPS 支持的模块,用于加密 HTTP 流量。 | ssl_certificate /path/to/certificate.crt; 配置 SSL 证书。 |
| ngx_http_status_module | 提供服务器状态信息的模块。 | location /status { stub_status on; } 显示 Nginx 服务器状态信息。 |
| ngx_http_stub_status_module | 提供简要的服务器状态信息的模块。 | location /status { stub_status on; } 显示 Nginx 服务器状态信息。 |
| ngx_http_sub_module | 支持在响应中进行内容替换的模块。 | sub_filter 'old' 'new'; 在响应中替换文本。 |
| ngx_http_upstream_module | 配置后端服务器组,支持负载均衡和故障转移。 | upstream backend { server 127.0.0.1:8080; server 127.0.0.1:8081; } 配置负载均衡的后端服务器。 |
| ngx_http_upstream_conf_module | 提供更细粒度的后端服务器配置选项。 | upstream backend { server 127.0.0.1:8080 weight=3; } 配置权重负载均衡。 |
| ngx_http_upstream_hc_module | 提供后端服务器健康检查功能。 | upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; } 配置健康检查。 |
| ngx_http_userid_module | 提供用户 ID 功能的模块。 | userid on; 启用用户 ID 功能。 |
| ngx_http_uwsgi_module | 支持 uWSGI 协议的模块,通常用于与 Python 应用连接。 | uwsgi_pass 127.0.0.1:4000; 配置 uWSGI 服务器地址。 |
| ngx_http_v2_module | 支持 HTTP/2 协议的模块。 | http2 on; 启用 HTTP/2 协议。 |
| ngx_http_v3_module | 支持 HTTP/3 协议的模块。 | http3 on; 启用 HTTP/3 协议。 |
| ngx_http_xslt_module | 提供对 XSLT 转换的支持。 | xslt_stylesheet /styles/style.xsl; 应用 XSLT 样式表。 |
| ngx_mail_core_module | Nginx 邮件模块的核心功能,支持 POP3、IMAP、SMTP 等邮件协议。 | mail { server { listen 25; } } 配置邮件服务器。 |
| ngx_mail_auth_http_module | 通过 HTTP 实现邮件认证的模块。 | auth_http http://auth.example.com; 配置邮件认证 HTTP 请求。 |
| ngx_mail_proxy_module | 支持邮件代理功能的模块。 | proxy_pass smtp://127.0.0.1:25; 配置邮件代理。 |
| ngx_mail_realip_module | 获取真实客户端 IP 地址的模块,适用于邮件代理。 | real_ip_header X-Real-IP; 配置邮件的真实 IP 获取。 |
| ngx_mail_ssl_module | 提供邮件协议的 SSL/TLS 加密支持。 | ssl_certificate /path/to/certificate.crt; 配置邮件 SSL 证书。 |
| ngx_mail_imap_module | 支持 IMAP 协议的邮件模块。 | imap_pass 127.0.0.1:1143; 配置 IMAP 服务器地址。 |
| ngx_mail_pop3_module | 支持 POP3 协议的邮件模块。 | pop3_pass 127.0.0.1:110; 配置 POP3 服务器地址。 |
| ngx_mail_smtp_module | 支持 SMTP 协议的邮件模块。 | smtp_pass 127.0.0.1:25; 配置 SMTP 服务器地址。 |
| ngx_stream_core_module | Nginx 流式数据传输模块,支持 TCP/UDP 等协议。 | stream { server { listen 12345; proxy_pass 127.0.0.1:54321; } } 配置流式代理。 |
| ngx_stream_access_module | 用于限制流式连接的模块。 | allow 192.168.1.0/24; deny all; 限制访问流式服务的 IP 地址。 |
| ngx_stream_geo_module | 用于流式协议中的地理位置相关配置。 | geo $geoip_country { default CN; 192.168.1.0/24 US; } 配置流式协议中的地理位置。 |
| ngx_stream_geoip_module | 基于 IP 地址的地理位置识别模块,适用于流式协议。 | geoip_country /path/to/GeoIP.dat; 基于 IP 地址配置地理位置。 |
| ngx_stream_js_module | 用于流式协议中的 JavaScript 支持。 | js_include stream_script.js; 配置流式协议中的 JavaScript 文件。 |
| ngx_stream_keyval_module | 用于在流式协议中设置键值对变量的模块。 | set $stream_key value; 配置流式协议中的键值变量。 |
| ngx_stream_limit_conn_module | 用于限制流式连接的模块。 | limit_conn_zone $binary_remote_addr zone=conn_limit:10m; 限制流式连接数。 |
| ngx_stream_log_module | 用于记录流式协议的日志。 | access_log /var/log/nginx/stream_access.log; 配置流式协议的日志。 |
| ngx_stream_map_module | 用于流式协议中进行动态映射设置的模块。 | map $remote_addr $limit_conn { 192.168.1.1 10; default 5; } 配置流式连接的限制。 |
| ngx_stream_mqtt_preread_module | 支持 MQTT 协议预读取的模块。 | mqtt_preread on; 启用 MQTT 协议的预读取功能。 |
| ngx_stream_mqtt_filter_module | 用于流式协议中的 MQTT 协议过滤功能。 | mqtt_filter on; 启用 MQTT 协议的过滤功能。 |
| ngx_stream_pass_module | 用于流式代理的模块。 | proxy_pass tcp://127.0.0.1:8080; 配置流式代理服务器。 |
| ngx_stream_proxy_protocol_vendor_module | 支持 Proxy Protocol 协议的流式模块。 | proxy_protocol on; 启用 Proxy Protocol 支持。 |
| ngx_stream_realip_module | 用于流式协议获取真实客户端 IP 地址的模块。 | real_ip_header X-Real-IP; 配置流式协议获取真实 |