Nginx入门
Nginx配置文件优化类别配置项描述性能优化gzip on;开启网页压缩性能优化expires 缓存时间;网页缓存性能优化keepalive_timeout 服务端超时时间 客户端超时时间;连接保持超时性能优化连接保持最大请求次数性能优化worker_processes(与服务器CPU数量相同或auto)工作进程数性能优化工作进程连接数性能优化工作进程打开文件数性能优化工作进程静态绑核性能优化us
一、Nginx安装
1、使用yum下载安装包安装
1.1 清空repo文件
使用rm -rf /etc/yum.repo.d/*命令把yum.repo.d目录下的repo文件全部删除
1.2 下载镜像源文件
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
1.3 配置nginx包
yum install -y epel-release
1.4 更新yum缓存
yum clean all && yum makecache
1.5 下载nginx
yum install -y nginx
1.6 启动并设置开机自启
systemctl start nginx
systemctl enable nginx
1.7 查看运行状态
systemctl status nginx
看到 active (running) 说明启动成功。
2、通过源码编译安装nginx
2.1 先配置好c语言环境
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel
2.2 上传nginx源码包
nginx-1.24.0.tar.gz源码包
2.3 使用自带./congfigure执行安装
通常跟:
--prefix=/usr/local/nginx指定安装目录
--user=nginx指定管理nginx服务的用户身份是nginx
--group=nginx指定管理nginx服务的管理组是nginx
--with-http_ssl_module指定开启原生ssl功能模块
2.4 创建nginx用户
使用-M -s选项限制用户目录和登录权限
2.5 make安装
##make是编译工具:主要负责把指定的安装方式翻译给系统,并指定make intasll进行执行安装。
make $$ make install
2.6 让系统能够管理nginx服务
cat > /etc/systemd/system/nginx.service << EOF [Unit] Description=The NGINX HTTP and reverse proxy server Documentation=http://nginx.org/en/docs/ After=syslog.target network-online.target remote-fs.target nss•lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target EOF
2.7 优化管理
创建软连接方便使用nginx -t进行报错筛查
#方便我们管理nginx这个服务(nginx应用服务自带了一个管理执行文件---》名字为nginx,存放的路径是/usr/local/nginx/sbin/nginx
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
2.8 校验
systemctl start nginx
systemctl status nginx
注意:关闭防火墙firewalld以免干扰启动
二、Nginx 服务功能的组成 (配置文件管理)
1、配置文件
目录:/usr/local/nginx/conf
记录着程序/服务启动时的运行标准,更改配置文件之后需要重启nginx
其中的nginx.conf是配置文件,nginx.conf.default是配置文件模板

1.1 全局区域
配置文件的最外层
1.2 http {} 区域
指的是用户使用http访问时,nginx遵守的处理标准
1.3 server {} 区域
指的是用户使用不同域名/ip/port来访问时,nginx不同的处理标准
1.4 location {} 区域
指的是根据用户给的访问路径来匹配不同页面
##--------全局区域--------##
#user nobody;
worker_processes 1; ##工作进程数量,表示nginx只允许创建一个子进程处理任务,和CPU核心数相关,最大只能设置为CPU核心数的2倍。例如:CPU核心数为4,那么最大子进程数量为8。
#error_log logs/error.log; ##日志文件
#error_log logs/error.log notice; ##日志文件
#error_log logs/error.log info; ##日志文件
#pid logs/nginx.pid; ##PID储存文件位置
events {
worker_connections 1024;
} ##事件管理,表示一个子进程同时最多只能处理1024个访问。最大数可以设置为65535。由于nginx限制最多只能处理20万并发数所以这里的数字最大设置为25000。
##--------http区域--------##
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;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
##--------server区域--------##
server {
listen 80; ##监听端口
server_name localhost; ##可以把localhost改为域名,然后在/etc/hosts文件中去同步更改。
#charset koi8-r; ##字符集 支持中文(UTF-8)
#access_log logs/host.access.log main; ##日志存储文件,host可以改成域名以便区分
##--------location区域--------##
location / {
root html;路径要添加带域名的位置
index index.html index.htm;
} ##用户访问的具体页面 /:站点根目录 表示./nginx/html/是网页文件的默认起始位置。访问不指定路径时打开的就是默认首页
2、日志文件
目录:/usr/local/nginx/logs/
2.1 nginx.pid文件
存放nginx的主进程PID
2.2 access.log文件
访问日志储存文件
2.3 error.log文件
报错日志储存文件
3、首页文件
目录:/usr/local/nginx/html
3.1 index.html文件
nginx的默认欢迎页
3.2 50x.html文件
是nginx访问错误页
4、执行文件
目录:/usr/local/nginx/sbin/nginx`
这就是 Nginx 的主可执行二进制文件,所有操作都靠它完成。
三、Nginz 反向代理和负载均衡
反向代理"代表服务端"。用户访问网站时,如果前面架了反向代理,用户以为自己连的是网站,实际连接的是 Nginx,它再把请求转给后面的真实服务器。
负载均衡 它的本质是反向代理的扩展——一台代理不够用,就多加几台后端服务器,反向代理按规则把请求分摊到各台机器上。
3.1 反向代理
-
定义:客户端无需配置,直接访问Nginx服务器,Nginx将请求转发到后端服务器,再将响应返回给客户端,隐藏了后端服务器的真实地址。proxy service
-
作用:
-
负载均衡
-
安全隔离
-
SSL终止
-
3.2 负载均衡
-
定义:通过反向代理将请求分发到多个后端服务器,分摊负载,提高系统吞吐量和可用性。
-
常用算法:load balance (BL)
-
轮询(默认):请求按顺序轮流分发到各服务器。
-
加权轮询:根据服务器权重分配请求,权重越高,接收请求越多。
-
IP哈希:基于客户端IP地址哈希,同一IP的请求固定到同一服务器,适合会话保持场景。
-
最少连接:将请求分发到当前连接数最少的服务器,适合请求处理时间差异大的场景。
-
总结:Nginx通过反向代理隐藏后端服务器,结合负载均衡算法实现请求分发,既能提升性能,又能增强系统可用性和安全性。
3.3 高可用
nginx结合keepalived共同完成高可用目的
目的:解决单点故障隐患
通过连接主nginx和备nginx组成一个热备组,使用服务器优先级(数字大小)来切换主备关系虚拟出一个VIP给域名解析,这个VIP会先给主nginx使用,然后使用ping来对nginx进行健康检查,当主nginx挂了VIP漂移到备nginx使用。触发漂移的规则是:VIP只会存在于优先级高的节点,nginx挂了之后优先级数值会自动降低,使其优先级低于备nginx,VIP就会进行漂移。
先安装keepalived
yum install -y keepalived下载安装
rpm -qc keepalived查看配置文件路径
vim /etc/keepalived/keepalived.conf进行配置更改
global_defs {
router_id nginx-master ##标识本机
script_user root
enable_script_security
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh" #健康检查脚本
interval 2
fall 2
rise 1
}
vrrp_instance NGINX {
state MASTER #主nginx 备用nginx是backup
interface ens33 #网卡名
virtual_router_id 42 #同一集群必须相同(1-255)
priority 100 #优先级 备用nginx优先级要低于100
advert_int 1
authentication {
auth_type PASS
auth_pass abc123 #VRRP认证密码,backup必须一致
}
track_script {
check_nginx
}
virtual_ipaddress {
192.168.110.100/24 dev ens33 label ens33:0 #VIP地址,keepalived会自动生成
}
}
vim /etc/keepalived/check_nginx.sh添加健康检查脚本
#!/bin/bash
countng=$(ps -C nginx --no-header | wc -l)
if [ $countng -eq 0 ]
then
/usr/sbin/nginx -c /etc/nginx/nginx.conf
sleep 3
counter=$(ps -C nginx --no-header | wc -l)
if [ $counter -eq 0 ]
then
systemctl stop keepalived
fi
fi
然后赋予执行权限
chmod +x /etc/keepalived/check_nginx.sh
3.4 反向代理操作
1. 添加一台反向代理
在location {} 区域中修改配置内容
示例:
location / {
proxy_pass http://192.168.111.102;
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;
}
2. 添加多台反向代理,默认轮询
在server {} 区域上面添加配置内容,再修改location {} 区域
示例:
upstream backend_servers {
server 192.168.111.101;
server 192.168.111.102;
}
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
3. 添加多台反向代理,加权轮询
在默认轮询的ip地址后加weight=n设置轮权
示例:
upstream backend_weighted {
server 192.168.111.101 weight=2;
server 192.168.111.102 weight=1;
}
location / {
proxy_pass http://backend_weighted;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
4. IP哈希
在upstream backend_server {} 区域中加ip_hash;
示例:
upstream backend_iphash {
ip_hash;
server 192.168.111.101;
server 192.168.111.102;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend_iphash;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
5. 最少连接
在upstream backend_server {} 区域中加least_conn;
示例:
upstream backend_leastconn {
least_conn;
server 192.168.111.101;
server 192.168.111.102;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend_leastconn;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
6. 健康检查与故障转移
配置后端服务器的健康检查参数,当服务器故障时⾃动跳过。
示例:
upstream backend_health {
server 192.168.111.101 max_fails=3 fail_timeout=30s;
server 192.168.111.102 max_fails=3 fail_timeout=30s backup;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend_health;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 超时设置
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
# 故障时尝试下⼀个服务器
proxy_next_upstream error timeout http_500 http_502 http_503;
proxy_next_upstream_tries 3;
}
}
四、Nginx优化
4.1 隐藏版本号
-
在http {} 区域中添加指令
server_tokens off;
然后重启服务进行验证
curl -I http://192.168.80.10
-
修改Nginx的源码文件
nginx.h路径vim /opt/nginx-1.12.0/src/core/nginx.h
#define NGINX_VERSION "1.1.1" // 修改为你想要的版本号 #define NGINX_VER "IIS/" NGINX_VERSION // 修改服务器类型,例如"IIS"
然后重新安装
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module make && make install
4.2 修改用户和组
在配置文件/usr/local/nginx/conf/nginx.conf最开头添加指令
user nginx nginx;
指定主和组,然后重启验证
ps aux | grep nginx
4.3 缓存时间
在location {} 区域中添加指令
expires 1d;
表示保存1天
4.4 日志分割
目的:方便日志文件筛查管理
-
编辑
/opt/fenge.sh文件,添加以下内容:
#!/bin/bash
# Filename: fenge.sh
day=$(date -d "-1 day" "+%Y%m%d") # 获取前一天的日期
logs_path="/var/log/nginx"
pid_path="/usr/local/nginx/logs/nginx.pid"
# 确保日志目录存在,如果不存在则创建
[ -d $logs_path ] || mkdir -p $logs_path
# 移动并重命名前一天的访问日志文件
mv /usr/local/nginx/logs/access.log ${logs_path}/xy101.com-access.log-$day
# 发送USR1信号给Nginx主进程,通知它重新打开日志文件
kill -USR1 $(cat $pid_path)
# 删除30天前的日志文件
find $logs_path -mtime +30 -exec rm -rf {} \;
-
赋予脚本执行权限
chmod +x /opt/fenge.sh
-
手动运行脚本测试
/opt/fenge.sh
检查日志文件是否已正确切割和重命名。
-
设置定时任务 使用
crontab设置每天凌晨1点自动运行日志切割脚本:
crontab -e
添加以下行:
0 1 * * * /opt/fenge.sh
4.5 联接保持的超时时间
KeepAlive模式简介
HTTP的KeepAlive模式允许Web服务器在处理完一个请求后保持TCP连接处于打开状态。这样,如果同一客户端发送后续请求,服务器可以直接利用这个已打开的连接,而无需重新建立新的连接。然而,长时间保持连接会占用服务器资源,如果过多,可能会影响性能。
目的:为了优化用户的体验感。
-
编辑Nginx配置文件 使用
vim或其他文本编辑器打开Nginx的配置文件:
vim /usr/local/nginx/conf/nginx.conf
-
设置KeepAlive超时 在
http块中,设置keepalive_timeout参数来控制KeepAlive连接的超时时间:
keepalive_timeout 60 50;
-
第一个参数(60秒)指定连接最多可以保持多长时间。设置为60秒可以确保与大多数浏览器的默认行为兼容。
-
第二个参数(50秒)是可选的,用于设置响应头
Keep-Alive: timeout=time中的时间值。这可以帮助浏览器在达到指定时间后主动关闭连接。 如果将第一个参数设置为0,则会禁用KeepAlive连接。
-
设置客户端请求头超时 设置
client_header_timeout来指定客户端发送完整请求头的超时时间:
client_header_timeout 15;
如果在15秒内客户端没有发送完整的请求头,Nginx将返回HTTP 408(Request Timed Out)错误。
-
设置客户端请求体超时 设置
client_body_timeout来指定客户端发送请求体的超时时间:
client_body_timeout 15;
如果在15秒内客户端没有发送任何请求体内容,Nginx同样会返回HTTP 408错误。
-
重启Nginx服务 保存并退出编辑器后,重启Nginx服务以使更改生效:
systemctl restart nginx
通过合理设置Nginx的超时参数,可以有效管理服务器资源,提高服务的稳定性和性能。确保这些设置与您的应用需求和客户端行为相匹配,以达到最佳效果。
4.6 更改Nginx进程数优化高并发性能
背景
在高并发场景下,为了保证服务器能够快速响应用户请求并避免阻塞,可能需要启动更多的Nginx工作进程。合理配置Nginx的工作进程数和CPU亲和性可以显著提升服务器的性能。
-
查看CPU核数 使用以下命令查看服务器的CPU物理核心数量:
nproc
-
查看当前Nginx进程数 运行以下命令查看当前Nginx主进程中包含的子进程数量:
ps aux | grep nginx
-
编辑Nginx配置文件 使用
vim或其他文本编辑器打开Nginx的配置文件:
vim /usr/local/nginx/conf/nginx.conf
-
修改工作进程数 根据服务器的CPU核数调整
worker_processes参数。通常情况下,这个数值可以设置为CPU总核数,但一般不超过8个:
worker_processes 2; # 修改为CPU的总核数
-
设置CPU亲和性(可选) 如果希望进一步优化性能,可以通过设置
worker_cpu_affinity参数将每个Nginx工作进程绑定到特定的CPU物理核心上。这样可以减少进程在不同核心间的切换,提高缓存命中率,从而提升性能:
worker_cpu_affinity 01 10; # 当进程数为4时,可以设置为0001 0010 0100 1000
这里的数字是二进制表示,每一位对应一个CPU核心。例如,01表示第一个核心,10表示第二个核心。
-
重启Nginx服务 保存并退出编辑器后,重启Nginx服务以使更改生效:
systemctl restart nginx
-
设置
worker_processes时,应考虑服务器的内存和CPU资源,避免设置过高导致资源竞争。 -
使用
worker_cpu_affinity时,应根据实际的CPU核心布局和负载情况进行调整。
4.7 配置Nginx网页压缩
一、网页内容压缩
Nginx通过ngx_http_gzip_module模块提供了网页内容的压缩功能,有助于减少传输数据的大小,节约网站带宽,并提升用户的访问体验。
-
编辑Nginx配置文件 打开Nginx的配置文件:
vim /usr/local/nginx/conf/nginx.conf
-
启用Gzip压缩及相关优化 在
http块中添加或修改以下配置:gzip on; # 开启gzip压缩功能 gzip_min_length 1k; # 最小压缩文件大小 gzip_buffers 4 16k; # 压缩缓冲区设置 gzip_http_version 1.1; # 识别HTTP协议版本 gzip_comp_level 5; # 压缩比率设置 gzip_vary on; # 支持前端缓存服务器存储压缩页面 gzip_disable "MSIE [1-6]\."; # 禁用IE6及以下版本的gzip压缩 gzip_types text/plain text/javascript text/css text/xml application/x-javascript application/xml application/x-httpd-php application/javascript application/json image/jpeg image/gif image/png; # 指定压缩类型
-
重启Nginx服务 保存并退出编辑器后,重启Nginx服务以应用更改:
systemctl restart nginx
二、网页图片大小压缩
Nginx通过http_image_filter_module模块提供了图片处理功能,可以实时缩放图片等。
-
安装依赖 安装
gd-devel库,这是http_image_filter_module模块所依赖的:yum install -y gd-devel
-
重新编译Nginx 进入Nginx源码目录,并添加
http_image_filter_module模块,然后重新编译安装:cd /opt/nginx-1.12.0/ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_image_filter_module make && make install
-
配置图片压缩 在Nginx配置文件的
server块中添加图片压缩规则:location ~* \.(jpg|gif|png)$ { image_filter resize 200 200; # 按等比例缩小图像至指定大小 } -
测试配置
cd /usr/local/nginx/html 先将game.jpg文件传到/usr/local/nginx/html目录下 vim index.html ...... <img src="game.jpg"/>#网页中插入图片 </body> </html>
5.重启Nginx服务
systemctl restart nginx
在Linux系统中,打开火狐浏览器,右击点查看元素 选择 网络 ---> 选择 HTML、WS、其他 访问 http://192.168.80.10 ,双击200响应消息查看响应头中包含 Content-Encoding: gzip
注意:
Nginx的Gzip压缩功能虽然好用,但是下面两类文件资源不太建议启用此压缩功能。
-
图片/视频类型资源 原因:图片如jpg、png文件本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费资源。
-
大文件资源 原因:会消耗大量的cpu资源,且不一定有明显的效果。
4.8 配置Nginx防盗链
-
编辑Nginx配置文件 打开Nginx的配置文件:
vim /usr/local/nginx/conf/nginx.conf
-
添加防盗链规则 在
server块中针对图片文件类型(如jpg, gif, swf)添加以下配置:location ~* \.(jpg|gif|swf)$ { valid_referers none blocked *.xy101.com; if ($invalid_referer) { rewrite ^/ http://www.xy101.com/error.png; #return 403; } }
-
~* \.(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件。 -
valid_referers:设置信任的网站,可以正常使用图片。 -
none:表示无Referer值的情况。直接访问url,而不使用任何网站或链接的跳转,Referer值是空的。 -
blocked:表示Referer值被防火墙进行伪装。 -
*.xy101.com:表示允许请求访问资源的主机名,可以使用通配符"*"号。
这段配置的作用是检查HTTP请求头中的Referer字段,如果请求不是从指定的主机名或IP地址发起的,则拒绝该请求,即进行 write 地址重写或返回 403 错误页面。
-
重启Nginx服务 保存并退出编辑器后,重启Nginx服务以应用更改:
systemctl restart nginx
网页准备:
Web源主机(192.168.80.10)配置:
-
将
game.jpg和error.png文件放到/usr/local/nginx/html目录下。 -
编辑
index.html文件,添加图片链接:…… <img src="game.jpg"/> </body> </html>
-
更新
/etc/hosts文件,添加域名映射:echo "192.168.80.10 www.xy101.com" >> /etc/hosts
盗链网站主机(192.168.80.12)配置:
-
编辑
index.html文件,添加指向源站图片的链接:…… <img src="http://www.xy101.com/game.jpg"/> </body> </html>
-
更新
/etc/hosts文件,添加域名映射:echo "192.168.80.12 www.xy102.com" >> /etc/hosts
验证防盗链配置:
-
在盗图网站主机上打开浏览器,访问
http://www.xy102.com。 -
应该能看到原本应该显示的图片被替换成了
error.png,这表明防盗链配置成功。
4.9 FPM参数优化
为了提高PHP的处理速度,可以根据服务器的内存与服务负载调整FPM(FastCGI Process Manager)模块的参数。
-
编辑FPM主配置文件 打开PHP-FPM的主配置文件:
vim /usr/local/php/etc/php-fpm.conf
确保
pid参数指向正确的PID文件路径:pid = run/php-fpm.pid
-
编辑FPM池配置文件 打开具体的FPM池配置文件(例如
www.conf):vim /usr/local/php/etc/php-fpm.d/www.conf
-
调整FPM进程管理参数 根据服务器性能和应用需求调整以下参数:
-
pm:进程管理方式,可选static或dynamic。dynamic表示动态管理进程数量。pm = dynamic
-
pm.max_children:允许的最大子进程数。这个数值应根据服务器的内存大小和PHP脚本的资源消耗来设置。pm.max_children = 100
-
pm.start_servers:动态模式下启动时默认开启的进程数。它应该在pm.min_spare_servers和pm.max_spare_servers之间。pm.start_servers = 5
-
pm.min_spare_servers:动态模式下保持的最小空闲进程数。pm.min_spare_servers = 2
-
pm.max_spare_servers:动态模式下保持的最大空闲进程数。pm.max_spare_servers = 8
-
-
重启PHP-FPM服务 修改配置后,需要重启PHP-FPM服务以使更改生效:
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
使用以下命令检查FPM是否正在监听9000端口:
netstat -anpt | grep 9000
注意
-
参数调整应根据实际服务器性能和应用负载进行测试和优化。
-
pm.max_children的值不宜设置过高,以免消耗过多内存资源。 -
确保
pm.start_servers、pm.min_spare_servers和pm.max_spare_servers的设置合理,以维持服务的稳定性和响应速度。
4.10 Nginx限流★★★
Nginx限流是通过限制用户请求的速度来防止服务器过载的一种策略。 限流主要有三种方式:正常访问频率限制、突发访问频率限制和并发连接数限制。 Nginx的限流实现主要基于漏桶算法。
目的:降低服务器处理请求的压力
limit表示设置上限
一、正常访问频率限制(正常流量)
这种限流方式用于限制一个用户发送请求的频率。Nginx使用ngx_http_limit_req_module模块来实现这一功能,其原理是基于漏桶算法。 配置示例:
# 定义限流维度:一个用户一分钟只能发送一个请求
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
server {
location /seckill.html {
limit_req zone=one; # 应用限流维度
proxy_pass http://lj_seckill;
}
}
在这个配置中,1r/m表示每分钟允许一个请求。如果Nginx还有其他请求未处理,超出限制的请求将被拒绝。
二、突发访问频率限制(突发流量)
为了应对突发流量,Nginx提供了burst和nodelay参数。burst允许在短时间内处理超过设定速率的请求数量,而nodelay则指示Nginx立即处理这些突发的请求,而不是延迟处理。 配置示例:
# 定义限流维度,并设置burst和nodelay参数
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
server {
location /seckill.html {
limit_req zone=one burst=5 nodelay; # 允许突发处理最多5个请求
proxy_pass http://lj_seckill;
}
}
在这个配置下,Nginx会立即处理前五个突发请求,之后的请求将按照漏桶算法慢慢处理。
三、并发连接数限制
Nginx使用ngx_http_limit_conn_module模块来限制并发连接数。通过limit_conn_zone和limit_conn指令,可以设置单个IP和整个虚拟服务器的最大并发连接数。 配置示例:
http {
limit_conn_zone $binary_remote_addr zone=myip:10m; # 单个IP的并发连接数限制
limit_conn_zone $server_name zone=myServerName:10m; # 整个虚拟服务器的并发连接数限制
}
server {
location / {
limit_conn myip 10; # 单个IP最多允许10个并发连接
limit_conn myServerName 100; # 整个虚拟服务器最多允许100个并发连接
rewrite / http://www.lijie.net permanent;
}
}
这个配置确保了单个IP和整个服务器的并发连接数不会超过设定的上限。
总结以及补充
Nginx配置文件优化
| 类别 | 配置项 | 描述 |
|---|---|---|
| 性能优化 | gzip on; | 开启网页压缩 |
| 性能优化 | expires 缓存时间; | 网页缓存 |
| 性能优化 | keepalive_timeout 服务端超时时间 客户端超时时间; | 连接保持超时 |
| 性能优化 | keepalive_requests | 连接保持最大请求次数 |
| 性能优化 | worker_processes(与服务器CPU数量相同或auto) | 工作进程数 |
| 性能优化 | worker_connections | 工作进程连接数 |
| 性能优化 | worker_rlimit_nofile | 工作进程打开文件数 |
| 性能优化 | worker_cpu_affinity | 工作进程静态绑核 |
| 性能优化 | use epoll; | IO多路复用模型 |
| 性能优化 | sendfile on; tcp_nopush on; tcp_nodelay; | 启用内核复制模式 |
| 性能优化 | multi_accept on; | 连接优化,让工作进程可以尽可能多的接收连接请求 |
| 性能优化 | accept_mutex on; | 连接优化,以串行方式接入新连接,防止惊群问题 |
| 安全优化 | server_tokens off; | 隐藏版本号 |
| 安全优化 | valid_referers + if($invalid_referer) | 防盗链 |
| 安全优化 | deny 攻击主机的IP | 访问控制 |
| 安全优化 | use 用户名 组名; | 设置运行用户/组 |
| 安全优化 | limit_conn_zone + limit_conn | 限制连接数 |
| 安全优化 | limit_req_zone + limit_req | 限制请求速率 |
系统内核优化
| 文件 | 配置项 | 描述 |
|---|---|---|
| /etc/security/limits.conf | * soft nofile 65535 | 进程打开文件数限制 |
| /etc/security/limits.conf | * hard nofile 65535 | 进程打开文件数硬限制 |
| /etc/security/limits.conf | * soft nproc 65535 | 打开的系统进程数限制 |
| /etc/security/limits.conf | * hard nproc 65535 | 打开的系统进程数硬限制 |
| /etc/sysctl.conf | net.ipv4.tcp_syncookies=1 | 开启SYN Cookies |
| /etc/sysctl.conf | net.ipv4.tcp_tw_reuse=1 | 允许TIME-WAIT状态的套接字重新用于新的TCP连接 |
| /etc/sysctl.conf | net.ipv4.tcp_tw_recycle=0 | 禁用TIME-WAIT回收 |
| /etc/sysctl.conf | net.ipv4.tcp_fin_timeout=30 | 修改MSL值 |
| /etc/sysctl.conf | net.ipv4.tcp_keepalive_time=1200 | TCP发送探测消息的频率 |
| /etc/sysctl.conf | net.ipv4.ip_local_port_range="1024 65535" | 设置外向连接的端口范围 |
| /etc/sysctl.conf | net.ipv4.tcp_max_syn_backlog=8192 | 设置SYN队列长度 |
| /etc/sysctl.conf | net.ipv4.tcp_max_tw_buckets=5000 | 设置TIME-WAIT状态的最大连接数 |
| /etc/sysctl.conf | net.core.somaxconn=4096 | 设置TCP端口监听的最大连接队列长度 |
| /etc/sysctl.conf | net.ipv4.ip_forward=1 | 开启IP路由转发功能 |
五、Nginx常用模块
| 模块名称 | 描述 |
|---|---|
| http_stub_status_module | 访问状态统计模块 |
| http_rewrite_module | URL地址重写模块 |
| http_gzip_module | 网页压缩模块 |
| http_ssl_module | HTTPS安全加密模块 |
| http_access_module | 访问控制模块 |
| http_cache_module | Web网页缓存模块 |
| http_proxy_module | 代理转发模块 |
| http_upstream_module | 负载均衡模块 |
| http_limit_conn_module | 限制连接数模块 |
| http_limit_req_module | 限制请求速率模块 |
1. HttpProxyModule
功能:作为反向代理服务器,将客户端请求转发到后端服务器。 使用方法:
-
使用
proxy_pass指令指定后端服务器的地址和端口。 -
可配置负载均衡(如
proxy_pass http://backend;,其中backend是upstream模块定义的服务器组)。 -
可启用缓存、SSL/TLS加密等。
2. HttpRewriteModule
功能:URL重写和重定向。 使用方法:
-
使用
rewrite指令根据正则表达式匹配请求URI,并进行重写或重定向。 -
示例:
rewrite ^/some/(.*)$ /$1 last;将/some/example重写为/example。
3. HttpSSLModule
功能:支持SSL/TLS加密。 使用方法:
-
配置SSL证书、密码套件、协议版本等。
-
使用
listen 443 ssl;设置HTTPS监听端口,并通过ssl_certificate和ssl_certificate_key指定证书和密钥。
4. HttpGzipModule
功能:对响应进行压缩,减少传输数据量。 使用方法:
-
使用
gzip on;启用gzip压缩。 -
可配置压缩级别(如
gzip_comp_level 6;)、压缩类型等。
5. HttpCacheModule
注意:Nginx标准版中不直接包含名为HttpCacheModule的模块,但可通过proxy_cache等指令实现缓存功能
功能:缓存HTTP响应,减少服务器负载和响应时间。 使用方法:
-
使用
proxy_cache_path定义缓存目录和缓存参数。 -
在需要缓存的location中使用
proxy_cache指令启用缓存。
6. HttpAccessModule
注意:Nginx标准版中不直接称为HttpAccessModule,但功能相似
功能:访问控制,限制对资源的访问。 使用方法:
-
使用
allow和deny指令定义允许或拒绝访问的规则。 -
示例:
allow 192.168.1.0/24; deny all;仅允许来自192.168.1.0/24子网的访问。
7. HttpUpstreamModule
功能:实现负载均衡,管理后端服务器组。 使用方法:
-
使用
upstream指令定义服务器组。 -
在
proxy_pass中引用该服务器组,Nginx会根据定义的算法(如轮询、最少连接等)分配请求。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)