一、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

  • 作用:

    1. 负载均衡

    2. 安全隔离

    3. 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 隐藏版本号

  1. 在http {} 区域中添加指令

server_tokens off;

然后重启服务进行验证

curl -I http://192.168.80.10

  1. 修改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 日志分割

目的:方便日志文件筛查管理

  1. 编辑/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 {} \;
  1. 赋予脚本执行权限

chmod +x /opt/fenge.sh
  1. 手动运行脚本测试

/opt/fenge.sh

检查日志文件是否已正确切割和重命名。

  1. 设置定时任务 使用crontab设置每天凌晨1点自动运行日志切割脚本:

crontab -e

添加以下行:

0 1 * * * /opt/fenge.sh

4.5 联接保持的超时时间

KeepAlive模式简介

HTTP的KeepAlive模式允许Web服务器在处理完一个请求后保持TCP连接处于打开状态。这样,如果同一客户端发送后续请求,服务器可以直接利用这个已打开的连接,而无需重新建立新的连接。然而,长时间保持连接会占用服务器资源,如果过多,可能会影响性能。

目的:为了优化用户的体验感。

  1. 编辑Nginx配置文件 使用vim或其他文本编辑器打开Nginx的配置文件:

vim /usr/local/nginx/conf/nginx.conf
  1. 设置KeepAlive超时http块中,设置keepalive_timeout参数来控制KeepAlive连接的超时时间:

keepalive_timeout 60 50;
  • 第一个参数(60秒)指定连接最多可以保持多长时间。设置为60秒可以确保与大多数浏览器的默认行为兼容。

  • 第二个参数(50秒)是可选的,用于设置响应头Keep-Alive: timeout=time中的时间值。这可以帮助浏览器在达到指定时间后主动关闭连接。 如果将第一个参数设置为0,则会禁用KeepAlive连接。

  1. 设置客户端请求头超时 设置client_header_timeout来指定客户端发送完整请求头的超时时间:

client_header_timeout 15;

如果在15秒内客户端没有发送完整的请求头,Nginx将返回HTTP 408(Request Timed Out)错误。

  1. 设置客户端请求体超时 设置client_body_timeout来指定客户端发送请求体的超时时间:

client_body_timeout 15;

如果在15秒内客户端没有发送任何请求体内容,Nginx同样会返回HTTP 408错误。

  1. 重启Nginx服务 保存并退出编辑器后,重启Nginx服务以使更改生效:

systemctl restart nginx

通过合理设置Nginx的超时参数,可以有效管理服务器资源,提高服务的稳定性和性能。确保这些设置与您的应用需求和客户端行为相匹配,以达到最佳效果。

4.6 更改Nginx进程数优化高并发性能

背景

在高并发场景下,为了保证服务器能够快速响应用户请求并避免阻塞,可能需要启动更多的Nginx工作进程。合理配置Nginx的工作进程数和CPU亲和性可以显著提升服务器的性能。

  1. 查看CPU核数 使用以下命令查看服务器的CPU物理核心数量:

nproc
  1. 查看当前Nginx进程数 运行以下命令查看当前Nginx主进程中包含的子进程数量:

ps aux | grep nginx
  1. 编辑Nginx配置文件 使用vim或其他文本编辑器打开Nginx的配置文件:

vim /usr/local/nginx/conf/nginx.conf
  1. 修改工作进程数 根据服务器的CPU核数调整worker_processes参数。通常情况下,这个数值可以设置为CPU总核数,但一般不超过8个:

worker_processes  2;  # 修改为CPU的总核数
  1. 设置CPU亲和性(可选) 如果希望进一步优化性能,可以通过设置worker_cpu_affinity参数将每个Nginx工作进程绑定到特定的CPU物理核心上。这样可以减少进程在不同核心间的切换,提高缓存命中率,从而提升性能:

worker_cpu_affinity 01 10;  # 当进程数为4时,可以设置为0001 0010 0100 1000

这里的数字是二进制表示,每一位对应一个CPU核心。例如,01表示第一个核心,10表示第二个核心。

  1. 重启Nginx服务 保存并退出编辑器后,重启Nginx服务以使更改生效:

systemctl restart nginx
  • 设置worker_processes时,应考虑服务器的内存和CPU资源,避免设置过高导致资源竞争。

  • 使用worker_cpu_affinity时,应根据实际的CPU核心布局和负载情况进行调整。

4.7 配置Nginx网页压缩

一、网页内容压缩

Nginx通过ngx_http_gzip_module模块提供了网页内容的压缩功能,有助于减少传输数据的大小,节约网站带宽,并提升用户的访问体验。

  1. 编辑Nginx配置文件 打开Nginx的配置文件:

    vim /usr/local/nginx/conf/nginx.conf
  2. 启用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;  # 指定压缩类型
  3. 重启Nginx服务 保存并退出编辑器后,重启Nginx服务以应用更改:

    systemctl restart nginx

二、网页图片大小压缩

Nginx通过http_image_filter_module模块提供了图片处理功能,可以实时缩放图片等。

  1. 安装依赖 安装gd-devel库,这是http_image_filter_module模块所依赖的:

    yum install -y gd-devel
  2. 重新编译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
  3. 配置图片压缩 在Nginx配置文件的server块中添加图片压缩规则:

    location ~* \.(jpg|gif|png)$ {
        image_filter resize 200 200;  # 按等比例缩小图像至指定大小
    }
  4. 测试配置

    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防盗链

  1. 编辑Nginx配置文件 打开Nginx的配置文件:

    vim /usr/local/nginx/conf/nginx.conf
  2. 添加防盗链规则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 错误页面。

  1. 重启Nginx服务 保存并退出编辑器后,重启Nginx服务以应用更改:

    systemctl restart nginx

网页准备:

Web源主机(192.168.80.10)配置:

  • game.jpgerror.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)模块的参数。

  1. 编辑FPM主配置文件 打开PHP-FPM的主配置文件:

    vim /usr/local/php/etc/php-fpm.conf

    确保pid参数指向正确的PID文件路径:

    pid = run/php-fpm.pid
  2. 编辑FPM池配置文件 打开具体的FPM池配置文件(例如www.conf):

    vim /usr/local/php/etc/php-fpm.d/www.conf
  3. 调整FPM进程管理参数 根据服务器性能和应用需求调整以下参数:

    • pm:进程管理方式,可选staticdynamicdynamic表示动态管理进程数量。

      pm = dynamic
    • pm.max_children:允许的最大子进程数。这个数值应根据服务器的内存大小和PHP脚本的资源消耗来设置。

      pm.max_children = 100
    • pm.start_servers:动态模式下启动时默认开启的进程数。它应该在pm.min_spare_serverspm.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
  4. 重启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_serverspm.min_spare_serverspm.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提供了burstnodelay参数。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_zonelimit_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_certificatessl_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,但功能相似

功能:访问控制,限制对资源的访问。 使用方法

  • 使用allowdeny指令定义允许或拒绝访问的规则。

  • 示例:allow 192.168.1.0/24; deny all; 仅允许来自192.168.1.0/24子网的访问。

7. HttpUpstreamModule

功能:实现负载均衡,管理后端服务器组。 使用方法

  • 使用upstream指令定义服务器组。

  • proxy_pass中引用该服务器组,Nginx会根据定义的算法(如轮询、最少连接等)分配请求。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐