关于nginx:安全开发运维必备如何进行Nginx代理Web服务器性能优化与安全加固配置看这篇指南就够了

2次阅读

共计 34874 个字符,预计需要花费 88 分钟才能阅读完成。

本章目录

1. 引言

  • 1.1 目标
  • 1.2 指标范畴
  • 1.3 读者对象

2. 参考阐明

  • 2.1 帮忙参考
  • 2.2 参数阐明
  • 3.3 模块阐明

3. 服务优化

  • 3.1 零碎内核
  • 3.2 编译优化
  • 3.3 性能优化
  • 3.4 经营优化
  • 3.5 配置优化

4. 平安配置

  • 0. 暗藏 nginx 服务及其版本
  • 1. 低权限用户运行服务
  • 2. 配置 SSL 及其会话复用
  • 3. 限度 SSL 协定与加密套件
  • 4. 拦挡垃圾信息
  • 5. 歹意扫描拦挡
  • 6. 禁用 WebDAV
  • 7. 禁用 Nginx 状态模块
  • 8. 敞开默认谬误页上的 Nginx 版本号
  • 9. 设置 client_body_timeout 超时
  • 10. 设置 client_header_timeout
  • 11. 设置 keepalive_timeout 超时
  • 12. 设置 send_timeout 超时
  • 13.Nginx 可用的办法应限度为 GET, HEAD, POST
  • 14. 管制并发连贯 limit_zone slimits
  • 15. 管制并发连贯 limit_conn slimits
  • 16. 主机防 webshell 跨目录浏览以及列目录
  • 17. 文件名解析破绽 php_info, 退出 fcgi.conf 即可
  • 18. 拜访权限管制 nginx
  • 19. 异样状态返回 200 暗藏 URL
  • 20. 平安模块的抉择
  • 21. 记录访问者实在 IP
  • 22. 地区拜访响应措施
  • 23. 资源防盗链设置
  • 24. 惯例平安响应头配置
  • 25. 避免非所属域名解析到服务器
  • 25. 限度指定客户端地址拜访

5. 配置阐明
6. 补充常识


<center>

订正管制页

版本 订正日期 订正人 订正摘要
1.0 2019 年 9 月 8 日 09 点 18 分 WeiyiGeek 初稿
2.0 2022 年 1 月 8 日 18 点 18 分 WeiyiGeek 裁减

</center>


前置基础知识学习

  • 1.Nginx 根底装置与配置具体 https://blog.weiyigeek.top/20…
  • 2.Nginx 进阶学习之最佳配置实际指南 https://blog.weiyigeek.top/20…
  • 3.Nginx 模块学习应用实际指南 https://blog.weiyigeek.top/20…
  • 4.Nginx 平安加固与性能调优最佳指南 https://blog.weiyigeek.top/20…
  • 5.Nginx 常遇问题入坑出坑整顿 https://blog.weiyigeek.top/20…

1. 引言

1.1 目标

为了更好的领导部署与测试艺术升零碎 nginx 网站服务器高性能同时下平安稳固运行, 须要对 nginx 服务进行调优与加固;

本次进行 Nginx 服务调优加固次要从以下几个局部:

  • 模块性能优化
  • 零碎内核优化
  • 编译装置优化
  • 性能参数优化
  • 平安加固配置
1.2 指标范畴

本文档仅供外部应用,禁止外传,帮忙研发人员,运维人员对系统长期稳固的运行提供技术文档参考。

1.3 读者对象

1) 项目经理
2) 开发人员
3) 测试人员
4) 运维人员
5) 相干领导


2. 参考阐明

2.1 帮忙参考

Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器。Nginx 作为负载平衡服务器, Nginx 既能够在外部间接反对 Rails 和 PHP 程序对外进行服务,也能够反对作为 HTTP 代理服务器对外进行服务。

Nginx 版本抉择:

  • Mainline version 最新版本, 举荐测试的业务我的项目的时候应用
  • Stable version 稳固版本, 举荐我的项目上线理论应用
  • Legacy versions 历史版本, 不举荐抉择可能存在脆弱性破绽

我的项目构造:

# 编译后的 nginx 我的项目结构造
/etc/nginx/
├── client_body_temp  #客户端下面的临时文件寄存目录
├── conf              #nginx 的配置文件寄存目录
├── fastcgi_temp      #fastcgi 的临时文件寄存目录
├── html              #寄存动态资源或者脚本文件的中央
├── logs              #nginx 日志文件
├── proxy_temp        #nginx 正向 / 反向代理缓存文件寄存目录
├── sbin              #nginx 可执行文件
├── scgi_temp         #scgi 长期文件目录
└── uwsgi_temp        #uwsgi 临时文件寄存目录

Nginx 文档帮忙: http://nginx.org/en/docs/
Nginx 首页地址目录: /usr/share/nginx/html
Nginx 配置文件:

  • /etc/nginx/nginx.conf
  • /usr/local/nginx/conf/nginx.conf
  • /usr/local/etc/nginx/nginx.conf

2.2 参数阐明

localtion 申请匹配的 url 实是一个正则表达式:

# 语法规定: 
location [=|~|~*|^~] /uri/ {...}

# 参数解析: 
= 示意准确匹配, 这个优先级也是最高的
/ 通用匹配,任何申请都会匹配到,默认匹配.
~ 示意辨别大小写的正则匹配
~* 示意不辨别大小写的正则匹配(和下面的惟一区别就是大小写) !~ 和!~* 别离为辨别大小写不匹配及不辨别大小写不匹配的正则
!~,!~* : 别离标识为辨别大小写不匹配及不辨别大小写不匹配的正则
^~ 示意 uri 以某个惯例字符串结尾,了解为匹配 url 门路即可。nginx 不对 url 做编码,因而申请为 /static/20%/aa,能够被规定 ^~ /static/ /aa 匹配到(留神是空格)

Nginx 匹配判断表达式:

-f 和 !-f: 用来判断是否存在文件
-d 和 !-d: 用来判断是否存在目录
-e 和 !-e: 用来判断是否存在文件或目录
-x 和 !-x: 用来判断文件是否可执行

例如, 匹配开端为如下后缀的动态并判断是否存在该文件, 如不存在则 404。

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {if (-f $request_filename) { 
    return 403;
    break;
  }
}

3.3 模块阐明

查看可用模块编译参数:http://nginx.org/en/docs/conf…

# 能够通过运行 "./configure --help" 查看编译帮忙,决定是否须要装置哪些模块, 比方上面的 ssi 模块可能实现拜访 shtml 页面
./configure -help

http_gzip 模块
开启 gzip 压缩输入(经常是大于 1kb 的动态文件),缩小网络传输;

gzip_min_length 1k #设置容许压缩的页面最小字节数页面字节数从 content-length 中进行获取, 默认值是 20
gzip_buffers 4 16k #设置零碎获取几个单位的缓存用于存储 gzip 的压缩后果数据流。4 16k 代表以 16k 为单位,装置原始数据大小以 16k 为单位的 4 倍申请内存。gzip_comp_level 2 #gzip 压缩比,其值从 1 到 9 数字越大压缩率越高,越耗费 CPU 负载也越高
gzip_types #匹配 mime 类型进行压缩,无论是否指定”text/html”类型总是会被压缩的,举荐配置:`gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript。`
gzip_http_version 1.0 #用于辨认 http 协定的版本晚期的浏览器不反对 Gzip 压缩,用户就会看到乱码,所以为了反对后期版本加上了这个选项; 如果你用了 Nginx 的反向代理并冀望也启用 Gzip 压缩的话,因为末端通信是 http/1.0,故请设置为 1.0。gzip_proxied any #Nginx 作为反向代理的时候启用,决定开启或者敞开后端服务器返回的后果是否压缩,匹配的前提是后端服务器必须要返回蕴含”Via”的 header 头。gzip_vary on #和 http 头有关系会在响应头加个 Vary: Accept-Encoding,能够让前端的缓存服务器缓存通过 gzip 压缩的页面,例如用 Squid 缓存通过 Nginx 压缩的数据。

http_fastcgi_module 模块
nginx 能够用来申请路由到 FastCGI 服务器运行应用程序由各种框架和 PHP 编程语言等。能够开启 FastCGI 的缓存性能以及将动态资源进行剥离,从而进步性能。

指令:fastcgi_temp_path  #定义 FastCGI 缓存文件保留长期门路。指令:fastcgi_cache_path  #定义 FastCGI 缓存文件保留门路和缓存的其它参数。缓存数据以二进制数据文件模式存储,缓存文件名和 key 都是通过对拜访 URL 应用 MD5 计算取得的后果。缓存文件先保留至 fastcgi_temp_path 指定的长期目录下,而后通过重命名操作移至 fastcgi_cache_path 指定的缓存目录。倡议 fastcgi_temp_path 和 fastcgi_cache_path 设为同一分区,同分区挪动操作效率更高。示例:fastcgi_temp_path /tmp/fastcgi_temp;
fastcgi_cache_path /tmp/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:16m inactive=30m max_size=1g;
# levels 指定了目录构造, 子目录数以 16 为基数;# keys_zone 指定了共享内存区名和大小,用于保留缓存 key 和数据信息;# inactive 指定了缓存数据保留的工夫,当这段时间内未被拜访将被移出;# max_size 指定了缓存应用的最大磁盘空间,超过容量时将最近起码应用数据删除。#示例中应用 /tmp/fastcgi_temp 作为 FastCGI 缓存的长期目录;/tmp/fastcgi_cache 作为 FastCGI 缓存保留的最终目录;一级子目录为 16 的一次方 16 个,二级子目录为 16 的 2 次方 256 个;共享内存区名为 cache_fastcgi,占用内存 128MB;缓存过期工夫为 30 分钟;缓存数据保留于磁盘的最大空间大小为 1GB。指令:fastcgi_cache_key        # 定义 FastCGI 缓存关键字。启用 FastCGI 缓存必须加上这个配置,不然拜访所有 PHP 的申请都为拜访第一个 PHP 文件 URL 的后果。指令:fastcgi_cache_valid      # 为指定的 Http 状态码指定缓存工夫。指令:fastcgi_cache_min_uses   # 指定通过多少次申请雷同的 URL 将被缓存。指令:fastcgi_cache_use_stale  # 指定当连贯 FastCGI 服务器产生谬误时,哪些状况应用过期数据回应。指令:fastcgi_cache            # 缓存应用哪个共享内存区

keepalive 模块
长连贯对性能有很大的影响,通过缩小 CPU 和网络开销须要开启或敞开连贯;

  • keepalive_timeout 闲长连贯放弃关上状态的工夫;
  • keepalive_requests 单个客户端长连贯能够申请的数量;
  • keepalive 上游服务器长连贯的相干指令,每个工作过程中闲暇长连贯到上游服务器放弃开启的连贯数量 (没有默认值)。
    要应用连贯到上游服务器的长连贯,必须要配置文件中上面的指令:

      proxy_http_version 1.1;
      proxy_set_header Connection "";

http_ssl_module 模块
Nginx 开启反对 Https 协定的 SSL 模块

#Nginx SSL 性能调优
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#留神这里的加密形式
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;


3. 服务优化

3.1 零碎内核

Linux 内核参数局部默认值不适宜高并发,Linux 内核调优,次要波及到网络和文件系统、内存等的优化,

  • 长期办法能够通过调整 /Proc 文件系统,须要留神调整 /Proc 文件系统零碎重启后还原至默认值(不举荐)。
  • 永恒批改 /etc/sysctl.conf 配置文件永恒保留

上面是我罕用的内核调优配置:

grep -q "net.ipv4.tcp_max_tw_buckets" /etc/sysctl.conf || cat >> /etc/sysctl.conf << EOF
########################################
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216

#缓冲区队列设置与连贯及其如何排队相干#
#调节零碎同时发动的 tcp 连接数,在高并发的申请中,默认的值可能会导致链接超时或者重传,因而须要联合并发申请数来调节此值。#net.core.somaxconn = 262144
#在提交到 CPU 前网卡中数据包缓冲的速率,高带宽下进步这个值可进步性能; 查看内核日志文件中无关这个设置的谬误,依据网卡文档中的倡议批改这个值。net.core.netdev_max_backlog = 262144
#设定零碎中最多有多少个 TCP 套接字不被关联到任何一个用户文件句柄上
net.ipv4.tcp_max_orphans = 262144
#用于记录那些尚未收到客户端确认信息的连贯申请的最大值(依据类才更改)
net.ipv4.tcp_max_syn_backlog = 1024

#设定 timewait 的数量默认是 180000 设为 10000。net.ipv4.tcp_max_tw_buckets = 10000

#在高并发状况端口值的起止范畴个别端口号设置是 1024 到 65000, 用来设定容许零碎关上的端口范畴;
net.ipv4.ip_local_port_range = 1024 65500

#用于设置启用 timewait 疾速回收
net.ipv4.tcp_tw_recycle = 1

#用于设置开启重用,容许将 TIME-WAIT sockets 从新用于新的 TCP 连贯。net.ipv4.tcp_tw_reuse = 1

#用于设置开启 SYN Cookies,当呈现 SYN 期待队列溢出时,启用 cookies 进行解决。net.ipv4.tcp_syncookies = 1

#决定了内核放弃连贯之前发送 SYN+ACK 包的数量。net.ipv4.tcp_synack_retries = 1
#示意在内核放弃建设连贯之前发送 SYN 包的数量。net.ipv4.tcp_syn_retries = 1
#决定了套接字放弃在 FIN-WAIT- 2 状态的工夫。默认值是 60 秒。#正确设置这个值十分重要,有时即便一个负载很小的 Web 服务器,也会呈现大量的死套接字而产生内存溢出的危险。net.ipv4.tcp_fin_timeout = 30
#选项示意当 keepalive 启用的时候,TCP 发送 keepalive 音讯的频度。默认值是 2(单位是小时)。net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_mem = 786432 1048576 1572864


#文件描述符零碎级别的限度#
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
vm.swappiness = 10
fs.aio-max-nr = 1048576
EOF
sysctl -p

文件描述符
文件描述符是操作系统资源,用于示意连贯、关上的文件,以及其余信息。NGINX 每个连贯能够应用两个文件描述符。
例如如果 NGINX 充当代理时,通常一个文件描述符示意客户端连贯,另一个连贯到代理服务器,如果开启了 HTTP 放弃连贯,这个比例会更低(译注:为什么更低呢)。

对于有大量连贯服务的零碎,上面的设置可能须要调整一下:

# 批改文件描述符形式
vim /etc/security/limits.conf
* - nofile 65536  #用户级别文件描述符限度

#而后进行启动文件批改
echo "ulimit -Hsn 65536" >> /etc/profile

3.2 编译优化

精简模块:Nginx 因为一直增加新的性能,附带的模块也越来越多, 倡议个别罕用的服务器软件 应用源码编译装置治理;

(1) 减小 Nginx 编译后的文件大小

  • 编译 Nginx 时默认以 debug 模式进行,而在 debug 模式下会插入很多跟踪和 ASSERT 之类的信息,编译实现后一个 Nginx 要有好几兆字节; 因而能够在编译之前,批改相干源码,勾销 debug 模式;

    # 找到源码目录下 auto/cc/gcc  文件 debug
    CFLAGS="$CFLAGS -g" #正文掉或删掉这两行,即可勾销 debug 模式。ls -alh /usr/local/nginx/sbin/nginx
    -rwxr-xr-x. 1 root root 915K Aug 17 09:49 /usr/local/nginx/sbin/nginx  #能够看到体积大大减少

(2) 指定 GCC 编译参数
批改 GCC 编译参数进步编译优化级别稳当起见采纳 -O2 这也是大多数软件编译举荐的优化级别。

  • Nginx 源码文件 auto/cc/gcc 搜寻 NGX_GCC_OPT 默认 GCC 编译参数为 -O,能够间接批改内容为 NGX_GCC_OPT="-O2" 或者在 ./configure 配置时增加 --with-cc-opt='-O2' 选项
--with-cc-opt='-O3'  #编译级别
--with-cpu-opt=CPU   #为特定的 CPU 编译,无效的值包含:pentium, pentiumpro, pentium3, # pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64

GCC 编译参数优化 [可选项] 总共提供了 5 级编译优化级别:

  • -O0: 无优化。
  • - O 和 -O1: 应用能缩小指标代码尺寸以及执行工夫并且不会使编译工夫明显增加的优化,在编译大型程序的时候会显著减少编译时内存的应用。
  • -O2: 蕴含 -O1 的优化并减少了不须要在指标文件大小和执行速度上进行折衷的优化。编译器不执行循环展开以及函数内联。此选项将减少编译工夫和指标文件的执行性能。
  • -Os: 能够看成 -O2.5,专门优化指标文件大小,执行所有的不减少指标文件大小的 -O2 优化选项,并且执行专门减小指标文件大小的优化选项。实用于磁盘空间缓和时应用。但有可能有未知的问题产生,况且目前硬盘容量很大,罕用程序无必要应用。
  • -O3: 关上所有 -O2 的优化选项外减少 -finline-functions、-funswitch-loops、-fgcse-after-reload 优化选项。绝对于 -O2 性能并未有较多进步,编译工夫也最长,生成的指标文件也更大更占内存,有时性能不增反而升高,甚至产生不可预知的问题(包含谬误),所以并不被大多数软件装置举荐,除非有绝对把握方可应用此优化级别。

罕用编译参数:

# 编译 0: 惯例编译参数
configure arguments: 
#装置的目录或者门路#
--prefix=/etc/nginx 
--sbin-path=/usr/sbin/nginx 
--modules-path=/usr/lib64/nginx/modules 
--conf-path=/etc/nginx/nginx.conf 
--error-log-path=/var/log/nginx/error.log 
--http-log-path=/var/log/nginx/access.log 
--pid-path=/var/run/nginx.pid 
--lock-path=/var/run/nginx.lock
#执行对应模块 nginx 所保留的临时文件#
--http-client-body-temp-path=/var/cache/nginx/client_temp 
--http-proxy-temp-path=/var/cache/nginx/proxy_temp 
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 
--http-scgi-temp-path=/var/cache/nginx/scgi_temp 
#启动的用户和组用户#
--user=nginx 
--group=nginx 
#模块参数#
--with-compat 
--with-file-aio 
--with-threads 
--with-http_addition_module 
--with-http_auth_request_module 
--with-http_dav_module 
--with-http_flv_module 
--with-http_gunzip_module 
--with-http_gzip_static_module 
--with-http_mp4_module 
--with-http_random_index_module 
--with-http_realip_module 
--with-http_secure_link_module 
--with-http_slice_module 
--with-http_ssl_module 
--with-http_stub_status_module 
--with-http_sub_module 
--with-http_v2_module 
--with-mail 
--with-mail_ssl_module 
--with-stream 
--with-stream_realip_module 
--with-stream_ssl_module 
--with-stream_ssl_preread_module
#设置额定的参数将被增加到 CFLAGS#
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' 
#设置附件参数, 链接零碎库#
-with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'


#编译 1: 除多余模块
./configure \
"--prefix=/App/nginx" \ 
"--user=nginx" \ 
"--group=nginx" \
"--with-http_stub_status_module" \
"--without-http_auth_basic_module" \
"--without-http_autoindex_module" \
"--without-http_browser_module" \
"--without-http_empty_gif_module" \
"--without-http_geo_module" \
"--without-http_limit_conn_module" \
"--without-http_limit_req_module" \
"--without-http_map_module" \
"--without-http_memcached_module" \
"--without-http_proxy_module" \
"--without-http_referer_module" \
"--without-http_scgi_module" \
"--without-http_split_clients_module" \
"--without-http_ssi_module" \
"--without-http_upstream_ip_hash_module" \
"--without-http_upstream_keepalive_module" \
"--without-http_upstream_least_conn_module" \
"--without-http_userid_module" \
"--without-http_uwsgi_module" \
"--without-mail_imap_module" \
"--without-mail_pop3_module" \
"--without-mail_smtp_module" \
"--without-poll_module" \
"--without-select_module" \
"--with-cc-opt='-O2'"

3.3 性能优化

缓存和压缩与限度能够进步性能
NGINX 的一些额定性能可用于进步 Web 利用的性能,调优的时候 web 利用不须要关掉但值得一提,因为它们的影响可能很重要。

  • 1)缓存
    一个启用 NGINX 缓存的情景,一组 web 或者应用服务器负载平衡,能够显著缩短对客户端的响应工夫,同时大幅度降低后端服务器的负载。缓存自身就能够作个专题来讲,这里咱们就不试图讲它了。
# 网页资源缓存
location ~* \.(xml|html|htm)$ {
  # 资源决相对目录设置
  root /var/www/html;
  # 日志文件的相对路径或残缺门路
  access_log /path/to/file.log;
  # 开启日志记录
  access_log on;
  # 设置过期工夫
  expires 24h;
}

# 款式、JS、图片资源缓存
location ~* \.(css|js|ico|gif|jpg|jpeg|png)$ {
  root /var/www/html/res;
  # 禁用 404 谬误日志
  log_not_found off;
  # 敞开日志
  access_log off;
  # 缓存工夫 7 天
  expires 7d;
}

# 字体资源缓存
location ~* \.(eot|ttf|otf|woff|woff2|svg)$ {
  root /var/www/html/static;
  log_not_found off;
  access_log off;
  expires max;
}
  • 2)压缩
    所以应用更小的网络带宽。然而只管压缩数据会耗费 CPU 资源,但当须要缩小网络带宽应用时这样做十分无效。须要留神的是,不能对已压缩的文件再压缩例如 JPEG 文件。

    # 启用 gzip 压缩
    gzip on;
    # 启用 gzip 压缩的最小文件,小于设置值的文件将不会压缩
    gzip_min_length 2k;
    # gzip 压缩级别,1-10,数字越大压缩的越好,也越占用 CPU 工夫,前面会有具体阐明
    gzip_comp_level 2;
    # 进行压缩的文件类型,javascript 有多种形,其中的值能够在 mime.types 文件中找到。gzip_types text/plain text/css text/javascript application/javascript application/x-javascript application/xml application/x-httpd-php image/x-icon image/jpeg image/gif image/png image/svg+xml image/avif image/webp font/ttf font/opentype;
    # 倡议在 http header 中增加 Vary: Accept-Encoding 反对
    gzip_vary on;
  • 3)限度
    避免用户耗费太多的资源,防止影响零碎性能和用户体验及安全性,以下是相干的指令:

    limit_conn and limit_conn_zone  # NGINX 承受客户连贯的数量限度,例如单个 IP 地址的连贯。设置这些指令能够避免单个用户关上太多的连贯,耗费超出本人的资源。limit_req and limit_req_zon #NGINX 解决申请的速度限制,与 limit_rate 有雷同的性能。能够进步安全性,尤其是对登录页面,通过对用户限度申请速率设置一个正当的值,防止太慢的程序笼罩你的利用申请(比方 DDoS 攻打)。limit_rate #  传输到客户端响应速度的限度(每个关上多个连贯的客户耗费更多的带宽)。设置这个限度避免零碎过载,确保所有客户端更平均的服务质量。max_conns #上游配置块中服务器指令参数。在上游服务器组中单个服务器可承受最大并发数量。应用这个限度避免上游服务器过载。设置值为 0(默认值)示意没有限度。queue (NGINX Plus - 商业版本提供) # 创立一个队列,用来寄存在上游服务器中超出他们最大 max_cons 限度数量的申请。这个指令能够设置队列申请的最大值,还能够抉择设置在谬误返回之前最大等待时间(默认值是 60 秒)。如果疏忽这个指令,申请不会放入队列。

    简略示例:

    http {
    # 请依据业务需要配置同一 IP 地址连接数
    limit_conn_zone $binary_remote_addr zone=www_weiyigeek_top:10m;
    # 请依据业务需要配置同一 IP 地址申请速率
    limit_req_zone $binary_remote_addr zone=blog_weiyigeek_top:10m rate=1r/s;
    
    server {
      # 倡议创立黑白名单
      allow 外部 IP 或负载平衡 IP;
      deny 歹意 IP;
      
      # 限流
      location ^~ /download/ { 
        # 示意单个 IP 连接数不超过 2 个
        limit_conn www_weiyigeek_top 2; 
        # 示意单个 IP 申请速率为 1s 一个, 容许超过频率限度的申请数不多于 5 个,最多申请不能超过 burst + rate 数量。limit_req zone=blog_weiyigeek_top burst=5 nodelay; 
        alias /data/weiyigeek.top/download/;
      }
    }
    }
    
  • 4)缩小磁盘 IO
    缩小磁盘 IO 次数能够帮忙咱们更好的晋升服务器性能,加强服务器的负载能力。

    # 敞开不须要记录指定目录或者文件拜访日志
    access_log off;
    error_log /dev/null
    
    # 为日志写入创立缓存区缩小 IO 次数, 例如上面当缓存达到 128k 或者日志刷新工夫为 1m 时将写入日志文件中(gzip 压缩日志 - 按需开启)
    access_log /var/log/nginx/access.log main buffer=128k gzip flush=1m;

3.4 经营优化

1) 永恒重定向

如果你的站点须要让 http URL 跳转到 https, 则非倡议设置永恒重定向,而非长期重定向,这能够帮忙你站点更好的被收录(SEO)。

例如,配置 http 向 https 跳转 (永恒)

# 形式 1.Redirect(重定向)- 举荐
server {
  listen 80;
  server_name weiyigeek.top www.weiyigeek.top;
  return 301 https://$host$request_uri;
}

# 形式 2.ReWrite 重写
server {
  listen 80;
  server_name weiyigeek.top www.weiyigeek.top;
  # 判断申请 host 是否是 www.weiyigeek.top , 如果是 weiyigeek.top 则重写为 www.weiyigeek.top 
  if ($http_host !~ "^www\.weiyigeek\.top$" {rewrite ^(.*) https://www.weiyigeek.top$1 permanent;
  }
}

3.5 配置优化

nginx 配置文件指令优化一览表

地位 指令 阐明 优化
main worker_processes 工作过程数的抉择包含(但不限于)CPU 外围的数量、存储数据的硬盘数量及负载模式 设置 auto 或者 `cat /proc/cpuinfo grep processor wc -l` 服务器逻辑外围总数
main worker_cpu_affinity Nginx 默认未开启 CPU 绑定,绑定工作过程到对应 CPU 外围 多核 CPU 倡议设置 CPU 绑定, 绑定样例:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
main worker_rlimit_nofile 关上文件数限度(默认值 1024), 受限于零碎的用户过程关上文件数限度,未设置则应用零碎默认值 批改用户关上文件数限度:
echo "* - nofile 65536" >> /etc/security/limits.conf
批改所有 Shell 和通过 Shell 启动的过程关上文件数限度:
echo "ulimit -n 65536" >> /etc/profile
长期失效(重启后失效): ulimit -n 65536
main worker_connections Nginx 一个工作过程的最大同时连接数,不仅限于客户端连贯,包含了和后端被代理服务器等其余的连贯 倡议设置成与 worker_rlimit_nofile 值相等
mian sendfile 在 http 或 server 或 location 环境中蕴含 sendfile 指令。
NGINX 能够不须要切换到用户态,就把缓存或磁盘上的内容写入套接字而且写的速度十分快,耗费更少的 CPU 周期。
留神只管应用 sendfile()数据拷贝能够绕过用户态但不适用于惯例的 NGINX 解决扭转内容的链和过滤器比方 gzip
倡议设置成 on
main-events accept_mutex 惊群问题:
如果指令值为 on 启用,那么将轮流唤醒一个工作过程接管解决新的连贯,其余工作过程持续放弃睡眠
如果指令值为 off 敞开,那么将唤醒所有工作过程,由零碎通过 use 指令指定的网络 IO 模型调度决定由哪个工作过程解决,未接管到连贯申请的工作过程持续放弃睡眠
on 开启状态为了稳固参数值;
off 敞开状态进步性能和吞吐量然而会带来上下文切换增多或者负载升高等等其它资源更多耗费的结果(举荐)
main-events use 定义了 Nginx 设置用于复用客户端线程的轮询办法(也可称多路复用网络 IO 模型), 天然是抉择效率更高的优先(默认即可) use epoll
main open_file_cache 开启敞开关上文件缓存默认值 off 敞开,强烈建议开启能够防止从新关上同一文件带来的零碎开销节俭响应工夫 max= 数字设置缓存元素的最大数量
inactive= 工夫设置超时 当缓存溢出时应用 LRU(最近起码应用)算法删除缓存中的元素;在这段时间内缓存元素如果没有被拜访将从缓存中删除;
open_file_cache max=65536 inactive=60s
main open_file_cache_valid 设置查看 open_file_cache 缓存的元素的工夫距离 80s
main open_file_cache_min_uses 设置在由 open_file_cache 指令的 inactive 参数配置的超时工夫内文件应该被拜访的最小次数。
如果拜访次数大于等于此值,文件描述符会保留在缓存中,否则从缓存中删除。
1
main error_log 谬误的拜访申请日志记录, 当并发很大时 Nginx 的拜访日志和谬误日志的保留必定会造成对磁盘的大量读写也将影响 Nginx 的性能 正文即可 或者 谬误日志设置为 error 或者 crit
main-http access_log 胜利的拜访申请日志记录, 如必须保留日志,能够按每日或者每时或者其它时间段对日志做切割,这也能够减小 IO,尽管可能成果不是特地大,不过因为日志文件尺寸变小了很多,也不便查阅或归档剖析日志 倡议开启日志记录级别 main
main-http gzip 默认开启了 gzip 压缩性能: 减少 CPU 的解决工夫和负载(默认即可)
敞开 gzip 压缩性能: 尽管缩小了 CPU 计算节俭了服务器的响应工夫,但网站页面总体响应工夫反而加长了动态文件数据传输工夫减少;
设置 gzip on 即可;(该模块中有附带参数)
main-http keepalive_timeout 闲暇长连贯放弃关上状态的工夫; 复用之前已建设的 TCP 连贯接管申请、发送回应,缩小从新建设 TCP 连贯的资源工夫开销 负数为开启长久连贯 (惯例设置 120) 而 0 敞开。
当网站页面内容以动态为主时,开启长久连贯;
动静网页且不能被转化为动态页面,则敞开长久连贯;
main-http keepalive_requests 单个客户端长连贯能够申请的数量然而当应用压力测试工具从一个客户端发送多个申请测试时,这个值设更高些特地有用 默认值是 100
main-http-server-location expires 浏览器缓存设置 HTTP 应答中的“Expires”和“Cache-Control”头标。”Expires” 个别联合 ”Last-Modified” 应用比拟缓存工夫, 防止了从服务器再次传送文件内容减小了服务器压力,节俭了带宽同时也进步了用户访问速度 -1 示意永远过期不缓存, 举荐动态文件如 js/css 等等拜访设置 expires 30da;

4. 平安配置

形容:Nginx 因为平安配置不适合导致的平安问题,Nginx 的默认配置中存在一些平安问题, 例如版本号信息泄露、未配置应用 SSL 协定等。
对 Nginx 进行平安配置能够无效的防备一些常见平安问题,依照基线规范做好平安配置可能缩小安全事件的产生, 保障采纳 Nginx 服务器零碎利用平安运行;

Nginx 平安配置项:

0. 暗藏 nginx 服务及其版本

舒适提醒: 在批改相应的源代码文件后需从新编译。

# 形式 1:
#vi nginx-1.9.11/src/http/ngx_http_header_filter_module.c
static char ngx_http_server_string[] = "Server: LTWS" ; #批改处
#批改 nginx_http_header_filter_module
#vi nginx-1.9.11/src/http/ngx_http_special_response.c
static u_char ngx_http_error_full_tail[] =
"<center> NGINX_VER </center>" 
"<hr><center> http://www.weiyigeek.com</center>" 
"</body>" 
"</html>" 
;

static u_char ngx_http_error_tail[] =
"<hr><center>LTWS</center>" 
"</body>" 
"</html>" 
;

#设置响应头版本版本
#vim src/core/nginx.h
#define NGINX_VERSION      "secWaf"            #能够改成你要的版本号
#define NGINX_VER          "1.1" NGINX_VERSION #改成你的服务名称

设置胜利后验证:

1. 低权限用户运行服务

应配置非 root 低权限用户来运行 nginx 服务, 设置如下建设 Nginx 用户组和用户,采纳 user 指令指运行用户

加固办法:

groupadd nginxweb;
useradd -M -g nginxweb -s /sbin/nologin nginxweb 

#nginx.conf 中配置 或者编译 的时候指定
#nginx 装置编译参数 --user=nginx --group=nginx
user nginxweb

2. 配置 SSL 及其会话复用

咱们应该为提供的站点配置 Secure Sockets Layer Protocol (SSL 协定),配置其是为了数据传输的平安,SSL 依附证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

server {
  # 开启 SSL 与 http2 反对
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  # 开启 SSL,如果想 http 与 https 专用一个配置则能够将其正文(the "ssl" directive is deprecated)
  # ssl on;

  # 配置证书链与证书密钥
  ssl_certificate      /etc/nginx/ssl/fullchain.cer;
  ssl_certificate_key  /etc/nginx/ssl/weiyigeek.top.key;

  # ssl 会话复用超时工夫以及会话复用缓存大小
  ssl_session_timeout 1d;
  ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
  ......
}

3. 限度 SSL 协定与加密套件

不应应用不平安 SSLv2、SSLv3 协定即以下和存在脆弱性的加密套件(ciphers), 咱们应该应用较新的 TLS 协定也应该优于旧的, 并应用平安的加密套件。

# 兼容性较为通用的 SSL 协定与加密算法套件
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;

# 浏览器客户端主动协商加密套件(为了兼容性)
ssl_prefer_server_ciphers  on;

4. 拦挡垃圾信息

HTTP Referrer Spam 是垃圾信息发送者用来进步他们正在尝试推广的网站的互联网搜索引擎排名一种技术,如果他们的垃圾信息链接显示在拜访日志中,并且这些日志被搜索引擎扫描,则会对网站排名产生不利影响
加固办法:

if ($http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) ){return 403;}

5. 歹意扫描拦挡

当歹意攻击者采纳扫描器进行扫描时候利用 use-agent 判断是否是罕用的工具扫描以及特定的版本, 是则返回谬误或者重定向;

# 封杀各种 user-agent
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan|nessus|wvs") {return 403;}

if ($http_user_agent ~* "") {return 403;}

# 封杀特定的文件扩展名比方.bak 以及目录;
location ~* \.(bak|swp|save|sh|sql|mdb|svn|git|old)$ {rewrite ^/(.*)$  $host  permanent;
}
location /(admin|phpadmin|status)    {deny all;}

6. 禁用 WebDAV

Nginx 反对 webdav,尽管默认状况下不会编译。如果应用 webdav,则应该在 Nginx 策略中禁用此规定。
加固办法: dav_methods 应设置为 off

7. 禁用 Nginx 状态模块

当拜访一个特制的 URL 时,如 ”../nginx.status”,stub_status 模块提供一个简短的 Nginx 服务器状态摘要, 大多数状况下不应启用此模块。
加固办法:nginx.conf 文件中 stub_status 不应设置为:on

8. 敞开默认谬误页上的 Nginx 版本号

如果在浏览器中呈现 Nginx 主动生成的谬误音讯,默认状况下会蕴含 Nginx 的版本号, 这些信息能够被攻击者用来帮忙他们发现服务器的潜在破绽
加固办法: 敞开 ”Server” 响应头中输入的 Nginx 版本号将 server_tokens 应设置为:off

server_tokens off 

9. 设置 client_body_timeout 超时

client_body_timeout 设置申请体(request body)的读超时工夫。仅当在一次 readstep 中,没有失去申请体,就会设为超时。超时后 Nginx 返回 HTTP 状态码 408(Request timed out)。
加固办法:nginx.conf 文件中 client_body_timeout 应设置为:10

10. 设置 client_header_timeout

client_header_timeout 设置期待 client 发送一个申请头的超时工夫(例如:GET / HTTP/1.1)。仅当在一次 read 中没有收到申请头,才会设为超时。超时后 Nginx 返回 HTTP 状态码 408(Request timed out)。

加固办法:nginx.conf 文件中 client_header_timeout 应设置为:10

11. 设置 keepalive_timeout 超时

keepalive_timeout 设置与 client 的 keep-alive 连贯超时工夫。服务器将会在这个工夫后敞开连贯。

加固办法:nginx.conf 文件中 keepalive_timeout 应设置为:55

12. 设置 send_timeout 超时

send_timeout 设置客户端的响应超时工夫。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,Nginx 就会敞开连贯。

加固办法:nginx.conf 文件中 send_timeout 应设置为:10

13.Nginx 可用的办法应限度为 GET, HEAD, POST

GET 和 POST 是 Internet 上最罕用的办法。Web 服务器办法在 RFC 2616 中定义禁用不须要实现的可用办法。

加固办法:

#nginx.conf 文件中应存在
if ($request_method !~ ^(GET|HEAD|POST)$ )

14. 管制并发连贯 limit_zone slimits

limit_zone 配置项限度来自客户端的同时连接数。通过此模块能够从一个地址限度调配会话的同时连贯数量或非凡状况。

加固办法:nginx.conf 文件中 limit_zone 应设置为:slimits $binary_remote_addr 5m

# 设定保留各个键 (例如 $binary_remote_addr) 状态的共享内存空间的参数,zone= 空间名字: 大小大小的计算与变量无关
limit_conn_zone $binary_remote_addr zone=ops:10m;

15. 管制并发连贯 limit_conn slimits

该配置项管制一个会话同时连贯的最大数量,即限度来自单个 IP 地址的连贯数量。

加固办法:nginx.conf 文件中 limit_conn 应设置为: slimits 5

# 示意同一 IP 同一时间只容许 10 个连贯
limit_conn ops 5;

16. 主机防 webshell 跨目录浏览以及列目录

加固办法:

a. 在 nginx.conf 里把每个虚拟主机站点申请端口给区别开
b. 为每个站点建一个 conf,并进行配置
c. 批改 php-fpm 启动脚本
d. 启动服务

#在 main-http-server 段中设置开启或者敞开(对于须要列目录的则开启, 否则默认是敞开的)
autoindex off

17. 文件名解析破绽 php_info, 退出 fcgi.conf 即可
if ($request_filename ~* (.*)\.php) {set $php_url $1;}

if (!-e $php_url.php) {return 403;}

18. 拜访权限管制 nginx

加固办法:

#nginx.conf
location ~ ^/script/ {
    auth_basic "welcome to weiyigeek.github.io";
    auth_basic_user_file /var/www/test/script/.htpasswd;
}

#建设 htpasswd 明码进行认证
mkdir /var/www/test/script
perl -e "print crypt('baidu.eud',"n");"
nnUygd3RSf3u6

echo 'nginx:nnUygd3RSf3u6' > /var/www/test/script/.htpasswd
/usr/local/nginx/sbin/nginx -s reload

19. 异样状态返回 200 暗藏 URL

解决办法:

server{
  listen       80;
  server_name  weiyigeek.top;
  index index.html index.htm index.php;
  root  /data/web;
  error_page 404 =200 /404.jpg;
}

20. 平安模块的抉择
# 平安检测模块抉择
http_sub_module
http_stub_status_module
xss-nginx-module
with-http_ssl_module

21. 记录访问者实在 IP

形容后端获取 Proxy 后的实在 Client 的 IP 获取须要装置 --with-http_realip_module,而后后端程序采纳 JAVA(request.getAttribute("X-Real-IP")) 进行获取;

set_real_ip_from 100.0.0.0/8;#(这里是已知的代理 ip)real_ip_header X-Forwarded-For;
real_ip_recursive on;

# 代理转发
location / {proxy_pass http://weiyigeek.top}

proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
set $Real $http_x_forwarded_for;
if ($Real ~ (\d+)\.(\d+)\.(\d+)\.(\d+),(.*) ){set $Real $1.$2.$3.$4;}
proxy_set_header X-Real-IP $remote_addr;

#区别
$proxy_add_x_forwarded_for #较上面多一个 $remote_addr 的(只能获取到与服务器自身直连的下层申请 ip)
$http_x_forwarded_for

#日志获取
$http_x_real_ip|$remote_addr  #前提条件是 cdn 那边也设置了 X -forward 否则获取的是 cdn 的 ip

22. 地区拜访响应措施

形容: 如果要应用 geoip 地区抉择, 咱们须要再 nginx 编译时退出 --with-http_geoip_module 编译参数。

# 例如, 访问者 IP 地址不为中国或者美国的都返回 403。if ($geoip_country_code !~  ^(CN|US)$ ) {return 403;}

23. 资源防盗链设置

形容: 为了避免内部站点援用咱们的动态资源,咱们须要设置那些域名能够拜访咱们的动态资源。

# none : "Referer" 起源头部为空的状况
# blocked : "Referer" 起源头部不为空
# server_names : "Referer" 起源头部蕴含以后的 server_names(以后域名)location ~* \.(gif|jpg|png|swf|flv)$ { 
  valid_referers none blocked weiyigeek.top server_names ~\.google\. ~\.baidu\.; #这是能够盗链的域名或 IP 地址,个别状况能够把 google,baidu,sogou,soso,bing,feedsky,zhuaxia,photozero 等域名放进来
  if ($invalid_referer) { 
    #这样设置可能防盗链,一直地 302 重定向很屡次,可能会减轻服务器的累赘,所以不倡议这么做,除非有独自的图片服务器反对
    return 403; # 或者返回 403 错误代码 或者 JSON 字符串

    # 返回 json
    add_header Content-Type 'application/json; charset=utf-8';
    return 200 "{'msg':'valid'}"; 
    # 本地目录重写
    rewrite ^/.*.(gif|jpg|jpeg|png)$ /static/qrcode.jpg last;
    # 重写近程 URL
    rewrite ^/ https://www.weiyigeek.top/picture/images/details-image-1.jpg;

  } 
}

24. 惯例平安响应头配置

形容: 上面收集了 Web 服务中惯例的平安响应头, 它能够保障不受到某些攻打, 倡议在指定的 server{} 代码块进行配置。

# HSTS (ngx_http_headers_module is required) 应该只应用 HTTPS 而不是应用 HTTP 通信
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload" always;

# XXS-Protection
add_header X-XSS-Protection "1; mode=block";

# MIME 模仿探测
add_header X-Content-Type-Options nosniff;

# Frame 安全控制
add_header X-Frame-Options ALLOW-FROM music.163.com;

# Spider Robots 爬取策略限度
add_header X-Robots-Tag none;

# CORS 跨域设置
add_header Access-Control-Allow-Origin '*.weiyigeek.top';
add_header Access-Control-Allow-Methods 'GET';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

# CSP
# 当初让咱们容许自托管 scripts、images、CSS、fonts 和 AJAX,以及 jQuery CDN 托管脚本和 Google Analytics 的内容:
Content-Security-Policy: default-src 'none'; script-src 'self' https://code.jquery.com https://www.google-analytics.com; img-src 'self' https://www.google-analytics.com; connect-src 'self'; font-src 'self'; style-src 'self';

25. 避免非所属域名解析到服务器

形容: 为了避免某些未备案的域名或者歹意镜像站域名绑定到咱们服务器上, 导致服务器被正告关停,将会对业务或者 SEO 排名以及企业形象造成影响,咱们能够通过如下形式进行防备。

server {
  listen 80 default_server;
  server_name 82.156.18.253;
  # 禁止搜索引擎收录 IP
  add_header X-Robots-Tag 'noindex,noarchive,nosnippet';
  location ^~ / {
    # IP 地址拜访强制 301 跳转
    if ($host = 82.156.18.253){return 301 https://www.weiyigeek.top/index.html;}
    # 申请 host 非指定域名时返回 json
    if ($host !~* weiyigeek\.top) {
      add_header Content-Type 'application/json; charset=utf-8';
      return 200 '{"status":"error","Author":"WeiyiGeek","Site":"https://www.weiyigeek.top","Chinese":" 大佬, 请不要把你的域名解析到我的服务器上 ","English":"Friend, Please do not resolve your domain name to my server"}';
      # return 301 https://space.bilibili.com/385802642;
    }
  }
...
}

执行后果:

$ curl -I 82.156.18.253
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Mon, 11 Apr 2022 12:15:02 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: https://www.weiyigeek.top/index.html
X-Robots-Tag: noindex,noarchive,nosnippet

$ curl --insecure -I https://82.156.18.253
HTTP/2 301
server: nginx
date: Mon, 11 Apr 2022 12:15:24 GMT
content-type: text/html
content-length: 162
location: https://www.weiyigeek.top/index.html
x-robots-tag: noindex,noarchive,nosnippet

$ curl weiyigeek.cn
{"status":"error","Author":"WeiyiGeek","Site":"https://www.weiyigeek.top","Chinese":"大佬, 请不要把你的域名解析到我的服务器上","English":"Friend, Please do not resolve your domain name to my server"}

25. 限度指定客户端地址拜访

形容: 有时你的网站可能只须要被某一 IP 或者 IP 段的地址申请拜访,那么非白名单中的地址拜访将被阻止拜访, 咱们能够如下配置;

location / {
  allow  12.97.167.194; 
  allow  12.33.1.2; 
  allow  12.152.49.4;
  deny  all;
}

5. 配置阐明

罕用 nginx 配置文件解释:

#[Main] Nginx 启动的用户(倡议非 root 用户)
user nginx;

#[Main] NGINX 工作过程数设置值和 CPU 外围数统一(优化选项)
#采纳 grep ^processor /proc/cpuinfo | wc -l 进行查看或者 auto
worker_processes  auto;

#[Main] 工作模式与连接数下限即每个工作过程能够解决并发的最大连接数(优化选项)
events {#[Main-events] nginx 作为反向代理服务器单个过程最大连接数(最大连接数 = 连接数 * 过程数)#倡议与 worker_rlimit_nofile 统一
    worker_connections  65535;
    #[Main-events] use [kqueue | rtsig | epoll | /dev/poll | select | poll]; 
    #epoll 模型是 Linux 2.6 以上版本内核中的高性能网络 I / O 模型,如果跑在 FreeBSD 下面,就用 kqueue 模型。use epoll;
    #[Main-events] 进步性能和吞吐量
    accept_mutex off;
}

#[Main] 高并发参数(通过设置 cpu 粘性来升高因为多 CPU 核切换造成的寄存器等现场重建带来的性能损耗)(优化选项)
worker_cpu_affinity 0001 0010 0100 1000; #四核的时候
#如果是 8 cpu 调配如下: worker_cpu_affinity 00000001 00000010 00000100 00001000 0001000000100000 01000000 10000000

#[Main] 默认是没有设置,能够限度为操作系统最大的限度 65535。(优化选项)
worker_rlimit_nofile 65535

#[Main]日志地位和日志级别[debug | info | notice | warn | error | crit]
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
error_log logs/error.log  error;

#服务过程启动文件
pid /var/run/nginx.pid;

#以后主配置文件蕴含其余的 nginx 模块配置文件
include /etc/nginx/conf.d/*.conf; 

#[Main 局部] http 服务器提供 http 服务相干的一些配置参数。例如:是否应用 keepalive 啊,是否应用 gzip 进行压缩等。http {
    #文件扩展名与文件类型映射表
    include       mime.types;
    #默认文件类型
    default_type  text/html;
    #响应的编码格局
    charset UTF-8;
    #服务器名字的 hash 表大小
    server_names_hash_bucket_size   128;
    #缓冲区代理缓冲用户端申请的最大字节数,client_body_buffer_size 128k
    #上传文件大小限度
    client_header_buffer_size 4k;
    #容许客户端申请的最大单文件字节数。如果有上传较大文件,请设置它的限度值
    client_max_body_size 10m

    #文件拜访缓存设置与系统文件描述符设置统一
    open_file_cache max=65536  inactive=60s;
    open_file_cache_valid      80s;
    open_file_cache_min_uses   1;

    large_client_header_buffers 4 64k; #设定申请缓

    #nginx 日志记录格局
    log_format  main  '$remote_addr - $remote_user [$time_local]"$request"''$status $body_bytes_sent "$http_referer" ''"$http_user_agent""$http_x_forwarded_for"';

    #应用缓冲而不是每条日志记录都独自执行写操作,NGINX 会缓冲一连串的日志记录应用单个操作把它们一起写到文件中。access_log  logs/access.log  main buffer=1024 flush=60s;

    #敞开 server 信息头响应
    server_tokens off;


    #[MAIN-http]开启高效文件传输模式, 指定 nginx 是否调用 sendfile 函数来输入文件,缩小用户空间到内核空间的上下文切换(与 accept_mutex 关联配置)
    #对于一般利用设为 on,如果用来进行下载等利用磁盘 IO 重负载利用可设置为 off,以均衡磁盘与网络 I / O 处理速度,升高零碎的负载。#零碎调用能够实现从一个文件描述符到另一个文件描述符的数据拷贝,通常实现零拷贝,这能减速 TCP 数据传输
    #当配置环境下有 sendfile 指令和激活内容更改过滤器的指令时 NGINX 会主动禁用 sendfile。#(优化选项)
    sendfile        on; 
    #防止网络阻塞, 不过要包涵在 keepalived 参数才无效
    tcp_nopush on; 
    tcp_nodelay on; 

    #闲暇长连贯放弃关上状态的工夫(优化选项)
    #长连贯申请大量小文件的时候,能够缩小重建连贯的开销,但如果有大文件上传 120s 内没上传实现会导致失败。如果设置工夫过长,用户又多,长时间放弃连贯会占用大量资源。keepalive_timeout  120;
    
    #用于指定响应客户端的超时工夫。这个超时仅限于两个连贯流动之间的工夫,如果超过这个工夫客户端没有任何流动,Nginx 将会敞开连贯
    #send_timeout  180s
    
    ### 模块 http_gzip#####
    #开启 gzip 压缩输入,缩小网络传输。gzip  on;
    #最小压缩文件大小(留神不能小于 1k)
    gzip_min_length 1k;
    #压缩缓冲区
    gzip_buffers 4 64k;
    #压缩版本(默认 1.1,前端如果是 squid2.5 请应用 1.0)gzip_http_version 1.1;
    #压缩等级
    gzip_comp_level 2;
    ## 压缩类型,默认就曾经蕴含 text/html,gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
    ### 模块 fastcgi#####
    #FastCGI 相干参数是为了改善网站的性能:缩小资源占用,进步访问速度。# fastcgi_temp_path  /tmp/fastcgi_temp;
    # fastcgi_cache_path /tmp/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128m inactive=30m max_size=1g;
    # fastcgi_cache_key  $host$request_uri;
    #指定的 Http 状态码指定缓存工夫
    # fastcgi_cache_valid 200 302 1h; 
    # fastcgi_cache_valid 301 1d;
    # fastcgi_cache_valid any 1m;
    # fastcgi_cache_min_uses 1;
    # fastcgi_cache_use_stale error timeout http_500 http_503 invalid_header;
    #指定链接到后端 FastCGI 的超时工夫。# fastcgi_connect_timeout 300;
    #向 FastCGI 传送申请的超时工夫,这个值是指曾经实现两次握手后向 FastCGI 传送申请的超时工夫。# fastcgi_send_timeout 300;
    #指定接管 FastCGI 应答的超时工夫,这个值是指曾经实现两次握手后接管 FastCGI 应答的超时工夫。# fastcgi_read_timeout 300;
    #指定读取 FastCGI 应答第一局部须要用多大的缓冲区,这个值示意将应用 1 个 64KB 的缓冲区读取应答的第一局部(应答头),能够设置为 gastcgi_buffers 选项指定的缓冲区大小。# fastcgi_buffer_size 64k;
    #一个 php 脚本所产生的页面大小为 256KB,那么会调配 4 个 64KB 的缓冲区来缓存
    # fastcgi_buffers 4 64k; 
    #倡议设置为 fastcgi_buffer 的两倍,忙碌时候的 buffer
    # fastcgi_busy_buffers_size 128k;
    # fastcgi_temp_file_write_size 128k;

    
    #[Main-http]配置虚拟主机设置
    #http 服务上反对若干虚拟主机。每个虚拟主机一个对应的 server 配置项,配置项外面蕴含该虚拟主机相干的配置
    server {#[Main-http-server] ngnix 监听端口
        listen       80;
        
        #服务器名:虚拟主机的域名能够写多个域名,能够通过正则匹配。server_name  localhost;

        #实现拜访 http 时主动跳转到 https
        return 301 https://$host$request_uri;
        #access_log  logs/host.access.log  main;

        #申请正则匹配的来判断拜访门路,默认拜访 localhost:80 拜访的是上面这个门路的网页
        location / {
            #站点根目录你网站文件寄存的中央
            root   html;
            #定义门路下默认拜访的文件名,个别跟着 root 放
            index  index.html index.htm;
            
            #开启限度 IP 连接数的时候须要应用
            #limit_zone crawler $binary_remote_addr 10m; 

            #访问控制模块默认就会装置,而且写法也非常简单,能够别离有多个 allow,deny,容许或禁止某个 ip 或 ip 段拜访,#顺次满足任何一个规定就进行往下匹配 (平安选项)
            allow 192.168.10.100;
            allow 172.29.73.0/24;
            deny all;
            
            #认证拜访 通过 httpd-devel 工具的 htpasswd 来为拜访的门路设置登录明码 (平安选项)
            #比方:htpasswd -c nginx.htpasswd admin 生成了默认应用 CRYPT 加密的密码文件#
            auth_basic "Nginx Status"
            auth_basic_user_file /usr/local/nginx/nginx.passwd
            
            #列出目录 autoindex Nginx 默认是不容许列出整个目录的适合下载服务器。(十分不举荐)
            #如需此性能,关上 nginx.conf 文件,在 location,server 或 http 段中退出 autoindex on;
            #autoindex on
            #显示出文件的确切大小单位是 bytes。改为 off 后显示出文件的大略大小,单位是 kB 或者 MB 或者 GB
            #autoindex_exact_size off
            #默认为 off,显示的文件工夫为 GMT 工夫。改为 on 后,显示的文件工夫为文件的服务器工夫
            #autoindex_localtime on;
        }
        
        #error_page  404              /404.html;
        #将服务器谬误页面间接指向动态页面 /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {root   html;}

        #代理 PHP 脚本到 Apache 上监听 127.0.0.1:80 开端以 php 或者 php5 结尾的
        #location ~ \.(php|php5)?$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        #将 PHP 脚本传递到正在监听 127.0.0.1:9000 的 FastCGI 服务器
        #location ~ .+\.(php|php5)$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_pass   unix:/tmp/php.sock;  #为了平安举荐形式
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #    fastcgi_cache  cache_fastcgi;
        #}


        # 如果 Apache 的文档根目录与 nginx 的根目录统一,则回绝拜访.htaccess 文件
        #location ~ /\.ht {
        #    deny  all;
        #}
        
        #动态资源正则申请门路匹配
        location ~ .+\.(gif|jpg|jpeg|png|bmp|swf|txt|csv|doc|docx|xls|xlsx|ppt|pptx|flv)$ {  
          root  e:wwwroot; 
          expires 30d;  #缓存有效期 30 天
          access_log off; #拜访记录
        } 
        #JS 和 CSS 缓存工夫设置
        location ~ .+\.(js|css|html|xml)$ {expires 30d;}

        #访问控制也能够退出认证
        location /nginx-status{
            #nginx 中的 stub_status 模块次要用于查看 Nginx 的一些状态信息. 本模块默认没有装置须要编译装置。stub_status on;
            allow 192.168.1.0/24;
            allow 127.0.0.1;
            deny all;
        }
    }
    
    #### Nginx 反向代理 ######
    #[Main-http] upstream 模块设置反向代理和负载平衡的连贯的外部 web 应用服务 IP 端口
    upstream monitor_server {
        #seesion 记录拜访的主机,比方第一次拜访该服务器后就记录,之后再拜访都是该服务器了 - 进行了绑定
        ip_hash;
        #内网的应用服务,weigth 参数示意权值越高被调配到的几率越大。#max_fails 当有 max_fails 个申请失败,就示意后端的服务器不可用,默认为 1 将其设置为 0 能够敞开查看 
        #fail_timeout 在当前的 fail_timeout 工夫内 nginx 不会再把申请发往已查看出标记为不可用的服务器 
        server 192.168.0.131:80 weight=9 max_fails=5 fail_timeout=600s;  
        server 192.168.0.132:80 weight=1 max_fails=5 fail_timeout=600s;
    } 
    
    
    #server 指令配置项
    server { 
        listen 80; 
        #申请响应的域名
        server_name blog.weiyigeek.top; 
        
        location / {
          ##### 模块 http_proxy:##### 反向代理次要配置
          #即反向代理,对应 upstream 负载均衡器
          proxy_pass http://monitor_server;
          
          #代理服务器相干信息头设置
          proxy_redirect off;
          #如果是有波及 redirect 的服务,肯定要加上端口 8081,否 则默认 tomcat 在 redirect 时候默认找 80 端口 
          proxy_set_header Host $host;
          #转发申请的原 IP 地址,程序中通过 request.getHeader("Proxy-Client-IP")取得 ip 
          proxy_set_header X-Real-IP $remote_addr;
          #端的 Web 服务器能够通过 X -Forwarded-For 获取用户实在 IP
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
          
          ##nginx 跟后端服务器连贯超时工夫(代理连贯超时)
          #模块 http_proxy 代理超时设置
          proxy_connect_timeout 60s;  
          
          ##nginx 跟后端服务器连贯超时工夫(代理连贯超时) 
          proxy_read_timeout 60s;     
          
          #后端服务器数据回传工夫(代理发送超时) 间
          proxy_send_timeout 30s;
          
          #设置代理服务器(nginx)从后端 realserver 读取并保留用户头信息的缓冲区大小,默认与 proxy_buffers 大小雷同,其实能够将这个指令值设的小一点
          proxy_buffer_size 4k
          #proxy_buffers 缓冲区,nginx 针对单个连贯缓存来自后端 realserver 的响应,网页均匀在 32k 以下的
          proxy_buffers 4 32k
          
          #高负荷下缓冲大小(proxy_buffers*2)proxy_busy_buffers_size 64k
          
          #当 proxy_buffers 放不下后端服务器的响应内容时,会将一部分保留到硬盘的临时文件中,这个值用来设置最大临时文件大小,默认 1024M
          #它与 proxy_cache 没有关系。大于这个值,将从 upstream 服务器传回。设置为 0 禁用。proxy_max_temp_file_size 0
          
          #当缓存被代理的服务器响应到临时文件时,限度每次写临时文件的大小。proxy_temp_path(能够在编译的时候)指定写到哪那个目录。proxy_temp_file_write_size 64k

          #把 cookie 的作用域替换成咱们的域名。#proxy_cookie_domain google.com.hk www.example.com;  
          #proxy_set_header Host "www.google.com.hk";          #设置反向代理得 header 申请头
          #proxy_redirect http://www.google.com.hk/ ;          #重定向
          #proxy_redirect http:// https://;
          #sub_filter www.google.com.hk www.example.com;       #把谷歌的域名替换成本人的,留神须要装置 nginx 的 sub_filter 模块
          #反向代理的配置. END
        }

        #本地动静拆散反向代理配置
        #所有 jsp 的页面均交由 tomcat 或 resin 解决
        location ~ .(jsp|jspx|do)?$ {
            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_pass http://127.0.0.1:8080;
        }

        #所有动态文件由 nginx 间接读取不通过 tomcat 或 resin
        location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {expires 15d;}

        location ~ \.(js|css)$ {expires 1h;}

    } 
    
    # 另一个虚拟主机,混合应用 IP、名称和基于端口的配置
    server {
      listen 80;
      listen [::]:80;
      server_name weiyigeek.top;
      return 301 https://$host$request_uri;
   }

    server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name weiyigeek.top;

    # HSTS (ngx_http_headers_module is required) 应该只应用 HTTPS 而不是应用 HTTP 通信
    add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload" always;

    # XXS-Protection
    add_header X-XSS-Protection "1; mode=block";

    # MIME 模仿探测
    add_header X-Content-Type-Options nosniff;

    # Frame 安全控制
    add_header X-Frame-Options ALLOW-FROM music.163.com;

    # Spider Robots 爬取策略限度
    # add_header X-Robots-Tag none; # 不限度
    # add_header X-Robots-Tag noindex, noarchive, nosnippet; # 限度

    # 开启 SSL,如果想 http 与 https 专用一个配置则能够将其正文(the "ssl" directive is deprecated)
    # ssl on;

    # 配置证书链与证书密钥
    ssl_certificate      /etc/nginx/ssl/fullchain.cer;
    ssl_certificate_key  /etc/nginx/ssl/weiyigeek.top.key;

    # ssl 会话复用超时工夫以及会话复用缓存大小
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions

    # 配置双证书时开启否则应该敞开
    ssl_session_tickets off;  

    ## OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    # 应用根 CA 和两头证书验证 OCSP 响应的信赖链
    ssl_trusted_certificate /etc/nginx/ssl/ca.cer;

    # 仅应用 ECDH 是不必配置 ssl_dhparam 的否则你应该为它配置上 
    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
    ssl_dhparam /path/to/dhparam;

    # 兼容性较为通用的 SSL 协定与加密算法套件
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;
    # 平安配置: ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
    # 证书惯例握手加密算法形式共十八个,ECDHE、DHE、AES 结尾别离 6 个
    ; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DES:!MD5:!RC4;
    
    # 为了兼容性举荐服务器主动抉择要应用的算法套件
    ssl_prefer_server_ciphers  on;

    # replace with the IP address of your resolver
    resolver 223.6.6.6 8.8.8.8 192.168.12.254;
  }
}

6. 补充常识

(1) 阿里巴巴提供的 Concat 或者 Google 的 PageSpeed 模块实现这个合并文件的性能。

  • Concat 源代码网址:https://github.com/alibaba/ng…
  • PageSpeed 源代码网址:https://github.com/pagespeed/…。

(2) PHP-FPM 的优化
如果您高负载网站应用 PHP-FPM 治理 FastCGI 对于 PHP-FPM 的优化十分重要

  • 1. 减少 FastCGI 过程数: 把 PHP FastCGI 子过程数调到 100 或以上, 在 4G 内存的服务器上 200 就能够倡议通过压力测试获取最佳值。
  • 2. 减少 PHP-FPM 关上文件描述符的限度

    # vi /path/to/php-fpm.conf
    找到“1024”, 把 1024 更改为 4096 或者更高, 之后重启 PHP-FPM
  • hard nofile 65536
  • soft nofile 65536

  • 3. 适当减少 max_requests: 标签 max_requests 指明了每个 children 最多解决多少个申请后便会被敞开默认的设置是 500。

(3) 配置 Resin on Linux 或者 Windows 为咱们能够关上 resin-3.1.9/bin/httpd.sh 在不影响其余代码的中央退出:-Dhttps.protocols=TLSv1.2, 例如

exec $JAVA_EXE -jar  -Dhttps.protocols=TLSv1.2 ${RESIN_HOME}/lib/resin.jar $*
#exec $JAVA_EXE -jar  ${RESIN_HOME}/lib/resin.jar $*

原文地址: https://blog.weiyigeek.top/20…

文章书写不易,如果您感觉这篇文章还不错的,请给这篇专栏【点个赞、投个币、收个藏、关个注,转个发】(世间五大情),这将对我的必定,谢谢!。

本文章起源 我的 Blog 站点 或 WeiyiGeek 公众账号 以及 我的 BiliBili 专栏 (技术交换、友链替换请邮我哟 ), 谢谢反对!(๑′ᴗ‵๑) ❤
欢送各位气味相投的敌人一起学习交换,如文章有误请留下您贵重的常识倡议,通过邮箱【master#weiyigeek.top】分割我哟!

正文完
 0