# Nginx优化

> 作者/来源: UCloud 运营管理员
> 发布时间: 2023-01-11T05:20:00.000Z
> 分类: CDN
> 标签: AI, 存储, 前端
> 原文链接: http://117.50.162.249:3000/yun/articles/1322

---

# Nginx优化

> 来源: https://www.ucloud.cn/yun/129618.html
> 作者: IT那活儿
> 发布日期: 发布于2023-01-11 13:20

Nginx优化

**点击上方“IT那活儿”，关注后了解更多内容，不管IT什么活儿，干就完了！！！**

nginx常作为反向代理或负载均衡服务，前端业务数据缓存服务，提高静态资源的高并发并利用反向代理加速。在此前提下，一般来说nginx的优化一般有本文中阐述的几项。

系统参数优化

**1. ulimit优化**

ulimit约束了系统最大打开的文件数量，可通过以下方式修改：

系统打开文件限制参数nofile以及系统打开进程数的限制参数nproc，建议两者都设置为65535。（使用ulimit -a验证）

```
echo "* soft nofile 65535" >> /etc/security/limits.confecho "* hard nofile 65535" >> /etc/security/limits.confecho "* soft nproc 65535" >> /etc/security/limits.confecho "* hard nproc 65535" >> /etc/security/limits.conf
```

**2. 内核参数优化**

将以下内核参数加入/etc/sysctl.conf文件中，执行sysctl -p使之生效。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129618/images/129618_000.png)

nginx配置优化

**1. 配置文件结构**

```
1)全局配置 2)事件驱动模型配置 events {     ...........     ........... } 3)http服务相关配置 http {     http服务全局配置     server { //虚拟主机     location { //匹配客户端访问请求，根据不同的请求做不同的响应         }     } }
```

**2. 全局配置**

1）启动工作进程的数量，worker\_processes  1;

（CPU密集型：如SSl及压缩应用，worker数量建议与CPU数量一致）

（IO密集型：如响应大量给客户，worker进程个数为CPU数量的两倍）

2）指定错误日志存放位置及日志级别 error\_log  logs/error.log warn;

3）指定pid文件记录nginx的主进程号 pid  logs/nginx.pid;

4）指定此进程打开的最大文件描述符的值 worker\_rlimit\_nofile 65535;

5）每个工作进程的核心文件的最大大小 worker\_rlimit\_core

6）将worker与CPU绑定，worker\_proceses  4;

worker\_cpu\_affinity 0001 0010 0100 1000。

（该示例表示分别给每个worker进程绑定一个CPU）

**3. 事件驱动模型配置**

1）指定epoll事件模型 use epoll;

2）每个工作进程能接受最大的客户端的连接数，提高并发连接 worker\_connections 10240。

**4. http服务相关配置**

1）include   mime.types; #文件扩展名与文件类型映射表；

2）default\_type  application/octet-stream; #默认文件类型，默认为text/plain；

3）定义访问日志格式。

```
log_format  main $remote_addr $remote_user [$time_local] "$request"                 $status $body_bytes_sent "$http_referer"                  "$http_user_agent" "$http_x_forwarded_for" "$http_cookie" "$request_time" "$upstream_response_time" "$upstream_addr" "$upstream_status";
```

- $remote\_addr #客户端IP地址
- $remote\_user #客户端用户
- $time\_local #访问时间
- $request #访问请求(请求方法   文件名称    HTTP协议版本)
- $status #状态码
- $body\_bytes\_sent #响应数据大小
- $http\_referer #超链接地址
- $http\_user\_agent #浏览器类型
- $http\_x\_forwarded\_for #客户真实IP
- $http\_cookie #获取cookie信息
- $upstream\_addr #后台upstream的地址，即真正提供服务的主机地址
- $upstream\_response\_time   #请求过程中，upstream响应时间
- $request\_time   #整个请求的总时间

**其他变量：**

- $host #存放请求报文中的主机部分 例：https://list.jd.com/list.html?cat=4938,11760,14408（值为标红部分）
- $request\_uri #存放请求的URI地址，并且带有请求指令 例：https://list.jd.com/list.html?cat=4938,11760,14408（值为标红部分）
- $scheme #存放客户端请求使用的协议，如http，https 例：https://list.jd.com/list.html?cat=4938,11760,14408（值为标红部分）
- $document\_uri #存放请求报文中的当前URI，并且不包括请求指令 例：https://list.jd.com/list.html?cat=4938,11760,14408（值为标红部分）
- $server\_addr #存放服务器地址
- $remote\_addr #存放客户端地址
- $server\_name #存放了客户端请求到达的服务器的名称
- $request\_filename #存放当前请求的资源文件的路径名
- $args #存放URL中的请求指令 例：https://list.jd.com/list.html?cat=4938,11760,14408（值为标红部分）

4）访问日志的存放位置

access\_log  logs/access.log  main;

5）客户端上传文件大小限制

client\_max\_body\_size 100m;

6）指定来自客户端请求头的headerbuffer大小

client\_header\_buffer\_size 32K;

#大多数请求1K的缓冲区即可，如果cookie较大可增加缓冲区大小。

7）指定客户端请求中较大的消息头的缓存最大数量和大小

large\_client\_header\_ buffers 4 32K;

# 4为个数，32K为大小，最大缓存为量为4个32K。

8）开启sendfile机制

sendfile on;

#该机制由内核直接将内容复制到nginx进程对应的内容，节省文件拷贝的时间。

9）#tcp\_nopush  on;

#仅在使用sendfile时开启，响应头和正文的开始部分一同发送。

10）#tcp\_nodelay  on;

#只在长连接中启用，用于减缓网络堵塞，但及建议不要与tcp\_nopush同时使用。

11）每条长连接的超时时间

keepalive\_timeout  65;

12）限制长连接所能发送的最大请求数

keepalive\_requests 100;

13）限制请求体的大小

client\_max\_body\_size 100m;

#若超过所设定的大小，返回413错误。

14）gzip压缩模块

- gzip  on; #开启压缩模块
- gzip\_min\_length 4K; #允许压缩的页面最小字节数，默认值为0（建议设置大于1K，小于1K可能越压越大）
- gzip\_buffers 4 16K; #用于处理请求压缩的缓冲区数量和大小，申请4个16K的内存作为数据流缓冲
- gzip\_http\_version 1.1; #用于设置识别http协议版本，默认为1.1
- gzip\_comp\_level 2; #用来指定压缩比，1压缩比最小处理速度最快，9压缩比最大，传输速度快，处理慢，同时较耗费CPU资源

15）对请求进行限速

limit\_req\_zone zone=one:10m rate=5r/s; #表示一个内存区域大小为10m,并且设定了名称为one，且请求的速率是1秒5个请求。

16）定义缓存空间

```
proxy_cache_path /nginx/cache/first  levels-2:1:2 keys_zone=first:20m max_size=1G;
```

levels-2:1:2 #定义缓存目录子目录的级别，以及每个子目录的名称字符个数；最多只能有三级子目录；

3级子目录，第1级目录字符个数为1，第2级目录字符个数为2，第3级目录字符个数为2，字符个数最多只能有2个；

/nginx/cache/first #在磁盘产生的目录存储缓存数据；

max\_size=1G #指定/nginx/cache/first中的1G空间用于存储缓存数据。

**5. server虚拟主机**

1）监听端口 listen   80;

2）设置虚拟主机名称 server\_name  localhost。

**6. location块**

1）自动索引模块HttpAutoindex

autoindex on; #当网页目录中没有index.html文件，该目录以下载网站的方式展现；

2）限制模块HttpLimit zone

该模块可以针对条件，进行会话的并发连接数控制。（例如：限制每个IP的并发连接数。）

```
http { limit_zone   one $binary_remote_addr  10m; server { location /download/ {      limit_conn   one 1; }
```

限制的区域名是one，容量是10M，以变量 $binary\_remote\_addr 作为会话的判断基准（即一个地址一个会话）。

$remote\_addr 的长度为 7 至 15 bytes，会话信息的长度为 32 或 64 bytes；

而 $binary\_remote\_addr 的长度为 4 bytes，会话信息的长度为 32 bytes。

当区的大小为 1M 的时候，大约可以记录 32000 个会话信息（一个会话占用 32 bytes）。

3）HttpLimitReqest模块

该模块可限制给定会话的请求数。

```
http { limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;    server {        location /search/ {            limit_req   zone=one burst=5; #允许用户平均每秒不超过1个请求，突发不超过5个查询        }    }}
```

4）StubStatus模块

该模块能够获取Nginx自上次启动以来的工作状态，此模块非核心模块，需要在编译的时候手动添加编译参数--with-http\_stub\_status\_module。

```
location /status {        stub_status on; #开启该模块        access_log off;        allow ***.***.230.1; #允许访问的ip地址        deny all; #拒绝所有ip地址访问}
```

5）proxy模块

- proxy\_pass http://itower;
- proxy\_redirect default; #默认配置为default，建议默认即可；如果设置off，则将禁止所有的proxy\_redirect指令；
- proxy\_buffering off;
- proxy\_connect\_timeout 600; #向后端服务器等待建立连接的超时时间; 单位s；
- proxy\_set\_header Host $host:$server\_port；
- proxy\_send\_timeout 600; #向后端服务器发送write请求时等待的超时时间; 单位s；
- proxy\_read\_timeout 600; #向后端服务器发送read请求时等待的超时时间; 单位s；
- proxy\_buffer\_size 8k; #用于配置接收一次后端服务器的响应数据的proxy buffer的个数和每个buffer的大小；
- proxy\_cache first; #开启缓存，结合http块中的proxy\_cache\_path使用；
- proxy\_cache\_vaild 200 1m; #表示为状态码为200的数据缓存1分钟，结合http块中的proxy\_cache\_path使用。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129618/images/129618_001.png)

## 本文作者：刘娜

## 本文来源：IT那活儿（上海新炬王翦团队）

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129618/images/129618_002.png)

​