nginx配置及性能调优

摘要:
因此,我们需要首先检查本地计算机的CPU核数,然后在获得结果后设置工作进程_进程值#检查CPU核数grep-cprocessor/proc/cpuinfo1.2,调整最大连接数,并控制单个Nginx进程允许的最大连接数。参数为worker_Connections。此参数应根据服务器性能和内存使用情况进行调整。进程的最大连接数受Linux系统进程打开的最大文件数的限制。只有在执行“ulimit HSn65535”后,worker_Connections才能生效。

https://www.toutiao.com/i6765746230141125132/?timestamp=1575450096&app=news_article&group_id=6765746230141125132&req_id=201912041701360100260760263C04643

2.4、配置默认主页

location / {
 index index.html index.htm;
 autoindex off;
}

2.5、配置反向代理

location / {
 proxy_pass http://localhost:8888;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

2.6、URL 美化(省略 index.html 入口文件)

location / {
 try_files $uri $uri/ /index.html;
}

2.7、upstream 代码块

upstream 代码块位于 http 代码块内部。
upstream 用于对服务器集群进行负载均衡的配置。
upstream name {
 ip_hash;
 server 192.168.1.100:8000;
 server 192.168.1.100:8001 down;
 server 192.168.1.100:8002 max_fails=3;
 server 192.168.1.100:8003 fail_timeout=20s;
 server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
ip_hash:手动指定调度算法。
down:表示该主机暂停服务。
max_fails:表示失败最大次数,超过失败最大次数就会暂停服务。
fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求。

2.8、配置文件中的全局变量

$args #这个变量等于请求行中的参数。
$content_length #请求头中的Content-length字段。
$content_type #请求头中的Content-Type字段。
$document_root #当前请求在root指令中指定的值。
$host #请求主机头字段,否则为服务器名称。
$http_user_agent #客户端agent信息
$http_cookie #客户端cookie信息
$limit_rate #这个变量可以限制连接速率。
$request_body_file #客户端请求主体信息的临时文件名。
$request_method #客户端请求的动作,通常为GET或POST。
$remote_addr #客户端的IP地址。
$remote_port #客户端的端口。
$remote_user #已经经过Auth Basic Module验证的用户名。
$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
$query_string #与$args相同。
$scheme #HTTP方法(如http,https)。
$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
$server_name #服务器名称。
$server_port #请求到达服务器的端口号。
$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri #与$uri相同。

二、Nginx性能调优

1、优化 Nginx工作进程数及连接数

Nginx 有 master 和 worker 两种进程,master 进程用于管理 worker 进程,worker 进程用于 Nginx 服务。
而worker 进程数默认为 1 。单进程最大连接数为1024

1.1、worker进程设置

worker 进程数应该设置为服务器 CPU 的核数。所以我们得先查看一下本机的CPU核数,得到结果后,再设置worker_processes值
# 查看CPU核数
grep -c processor /proc/cpuinfo

1.2、调整最大连接数

控制 Nginx 单个进程允许的最大连接数的参数为 worker_connections ,这个参数要根据服务器性能和内存使用量来调整。
进程的最大连接数受 Linux 系统进程打开的最大文件数的限制,只有执行了 "ulimit -HSn 65535" 之后,worker_connections 才能生效。
连接数包括代理服务器的连接、客户端的连接等,Nginx 总并发连接数 = worker_processes * worker_connections。总数保持在 3w 左右即可。
worker_processes 2;
worker_cpu_affinity 01 10;
user nginx nginx;
events {
 use epoll;
 worker_connections 15000;
}

2、绑定 Nginx 进程到不同的 CPU 上

默认情况下,Nginx 的多个进程有可能跑在某一个 CPU 或 CPU 的某一核上,导致 Nginx 进程使用硬件的资源不均,因此绑定 Nginx 进程到不同的 CPU 上是为了充分利用硬件的多 CPU 多核资源。
[root@localhost ~]# grep -c processor /proc/cpuinfo # 查看CPU核数
2
worker_processes 2; # 2核CPU的配置
worker_cpu_affinity 01 10;
 
worker_processes 4; # 4核CPU的配置
worker_cpu_affinity 0001 0010 0100 1000;
 
worker_processes 8; # 8核CPU的配置
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000;
 
[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload

3、优化 Nginx worker 进程打开的最大文件数

# worker 进程打开的最大文件数,可设置为优化后的 ulimit -HSn 的结果
worker_rlimit_nofile 65535;

4、开启高效文件传输模式

sendfile:参数用于开启文件的高效传输模式,该参数实际上是激活了 sendfile() 功能。
sendfile() :是作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作是在内核之中的,被称为 "零拷贝" 。sendfile 比 read 和 write 函数要高效得多,因为 read 和 write 函数要把数据拷贝到应用层再进行操作。
tcp_nopush:参数用于激活 Linux 上的 TCP_CORK socket 选项,此选项仅仅当开启 sendfile 时才生效,tcp_nopush 参数可以把 http response header 和文件的开始部分放在一个文件里发布,以减少网络报文段的数量。
http {
 include mime.types;
 default_type application/octet-stream;
 
 sendfile on; # 开启文件的高效传输模式,减少文件在应用和内核之间的拷贝
 tcp_nopush on; # 激活 TCP_CORK socket 选择,当数据包达到一定大小再发送
 tcp_nodelay on; # 数据在传输的过程中不进缓存,有数据随时发送(只用在应答需要非常快速的情况下)
 
 keepalive_timeout 65;
 include vhosts/*.conf;
}

5、优化 Nginx 连接的超时时间

5.1:连接超时的作用

将无用的连接设置为尽快超时,可以保护服务器的系统资源(CPU、内存、磁盘)
当连接很多时,及时断掉那些建立好的但又长时间不做事的连接,以减少其占用的服务器资源
如果黑客攻击,会不断地和服务器建立连接,因此设置连接超时以防止大量消耗服务器的资源
如果用户请求了动态服务,则 Nginx 就会建立连接,请求 FastCGI 服务以及后端 MySQL 服务,设置连接超时,使得在用户容忍的时间内返回数据
5.2:连接超时存在的问题

服务器建立新连接是要消耗资源的,因此,连接超时时间不宜设置得太短,否则会造成并发很大,导致服务器瞬间无法响应用户的请求。
有些 PHP 站点会希望设置成短连接,因为 PHP 程序建立连接消耗的资源和时间相对要少些。
有些 Java 站点会希望设置成长连接,因为 Java 程序建立连接消耗的资源和时间要多一些,这是由语言的运行机制决定的。


5.3:设置超时时间

keepalive_timeout:用于设置客户端连接保持会话的超时时间,超过这个时间服务器会关闭该连接。
client_header_timeout:用于设置读取客户端请求头数据的超时时间,如果超时客户端还没有发送完整的 header 数据,服务器将返回 "Request time out (408)" 错误。
client_body_timeout:用于设置读取客户端请求主体数据的超时时间,如果超时客户端还没有发送完整的主体数据,服务器将返回 "Request time out (408)" 错误。
send_timeout:用于指定响应客户端的超时时间,如果超过这个时间,客户端没有任何活动,Nginx 将会关闭连接。
tcp_nodelay:默认情况下当数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高 I/O 性能,但是,在每次只发送很少字节的业务场景中,使用 tcp_nodelay 功能,等待时间会比较长。
http {
 include mime.types;
 server_names_hash_bucket_size 512;
 
 default_type application/octet-stream;
 sendfile on;
 tcp_nodelay on;
 
 keepalive_timeout 65;
 client_header_timeout 15;
 client_body_timeout 15;
 send_timeout 25;
 
 include vhosts/*.conf;
}

6、限制上传文件的大小

client_max_body_size 用于设置最大的允许客户端请求主体的大小。
在请求头中有 "Content-Length" ,如果超过了此配置项,客户端会收到 413 错误,即请求的条目过大。
http {
 client_max_body_size 8m; # 设置客户端最大的请求主体大小为 8 M
}

7、FastCGI 相关参数调优

当 LNMP 组合工作时,用户通过浏览器输入域名请求 Nginx Web 服务:

如果请求的是静态资源,则由 Nginx 解析后直接返回给用户;
如果是动态请求(如 PHP),那么 Nginx 就会把它通过 FastCGI 接口发送给 PHP 引擎服务(即 php-fpm)进行解析,如果这个动态请求要读取数据库数据,那么 PHP 就会继续请求 MySQL 数据库,以读取需要的数据,并最终通过 Nginx 服务把获取的数据返回给用户。
这就是 LNMP 环境的基本请求流程。

在 Linux 中,FastCGI 接口即为 socket ,这个 socket 可以是文件 socket,也可以是 IP socket。

http {
 include mime.types;
 default_type application/octet-stream;
 sendfile on;
 keepalive_timeout 65;
 fastcgi_connect_timeout 240; # Nginx服务器和后端FastCGI服务器连接的超时时间
 fastcgi_send_timeout 240; # Nginx允许FastCGI服务器返回数据的超时时间,即在规定时间内后端服务器必须传完所有的数据,否则Nginx将断开这个连接
 fastcgi_read_timeout 240; # Nginx从FastCGI服务器读取响应信息的超时时间,表示连接建立成功后,Nginx等待后端服务器的响应时间
 fastcgi_buffer_size 64k; # Nginx FastCGI 的缓冲区大小,用来读取从FastCGI服务器端收到的第一部分响应信息的缓冲区大小
 fastcgi_buffers 4 64k; # 设定用来读取从FastCGI服务器端收到的响应信息的缓冲区大小和缓冲区数量
 fastcgi_busy_buffers_size 128k; # 用于设置系统很忙时可以使用的 proxy_buffers 大小
 fastcgi_temp_file_write_size 128k; # FastCGI 临时文件的大小
# fastcti_temp_path /data/ngx_fcgi_tmp; # FastCGI 临时文件的存放路径
 fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; # 缓存目录
 
 server {
 listen 80;
 server_name www.abc.com;
 location / {
 root html/www;
 index index.html index.htm;
 }
 location ~ .*.(php|php5)?$ {
 root html/www;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 include fastcgi.conf;
 fastcgi_cache ngx_fcgi_cache; # 缓存FastCGI生成的内容,比如PHP生成的动态内容
 fastcgi_cache_valid 200 302 1h; # 指定http状态码的缓存时间,这里表示将200和302缓存1小时
 fastcgi_cache_valid 301 1d; # 指定http状态码的缓存时间,这里表示将301缓存1天
 fastcgi_cache_valid any 1m; # 指定http状态码的缓存时间,这里表示将其他状态码缓存1分钟
 fastcgi_cache_min_uses 1; # 设置请求几次之后响应被缓存,1表示一次即被缓存
 fastcgi_cache_use_stale error timeout invalid_header http_500; # 定义在哪些情况下使用过期缓存
 fastcgi_cache_key http://$host$request_uri; # 定义 fastcgi_cache 的 key
 }
 }
}

8、gzip 压缩(在之前的讲解vue首页加载慢的一文中也有介绍Nginx压缩)

Nginx gzip 压缩模块提供了压缩文件内容的功能,用户请求的内容在发送到客户端之前,Nginx 服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。

需要压缩的对象有 html 、js 、css 、xml 、shtml ,图片和视频尽量不要压缩,因为这些文件大多都是已经压缩过的,如果再压缩可能反而变大。

另外,压缩的对象必须大于 1KB,由于压缩算法的特殊原因,极小的文件压缩后可能反而变大。

http {
 gzip on; # 开启压缩功能
 gzip_min_length 1k; # 允许压缩的对象的最小字节
 gzip_buffers 4 32k; # 压缩缓冲区大小,表示申请4个单位为32k的内存作为压缩结果的缓存
 gzip_http_version 1.1; # 压缩版本,用于设置识别HTTP协议版本
 gzip_comp_level 9; # 压缩级别,1级压缩比最小但处理速度最快,9级压缩比最高但处理速度最慢
 gzip_types text/plain application/x-javascript text/css application/xml; # 允许压缩的媒体类型
 gzip_vary on; # 该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用代理服务器缓存经过Nginx压缩的数据
}

9、配置 expires 缓存期限

Nginx expires 的功能就是给用户访问的静态内容设定一个过期时间。

当用户第一次访问这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及以后继续访问该网站时,浏览器会检查加载已经缓存在用户浏览器本地的内容,就不会去服务器下载了,直到缓存的内容过期或被清除。
不希望被缓存的内容:广告图片、网站流量统计工具、更新很频繁的文件。
缓存期限参考:新浪缓存 15 天,京东缓存 25 年,淘宝缓存 10 年。

server {
 listen 80;
 server_name www.abc.com abc.com;
 root html/www;
 location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css)$ # 缓存的对象
 {
 expires 3650d; # 缓存期限为 10 年
 }
}

10、配置防盗链

防盗链:简单地说,就是其它网站未经许可,通过在其自身网站程序里非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,使得被盗链的那一端消耗带宽资源 。
通过 HTTP referer 实现防盗链。

#第一种,匹配后缀
location ~ .*.(gif|jpg|jpeg|png|bm|swf|flv|rar|zip|gz|bz2)$ { # 指定需要使用防盗链的媒体资源
 access_log off; # 不记录日志
 expires 15d; # 设置缓存时间
 valid_referers none blocked *.test.com *.abc.com; # 表示仅允许这些域名访问上面的媒体资源
 if ($invalid_referer) { # 如果域名不是上面指定的地址就返回403
 return 403
 }
}
 
#第二种,绑定目录
location /images {
 root /web/www/img;
 vaild_referers none blocked *.spdir.com *.spdir.top;
 if ($invalid_referer) {
 return 403;
 }
}

11、操作系统优化

1、配置文件/etc/sysctl.conf,如下:

sysctl -w net.ipv4.tcp_syncookies=1 #防止一个套接字在有过多试图连接到达时引起过载
sysctl -w net.core.somaxconn=1024 #默认128,连接队列
sysctl -w net.ipv4.tcp_fin_timeout=10 #timewait的超时时间
sysctl -w net.ipv4.tcp_tw_reuse=1 #os直接使用timevait的连接
sysctl -w net.ipv4.tcp_tw_recycle=0 #回收禁用
2、配置文件/etc/security/limits.conf,如下:

hard nofile 204800
soft nofile 204800
soft core unlimited
soft stack 204800

免责声明:文章转载自《nginx配置及性能调优》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇shell编程之sedOpenGL的glClearColor和glClear改变背景颜色下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HLS -- m3u8档案格式解析

1. Playlist file 一个M3U的 Playlist 就是一个由多个独立行组成的文本文件,每行由回车/换行区分。每一行可以是一个URI、空白行或是以”#“号开头的字符串,并且空格只能存在于一行中不同元素间的分隔。一个URI 表示一个媒体段或是”variant Playlist file“(最多支持一层嵌套,即一个m3u8文件中嵌套另一个m3u...

利用nginx_push_stream_module实现服务器消息推送

NGiNX_HTTP_Push_Module 是一个 Nginx 的扩展模块,它实现了 HTTP Push 和Comet server的功能。HTTP Push 被经常用在网页上主动推的技术,例如一些聊天室啊,更新信息非常频繁的应用场合。 Http Server Push是一种推送技术,服务器主动向浏览器发送数据。  可以参考:http://wiki.n...

Nginx静态资源Web服务

1.原理 ​ 2.静态资源类型 ​ 3.静态资源服务场景-CDN ​ 配置语法 1.配置语法,文件读取 Syntax:sendfile on|off; Default:sendfile off; Context:http,server,location,if in location 引读:--with-file-aio 异步文件读取 2.配置语法-tcp_...

西门子S7-1500PLC存储结构讲解

PLC上的存储器与个人电脑上的存储器功能相似,主要用来存储系统程序、用户程序和数据。 根据功能不同可把存储器进行细分,可分为如下几个存储区: 装载存储器区(Load Memory) 工作存储器区(Work Memory) 保存存储器区(Retentive Memory) 系统存储器区(System Memory) 上面四个区域除了装载存储器区是外插SIMA...

centos性能优化cpu相关的测试及方法

工具下载地址https://src.fedoraproject.org/repo/pkgs/stress/stress-1.0.4.tar.gz/a607afa695a511765b40993a64c6e2f4/stress-1.0.4.tar.gzhttps://ftp.osuosl.org/pub/blfs/conglomeration/sysstat...

五、nginx的安装部署

nginx的安装部署及升级nginx的官网:http://nginx.org 先来看下nginx最新的版本信息 nginx最新的主流版本(mainline version):1.19.2 nginx稳定版本(stable version):1.18.0 其它稳定版本(legacy versions) 一、实验环境 [root@inode1 ~]# una...