Nginx

开源项目网站: http://nginx.org/
商业化项目网站: https://nginx.com/
中文商业化项目网站: https://www.nginx-cn.net/
Tengine 官网 https://tengine.taobao.org/
下载页面: https://nginx.org/en/download.html
安装源配置页面: https://nginx.org/en/linux_packages.html

nginx数据流向

1 客户端(client)发起 HTTP/HTTPS 请求到 Nginx。
2 Nginx 的 Worker 进程通过多路复用技术接收请求,根据请求类型和配置,使用相应模块(如ht_proxy、ht_fastcgi 等)进行处理。
3 如果请求需要与后端服务器(Backend)交互,Worker 进程通过指定协议(HTTP、FastCGI 等)将请求转发给后端服务器。
4 后端服务器处理请求后返回响应,Nginx 的 Worker 进程接收响应,若配置了 Proxy Cache,会根据缓存策略决定是否缓存响应,最后将响应返回给客户端。

文件描述符相关扩展

1 整个系统可打开的文件描述符总数上限
[root@ubuntu ~]# cat /proc/sys/fs/file-max
9223372036854775807
2 单个进程能打开的文件描述符最大数量
[root@ubuntu ~]# cat /proc/sys/fs/nr_open
1048576
3 每个进程都有软限制,界定当前进程可打开文件描述符数量上限
[root@ubuntu ~]# ulimit -n
1024
4 硬限制是软限制能达到的最大值,普通用户无法自行提高,需 root 权限修改。
[root@ubuntu ~]# ulimit -Hn
1048576

Nginx安装

Ubuntu系统软件安装

查看软件
root@ubuntu24:~# apt list nginx -a
root@ubuntu24:~# apt install nginx -y
注意:
  默认情况下会安装 nginx-common软件包,所以我们需要额外安装 nginx-core fcgiwrap nginx-doc
推荐安装命令
root@ubuntu24:~# apt install nginx nginx-core fcgiwrap nginx-doc
查看服务状态
root@ubuntu24:~# systemctl is-active nginx
active
root@ubuntu24:~# netstat -tnulp | grep nginx
tcp     0    0 0.0.0.0:80    0.0.0.0:*   LISTEN    5516/nginx: master
tcp6    0    0 :::80       :::*      LISTEN    5516/nginx: master
配置文件目录
root@ubuntu24:~# ls /etc/nginx/
默认首页
root@ubuntu24:~# ls /var/www/html/
查看版本信息
root@ubuntu24:~# nginx -V
注意:
  如果无法正常访问web页面的话,那么有可能是防火墙导致的
root@ubuntu24:~# systemctl disable --now ufw.service

Rocky/CentOS系列系统安装

查看软件
[root@rocky9 ~]# yum list nginx
软件安装
[root@rocky9 ~]# yum install nginx nginx-core -y
注意:
  默认情况下,会安装依赖包nginx-core、nginx-filesystem、rocky-logos-httpd
查看nginx的状态
[root@rocky9 ~]# systemctl is-active nginx
设置为开机自启动
[root@rocky9 ~]# systemctl enable --now nginx
配置文件目录
Rocky系统
[root@rocky9 ~]# ls /etc/nginx/
默认首页
[root@rocky9 ~]# ls /usr/share/nginx/html/

源码编译安装(Ubuntu示例)

编译环境准备
apt install build-essential gcc g++ libc6 libc6-dev libpcre3 libpcre3-dev libssl-dev libsystemd-dev zlib1g-dev

apt install libxml2 libxml2-dev libxslt1-dev php-gd libgd-dev geoip-database libgeoip-dev
注意:
  第二条编译环境内容是 默认二进制环境开启功能所依赖的库环境
如果是CentOS/Rocky系列系统,需要安装如下编译所需软件
rocky9系统
yum install gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-
devel systemd-devel zlib-devel
yum install libxml2 libxml2-devel libxslt libxslt-devel php-gd gd-devel

创建运行用户
root@ubuntu24:~# useradd -r -s /usr/sbin/nologin nginx
下载最新版源码并解压
root@ubuntu24:~# wget https://nginx.org/download/nginx-1.22.1.tar.gz
定制配置
root@ubuntu24:~# tar xf nginx-1.22.1.tar.gz
root@ubuntu24:~# cd nginx-1.22.1/
root@ubuntu24:nginx-1.22.1# ./configure --prefix=/data/server/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
编译安装
root@ubuntu24:nginx-1.22.1# make && make install
确认效果
修改目录属主属组并查看
root@ubuntu24:nginx-1.22.1# chown -R nginx:nginx /data/server/nginx/
查看目录结构
root@ubuntu24:nginx-1.22.1# ls -l /data/server/nginx/
total 16
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 conf #配置文件目录
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 html #网站文件根目录
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 logs #日志文件目录
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 sbin #二进制程序目录
创建软链接
root@ubuntu24:nginx-1.22.1# ln -sv /data/server/nginx/sbin/nginx /usr/sbin/nginx
查看版本
root@ubuntu24:nginx-1.22.1# nginx -v
nginx version: nginx/1.22.1
定制专属管理
创建PID 目录
root@ubuntu24:~# mkdir /data/server/nginx/run
root@ubuntu24:~# chown -R nginx:nginx /data/server/nginx/run

修改配置文件,设置pid文件路径
root@ubuntu24:~# cat /data/server/nginx/conf/nginx.conf
pid   /data/server/nginx/run/nginx.pid;
定制服务文件 - 注意:如果pid文件路径不一样,会导致nginx服务无法启动
创建nginx服务脚本
root@ubuntu24:~# cat /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/data/server/nginx/run/nginx.pid
ExecStart=/data/server/nginx/sbin/nginx -c /data/server/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target

重载服务脚本
root@ubuntu24:~# systemctl daemon-reload
用服务启动
root@ubuntu24:~# systemctl start nginx
查看状态
root@ubuntu24:~# systemctl status nginx.service

Nginx命令

root@ubuntu24:~# nginx -h
nginx version: nginx/1.24.0 (Ubuntu)
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
      [-e filename] [-c filename] [-g directives]
常用选项
    v     #显示版本信息
    t     #检查并测试配置文件
一般选项
    ?|-h  #显示帮助信息
    V     #显示版本信息和编译项
    T     #检查并测试配置文件,且输出配置文件内容
    q     #在配置文件测试期间禁止显示非错误消息
    s signal  #发送信号 stop|quit|reopen|reload
    p prefix  #指定运行目录,默认是 /usr/share/nginx/
    c filename #指定配置文件,默认是 /etc/nginx/nginx.conf
    g directive #启动时指定一些全局配置项,而不用修改配置文件,格式为 k v
信号说明
  stop   #立即停止,没处理完的请求也会被立即断开,相当于信号 SIGTERM,SIGINT
  quit   # 优雅退出,不再接收新的请求,但己建立的连接不受影响,相当于信号 SIGQUIT
  reopen #重开一个新的日志文件,日志内容写新文件,相当于信号 SIGUSR1
  reload  #重新加载配置文件,重新生成worker 进程,不中断正在处理的请求,
          #己建立的连接按旧配置处理,新连接用新配置处理
          #同 systemctl reload nginx
  SIGUSR2 #平滑升级二进制文件,适用于版本升级
  SIGWINCH #优雅的停止工作进程,适用于版本升级

Nginx配置

默认配置

root@ubuntu24:~# grep -Ev '#|^$' /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf; # 查看扩展的配置项
events {
    worker_connections 768; # 每个worker可以维持768个连接
   # 默认开启两个worker,并发数为 768*2
}
http {
    sendfile on;
    tcp_nopush on;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    ssl_prefer_server_ciphers on;
    access_log /var/log/nginx/access.log;
    gzip on;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
启动效果
root@ubuntu24:~# ps aux | grep nginx
root     2823  0.0  0.0  11156  1716 ?     Ss  13:05  0:00 nginx: master
process /usr/sbin/nginx -g daemon on; master_process on;
www-data   2824  0.0  0.1  12936  4532 ?     S   13:05  0:00 nginx: worker
process
www-data   2825  0.0  0.1  12936  4404 ?     S   13:05  0:00 nginx: worker
process
结果显示:
  默认启动了两个进程
root@ubuntu24:~# pstree -p | grep nginx
     |-nginx(2823)-+-nginx(2824)
     |       `-nginx(2825)

配置文件格式

- 配置文件由指令与指令块构成
- 每条指令以 ; 分号结尾,指令与值之间以空格符号分隔
- 可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
- 指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
- include 语句允许组合多个配置文件以提升可维护性
- 使用 # 号添加注释,提高可读性
- 使用 $ 符号使用变量
- 变量分为 Nginx 内置变量和自定义变量,自定义变量用 set 指令定义
- 部分指令的参数支持正则表达式

nginx配置完整结构

# --- 全局配置段 ---
user ...;
worker_processes ...;
...
# --- 事件驱动相关的配置 ---
events {
   ...;
}
# --- http/https 协议相关配置段 ---
http {
 ...;
 server {
  ...;
  location {
   ...;
  }
 }
}
# --- mail 协议相关配置段,默认被注释 ---
mail {
 server {
   ...;
 }
}
# --- stream 协议相关配置 ---
stream {
  ...;
}

nginx7层负载配置示例

http{
    ...
    upstream app_servers{
        server ip1:port1;
        server ip2:port2;
        server ip3:port3;
    }
    server {
        ...
        location / {
            proxy_pass http://app_servers;
        }
    }

}

Nginx配置优化

cpu亲和性,将worker_cpu_affinity 参数设为auto
零拷贝,内核拷贝数据   sendfile on
gzip压缩优化
expires缓存
网络IO事件模型优化 epoll
隐藏软件名称和版本号
防盗链优化
禁止恶意域名解析
禁止通过IP地址访问网站
HTTP请求方法优化
防DOS攻击单IP并发连接的控制,与连接速率控制
严格设置web站点目录的权限
将nginx进程以及站点运行于监牢模式
通过robot协议以及HTTP_USER_AGENT防爬虫优化
配置错误页面根据错误码指定网页反馈给用户
nginx日志相关优化访问日志切割轮询,不记录指定元素日志、最小化日志目录权限
限制上传到资源目录的程序被访问,防止木马入侵系统破坏文件
FastCGI参数buffer和cache配置文件的优化
php.ini和php-fpm.conf配置文件的优化
有关web服务的Linux内核方面深度优化(网络连接、IO、内存等)
nginx加密传输优化(SSL)
web服务器磁盘挂载及网络文件系统的优化
使用nginx cache
https配置优化
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
打开文件缓存
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

优化配置参考

1. worker_processes 8;
  nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。
2. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
  为每个进程分配cpu,上例中将8 个进程分配到8 个cpu,当然可以写多个,或者将一个进程分配到多个cpu。
3. worker_rlimit_nofile 65535;
  这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
  现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。 这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
4. use epoll
5. worker_connections 65535
每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections。
6. keepalive_timeout 60;
7.  client_header_buffer_size 4k;
客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k
8. open_file_cache max=65535 inactive=60s;
 这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
9. open_file_cache_valid 80s;
  这个是指多长时间检查一次缓存的有效信息。
10. open_file_cache_min_uses 1;
  open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。

Nginx处理location区块顺序

location = / {
# = 等号配置符,只匹配 / 这个路由
}
location /data {
 # 留空配置,会匹配有 /data 开始的路由,后续有匹配会往下匹配。
}
location ^~ /img/ {
# 注意 ^~ 配置,这里匹配到 /img/ 开始的话,直接就返回了。
}
location ~* .(png|gif|ico|jpg|jpeg)$ {
# 匹配以 png, gif, ico, jpg or jpeg 结尾的请求;这个通常用来设置图片的请求响应。
}
作者:于浩  创建时间:2025-05-28 11:59
最后编辑:于浩  更新时间:2026-07-12 22:32