目录
一、Nginx性能优化
1、开启网页压缩
2、页面缓存
3、连接保持超时
4、设置工作进程数
5、设置工作进程连接数
6、工作进程静态绑核
7、开启高效文件传输模式
8、IO多路复用
9、连接优化
二、Nginx安全优化
1、配置Nginx隐藏版本号
2、防盗链
3、访问控制
4、设置运行用户/组
5、限制请求数
6、限制连接数
7、日志分割
三、Nginx重要配置
1、系统内核优化
2、用过哪些nginx模块
一、Nginx性能优化
1、开启网页压缩
- Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能
- 允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装
- 可在配置文件中加入相应的压缩功能参数对压缩性能进行优化
图片缩放:
2、页面缓存
- 当Nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度
- 一般针对静态网页设置,对动态网页不设置缓存时间
设置方法
修改配置文件,在ttp段、或者server段、或者location段加入对特定内容的过期参数
示例
修改Nginx的配置文件,在location段加入expires 参数
location ~\.(gif|jpg|jepg|png|bmp|ico)$ {root html;expires 1d;
}
3、连接保持超时
为避免同一客户端长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间
超时参数
- keepalive_timeout 服务端超时时间 客户端超时时间;
- 设置连接保持超时时间
- Client_header_timeout
- 指定等待客户端发送请求头的超时时间
- Client_body_timeout
- 设置请求体读超时时间
4、设置工作进程数
- 在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞
- 更改进程数的配置方法
- 修改配置文件,修改进程配置参数
- 修改配置文件的worker_processes参数
- 一般设为CPU的个数或者核数
- 在高并发情况下可设置为CPU个数或者核数的2倍
- 增加进程数,可减少了系统的开销,提升了服务速度
- 使用ps aux查看运行进程数的变化情况
[root@www conf]# cat /proc/cpuinfo | grep -c "physical"
4
[root@www conf]# vi nginx.conf
worker_processes 4;
[root@www conf]# systemctl restart nginx
[root@www conf]# ps aux | grep nginx
查看cpu情况 lscpu
- 默认情况,Nginx的多个进程可能跑在一个CPU上,可以分配不同的进程给不同的CPU处理,充分利用硬件多核多CPU
- 在一台4核物理服务器,进行配置,将进程进行分配work_processes 与服务器CPU数量相同或auto
[root@www conf]# vi nginx.conf
worker processes 4;
worker_cpu affinity 0001 0010 0100 1000;
#cup与进程一一对应
5、设置工作进程连接数
作进程的连接数是由 worker_connections
指令来控制的。这个指令用于设置每个工作进程所能处理的最大连接数。
events {worker_connections 1024; # 设置每个工作进程的最大连接数# worker_rlimit_nofile
}
6、工作进程静态绑核
在 Nginx 中,你可以使用 worker_cpu_affinity
指令来设置工作进程的 CPU 亲和性,从而将工作进程绑定到特定的 CPU 核心上。这可以帮助优化服务器性能,尤其是在多核服务器上。
worker_cpu_affinity
指令接受一个 CPU 亲和性掩码作为参数,掩码中每个位代表一个 CPU 核心。例如,对于一个具有 4 个 CPU 核心的服务器,掩码 0001
表示将工作进程绑定到第一个 CPU 核心上,而 1111
则表示将工作进程绑定到所有 CPU 核心上。
以下是一个示例配置,将工作进程绑定到前两个 CPU 核心上:
worker_processes 4;
worker_cpu_affinity 0001 0010;
在这个示例中,假设服务器有四个 CPU 核心,worker_cpu_affinity
将工作进程绑定到第一个和第二个 CPU 核心上。
7、开启高效文件传输模式
在 Nginx 中,开启高效文件传输模式可以显著提升服务器的性能和效率。你提到的三个指令 sendfile on;
、tcp_nopush on;
和 tcp_nodelay on;
都是用于优化文件传输和网络性能的。
-
sendfile on;
sendfile
是一个系统调用,允许直接在内核空间和用户空间之间传输数据,而不需要将数据从内核缓冲区复制到用户缓冲区再发送。通过开启sendfile
功能,Nginx 可以直接在磁盘和网络之间传输文件,提高文件传输效率,减少 CPU 和内存的消耗。 -
tcp_nopush on;
tcp_nopush
指令用于控制数据包的发送时机。当tcp_nopush
设置为on
时,Nginx 会尽可能地在发送 TCP 数据包之前将数据累积到一个完整的数据包中,从而减少 TCP 消息的数量,提高传输效率。这对于发送大文件或大量静态内容的情况特别有效。 -
tcp_nodelay on;
tcp_nodelay
指令用于控制是否启用 Nagle 算法。Nagle 算法的目的是将多个较小的数据包合并成一个较大的数据包,以提高网络的利用率。但是,在某些情况下,这种合并会导致延迟增加,例如对于实时性要求较高的应用。通过开启tcp_nodelay
,Nginx 可以禁用 Nagle 算法,减少延迟,提高网络传输速度。
worker_processes auto;events {worker_connections 1024;
}http {sendfile on;tcp_nopush on;tcp_nodelay on;server {listen 80;server_name example.com;location / {root /var/www/html;index index.html;}}
}
8、IO多路复用
在 Nginx 中,多路复用是一种提高性能的关键技术,其中 epoll 是 Linux 下的一种高效的多路复用机制。通过使用 epoll,Nginx 能够更有效地管理大量的并发连接,从而提高服务器的吞吐量和性能。
在 Nginx 配置中,通过 use
指令可以指定 Nginx 使用的多路复用机制,而 epoll
就是其中一种选择。下面是一个简单的示例 Nginx 配置,演示了如何使用 epoll 多路复用:
worker_processes auto;events {worker_connections 1024;use epoll;
}http {# 其他 HTTP 配置项...server {# 服务器配置...}
}
9、连接优化
-
multi_accept on; 当
multi_accept
设置为on
时,Nginx 的监听进程可以同时接受多个网络连接。这意味着在有新连接到达时,监听进程可以立即接受多个连接,而不是一次只处理一个连接。这样可以加快连接的接受速度,尤其是在高并发的情况下,可以减少连接等待时间,提高服务器的响应速度。 -
accept_mutex on;
accept_mutex
用于控制新连接的串行处理,以防止多个工作进程同时处理新连接,从而避免所谓的“惊群现象”(thundering herd)。惊群现象指的是在某些条件下,多个进程竞争同一个资源或锁时,会导致大量进程被唤醒,但最终只有一个进程能够获得资源,其他进程都会进行无用的竞争和等待。通过开启accept_mutex
,Nginx 可以以串行方式接入新连接,避免这种不必要的竞争和资源浪费。
以下是一个简单的示例 Nginx 配置,演示了如何使用这些指令:
worker_processes auto;events {worker_connections 1024;multi_accept on;accept_mutex on;
}http {# 其他 HTTP 配置项...server {# 服务器配置...}
}
二、Nginx安全优化
1、配置Nginx隐藏版本号
- 隐藏Nginx版本号,避免安全漏洞泄漏
- Nginx隐藏版本号的方法
- 修改配置文件法
- 修改源码法
1)将Nginx配置文件中servee tokens 选项的值设置为off
重启服务,访问网站使用curl-命令检测
vim /usr/local/nginx/conf/nginx.conf
http {include mime.types;default_type application/octet-stream;server_tokens off; #添加,关闭版本号......
}systemctl restart nginx
curl -I http://192.168.80.10
2)修改 vim /opt/nginx-1.26.0/src/core/nginx.h\
3)headers-more-nginx-module-0.34.tar.g2 插件包,解压到一个日录,编译安装 nginx。
./confiqure --add-module='模块路径'ss make && make install
修改 nginx.conf 文件,在 http 配置块加 more clear headers'响应头字段';
即可去除 hginx 响应头任何想去除的字段
2、防盗链
在企业网站服务中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失
Nginx防盗链功能也非常强大。默认情况下,只需要进行简单的配置,即可实现防盗链处理
3、访问控制
在 Nginx 中,可以使用 deny
和 allow
指令来进行访问控制,限制特定 IP 地址或IP地址段对服务器资源的访问。
deny指令
deny
指令用于拒绝特定的 IP 地址或IP地址段对服务器资源的访问。可以在全局配置、http 配置块或者特定的 server 或 location 块中使用。
server {listen 80;server_name example.com;location /private {deny 192.168.1.1;deny 10.10.10.0/24;deny all;# 其他配置...}
}
在上面的示例中,deny
指令用于限制对 /private
路径的访问。IP 地址为 192.168.1.1
和 10.10.10.0/24
的用户将会被拒绝访问,而其他用户也将被拒绝访问,因为最后一个 deny
指令是 deny all;
。
allow指令
allow
指令用于允许特定的 IP 地址或IP地址段对服务器资源的访问,与 deny
相反。
server {listen 80;server_name example.com;location /restricted {allow 192.168.1.0/24;allow 10.10.10.10;deny all;# 其他配置...}
}
在上面的示例中,allow
指令用于限制对 /restricted
路径的访问。只有 IP 地址为 192.168.1.0/24
和 10.10.10.10
的用户将被允许访问,其他用户将被拒绝访问,因为最后一个 deny
指令是 deny all;
。
4、设置运行用户/组
- Nginx运行时进程需要有用户与组的支持,以实现对网站文件读取时进行访问控制
- Nginx默认使用nobody用户账号与组账号
- 修改的方法
- 编译安装时指定用户与组
- 修改配置文件指定用户与组
1)编译安装时指定
- 创建用户账号与组账号,如nginx
- 编译安装时--user与--group指定Nginx服务的运行用户与组账号
[root@www nginx-1.12.0]# ./configure-prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
....
2)修改配置文件法指定
- 新建用户账号,如nginx
- 修改主配置文件 user选项,指定用户账号与组账号
- 重启nginx服务,使配置生效
- 使用ps aux命令查看nginx的进程信息,验证运行用户
[root@www conf# vi nginx.conf
user nginx nginx;
[root@www conf]# systemctl restart nginx
[root@www confl# ps aux lgrep nginx
root 130034 0.0 0.0 20220 620 ? Ss 19:41 0:00 nginx:
master process /usr/local/sbin/nginx
nginx 130035 0.0 0.0 20664 1512 ? S 19:41 0:00 nginx:
5、限制请求数
-
limit_req_zone:
limit_req_zone
指令用于定义一个共享内存区域,用于存储客户端请求的状态信息,以便进行请求速率限制。该指令通常在http
配置块中使用。http {limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; }
在上面的示例中,定义了一个名为
mylimit
的共享内存区域,大小为 10MB,用于存储客户端的请求状态信息。限制请求速率为每秒 1 次。 -
limit_req:
limit_req
指令用于在特定的server
或location
块中启用请求速率限制。server {location /api {limit_req zone=mylimit burst=5 nodelay;# 其他配置...} }
在上面的示例中,
limit_req
指令将请求速率限制应用于/api
路径的请求。zone
参数指定了之前定义的共享内存区域名称,burst
参数指定了允许的最大突发请求数,nodelay
参数表示不延迟处理请求,而是直接拒绝超出速率限制的请求。
6、限制连接数
-
limit_conn_zone:
limit_conn_zone
指令用于定义一个共享内存区域,用于存储客户端连接的状态信息,以便进行连接数限制。该指令通常在http
配置块中使用。http {limit_conn_zone $binary_remote_addr zone=addr:10m; }
在上面的示例中,定义了一个名为
addr
的共享内存区域,大小为 10MB,用于存储客户端连接的状态信息。 -
limit_conn:
limit_conn
指令用于在特定的server
或location
块中启用连接数限制。server {location /downloads {limit_conn addr 10;# 其他配置...} }
在上面的示例中,
limit_conn
指令将连接数限制应用于/downloads
路径的连接。addr
参数指定了之前定义的共享内存区域名称,10
表示最大连接数为 10。
7、日志分割
- 随着Nginx运行时间增加,日志也会增加。为了方便掌握Nginx运行状态,需要时刻关注Nginx日志文件
- 太大的日志文件对监控是一个大灾难
- 定期进行日志文件的切割
- Nginx自身不具备日志分割处理的功能,但可以通过Nginx信号控制功能的脚本实现日志的自动切割
- 通过Linux的计划任务周期性地进行日志切割
编写脚本 cd /usr/local/nginx/logs下有两个文件
三、Nginx重要配置
1、系统内核优化
/etc/sysctl.conf 内核参数配置文件
#用于解决系统存在大量TIME WAIT状态连接的问题
net.ipv4.tcp_syncookies=1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击
net.ipv4.tcp_tw_reuse=1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_fin_timeout=30 修改MSL值,系统默认的TIMEOUT时间
#如果连接数本身就很多,可再优化TCP的可用端口范围,进一步提升服务器的并发能力
net.ipv4.tcp_keepalive_time=1200 #当keepalive启用时,TCP发送keepalive探测消息的频率,确认客户端是否断网
net.ipv4.ip_local_port_range=1024 65535 #用于向外连接的端口范围。缺省情况下很小,为32768 60999
net.ipv4.tcp_max_syn_backlog=8192 #SYN队列长度,默认为1024,加大队列长度为8192,可容纳更多等待连接的网络连接数
net.ipv4.tcp_max_tw_buckets=5000 #表示系统同时保持TIME WAIT的最大数量
net.core.somaxconn=65535 #一个端口能够监听的最大连接数
#如果需要IP路由转发
net.ipv4.ip_forward=1
/etc/security/limits.conf 内核资源限制文件
* soft noproc 65535 打开系统进程数
* hard noproc 65535
* soft nofile 65535 进程打开文件数
* hard nofile 65535
2、用过哪些nginx模块
http_stub_status_module 访问状态统计模块
http_gzip_module 网页压缩模块
http_rewrite_module URL地址重写模块
http_ssl_module https安全加密模块
http_auth_basic_module 网页用户认证模块
http_fastcgi_module fastcgi转发模块
http_image_filter_module 图片处理模块
http_mp4/flv_module mp4/flv视频格式模块
http_limit_req_module 限制请求数模块
http_limit_conn_module 限制连接数模块
http_proxy_module 代理转发模块
http_upstream_*_module 负载均衡模块
stream 四层代理转发模块
思考:
你做过哪些nginx优化?
nginx配置方面做过....
系统内核方面做过....