nginx启蒙及参数优化——windows版本
https://www.cnblogs.com/zdyang/p/14200724.html
目录:
一、常用命令
下载地址: http://nginx.org/en/download.html
整理到《命令汇总20190428.docx》里了 无需安装,直接解压即可。(如何后面要切割日志,那么一定要把nginx解压到没有空格的文件路径里) Windows下Nginx的启动、停止等命令如下(dos下进入nginx-1.15.11目录): 1、启动: start nginx 或 nginx.exe (注:start nginx 不保留黑窗口,nginx.exe保留黑窗口) 2、停止: nginx.exe -s stop 或 nginx.exe -s quit (注:stop是快速停止nginx,可能并不保存相关信息;quit是完整有序的停止nginx,并保存相关信息) 3、重新载入Nginx: nginx.exe -s reload (注:当配置信息修改,需要重新载入这些配置时使用此命令) 4、重新打开日志文件: nginx.exe -s reopen 5、查看Nginx版本: nginx -v 6、检查配置文件没有语法错误 nginx -t nginx-1.15.11\conf\nginx.conf配置文件含义: worker_processes: 工作进程个数,可配置多个(一般等于CPU的总核数或总核数的两倍,例如两个四核CPU,则综合数为8.通过命令ps -ef|grep nginx可以看出来设置的是几个) worker_connections: 单个进程最大连接数 server: 每一个server相当于一个代理服务器 lister: 监听端口,默认80 server_name: 当前服务的域名,可以有多个,用空格分隔(我们是本地所以是localhost) location: 表示匹配的路径,这时配置了/表示所有请求都被匹配到这里 index: 当没有指定主页时,默认会选择这个指定的文件,可多个,空格分隔 proxy_pass: 请求转向自定义的服务器列表 upstream name{ }: 服务器集群名称 nginx负载均衡主要有以下五种策略:(Nginx中的upstream轮询机制介绍:https://www.cnblogs.com/liqiu/p/3140329.html) 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 url_hash(第三方) 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
二、nginx.conf文件配置
2.1. nginx.conf配置示例
#user nobody; #----------使用的用户和组 worker_processes 16; #----------工作进程个数,可配置多个(一般等于CPU的总核数或总核数的两倍,例如两个四核CPU,则综合数为8.通过命令ps -ef|grep nginx可以看出来设置的是几个) error_log logs/error.log info; #----------指定错误日志存放的路径,错误日志记录级别可选项为:[debug|info|notice|warn|error|crit],默认是crit,记录的日志数量从crit到debug,由少到多。eg:error_log /usr/local/nginx/logs/nginx_error.log crit; pid logs/nginx.pid; #----------指定pid存放的路径(pid 进程控制符。即代表了各进程的进程ID,也就是说,PID就是各进程的身份标识) eg: pid /usr/local/nginx/nginx.pid; events { worker_connections 32768; #----------单个进程最大连接数 如为windows系统必须使用专门的Windows 版本的Nginx,否则非windosw版本文件访问句柄数被限制为1024了(参数worker_connections 超过1024的配置无效,当访问量大时就会无法响应,日志中查看报 :maximum number of descriptors supported by select() is 1024) # Windows: max value 32768, nginx recycling connections+registry optimization = # this.value * 20 = max concurrent connections currently tested with one worker # C1000K should be possible depending there is enough ram/cpu power # multi_accept on; } http { include mime.types; default_type application/octet-stream; server_tokens off; #----------隐藏版本号 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #----------log_format 自定义日志记录格式设置,main为名字,在access_log命令中引用 # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; #----------指定日志存放路径,如果想使用默认的combined格式记录日志,可以使用access_log logs/access.log combined; 以下是使用log_format自定义的格式记录日志的。 access_log logs/access.log; sendfile on; #----------这三个参数参照《nginx优化——keepalive等》 tcp_nopush on; tcp_nodelay on; #----------使缓冲区中的数据立即发送出去 禁用了Nagle 算法。(不需要等待0.2s) gzip on; #---------- 开启gzip压缩设置(只能在http模块中设置) gzip_min_length 1024; #gzip_types text/plain text/css application/x-javascript; client_max_body_size 500m; #--------上传文件最大限制 不设置默认1m #client_header_buffer_size 50k; #large_client_header_buffers 4 4k; ##---Start: Timeouts调优---## client_body_timeout 100; #----------指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out) client_header_timeout 100; #----------客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。 send_timeout 100; #----------服务端向客户端传输数据的超时时间。 keepalive_timeout 300; #---------- 设置keep-alive客户端连接在ngnix服务器端保持开启的超时值(默认75s) 即用户的客户端链接nginx的长连接超时时间 值为0会禁用keep-alive客户端连接 这两个参数参照《nginx优化——keepalive等》
#---------- Nginx 使用 keepalive_timeout 来指定 KeepAlive 的超时时间(timeout)。指定每个 TCP 连接最多可以保持多长时间。Nginx 的默认值是 75 秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为 0,就禁止了 keepalive 连接 ;通常keepalive_timeout应该比client_body_timeout大 keepalive_requests 10000; #---------- 设置一个keep-alive连接上可以服务的请求的最大数量,当最大请求数量达到时,连接被关闭。默认是100 proxy_connect_timeout 300; #---------nginx跟后端服务器连接超时时间(代理连接超时) proxy_read_timeout 300; #---------定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。 proxy_send_timeout 300; #---------定义向后端服务器传输请求的超时。此超时是指相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的最长时间。如果后端服务器在超时时间段内没有接收到任何数据,连接将被关闭。 ##---End: Timeouts调优---### ##---Start: 使用缓冲_调优---## proxy_buffering on; #---------该指令用来开启或者关闭代理服务器的缓冲区 https://blog.csdn.net/qq_34939308/article/details/120751229 proxy_buffers 8 64k; #---------该指令用来指定单个连接从代理服务器读取响应的缓存区的个数和大小 proxy_buffer_size 64k; #---------该指令用来设置从被代理服务器获取的第一部分响应数据的大小。保持与proxy_buffffers中的size一致即可,当然也可以更小。 proxy_busy_buffers_size 64k; #---------该指令用来限制同时处于BUSY状态的缓冲总大小 proxy_temp_file_write_size 64k; #---------该指令用来设置磁盘上缓冲文件的大小。 ##---End: 使用缓冲_调优---## # upstream myLoadBalancer { # server 127.0.0.1:9001 weight=1 fail_timeout=5; # server 127.0.0.1:9002 weight=1 fail_timeout=5; # server 127.0.0.1:9003 weight=1 fail_timeout=5; # server 127.0.0.1:9004 weight=1 fail_timeout=5; # server 127.0.0.1:9005 weight=1 fail_timeout=5; # least_conn; # } upstream abc.yzs { #---------- 集群配置(这里设置集群名称为test) upstream设置,设置代理服务器(负载均衡池),默认的负载均衡方式是轮询,另外一种是ip_hash #max_fails=1 fail_timeout=10s server 172.16.1.237:80 weight=1 max_fails=10 fail_timeout=60s ; #---------- weight为权重,不写默认为1:1 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 server 172.16.1.131:80 weight=1 max_fails=10 fail_timeout=60s ; #---------- max_fails、fail_timeout Nginx基于连接探测,如果发现后端异常,在单位周期为fail_timeout设置的时间,中达到max_fails次数,这个周期次数内,如果后端同一个节点不可用,那么接将把节点标记为不可用,并等待下一个周期(同样时常为fail_timeout)再一次去请求,判断是否连接是否成功。(fail_timeout需要设置为 > 服务端应用的最大执行时间) 参考:https://blog.csdn.net/wudiyong22/article/details/92795463 ip_hash; #----------不写的话是轮询方式,ip_hash为每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 keepalive 1000; #----------1.设置upstream服务器的空闲keepalive连接的最大数量.2. 当这个数量被突破时,最近使用最少的连接将被关闭 3.特别提醒:keepalive指令不会限制一个nginx worker进程到upstream服务器连接的总数量 4.可参考《nginx优化——keepalive等.html》 另还可参考:https://blog.csdn.net/weixin_43944305/article/details/109487968 } #------监听8081端口,跳转到集群 server { #---------- 每一个server相当于一个代理服务器 listen 8081; #---------- 监听的端口(默认为80) server_name yzs; #---------- 主机名称 #client_max_body_size 500m; #--------上传文件最大限制 不设置默认1m location / { proxy_pass http://abc.yzs; #----------将定向的路径转到访问你服务器集群上(对应上面设置的upstream的集群名称)(upstream设置的是test,故这里写http://test) proxy_http_version 1.1; #------ HTTP1.0为短连接 HTTP1.1为长连接 这两个参数参照《nginx优化——keepalive等.html》 proxy_set_header Connection ""; proxy_set_header Host $host:$server_port; #--------- 变量$host等于客户端请求头中的Host+port值。 proxy_set_header X-Real-IP $remote_addr; #--------- $remote_addr客户端的ip地址 proxy_set_header REMOTE-HOST $remote_addr; #--------- $remote_addr客户端的ip地址 proxy_set_header X-Forwarded-For $http_x_forwarded_for; #--------- 后端的web服务器可以通过X-Forwarded-For获取真实的IP地址 #proxy_connect_timeout 300s; #----------与服务器连接的超时时间,默认60s(如果一个集群服务器挂掉了(挂掉指连接不上),而负载正好到这个服务器,那么在proxy_connect_timeout时间后,负载才会跳到另一个集群服务器上) #proxy_send_timeout 300s; #----------默认60s;这个指定设置了发送请求给upstream服务器的超时时间。超时设置不是为了整个发送期间,而是在两次write操作期间。如果超时后,upstream没有收到新的数据,nginx会关闭连接 #proxy_read_timeout 600s; #----------默认60s;该指令设置与代理服务器的读超时时间。它决定了nginx会等待多长时间来获得请求的响应。这个时间不是获得整个response的时间,而是两次reading操作的时间。(??什么是两次reading操作的时间) #client_max_body_size 500m; #--------上传文件最大限制 不设置默认1m #proxy_next_upstream http_502 http_504 error timeout invalid_header; #---------如果后端服务器返回502,504,执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现failover。 #add_header Cache-Control no-store; #add_header Pragma no-cache; } location /nginxStatus { #----------添加的status模块,是查看Nginx的运行状态 stub_status on; access_log off; error_log off; } #charset koi8-r; #----------配置该虚拟机的字符设置,如果不配置继承自http中的charset设置 #access_log logs/host.access.log main; #----------访问日志文件设置,如果server虚拟机中不设置,则继承http模块中的access_log的设置 #error_page 404 /404.html; #---------- 用于设置如果出现指定的HTTP错误状态码,则返回指定的url页面 #error_page 500 502 503 504 /50x.html; #---------- 用于设置如果出现指定的HTTP错误状态码,则返回指定的url页面 #location = /50x.html { # root html; #} } #------监听80端口,跳转到get-weixin-code.html页面 server { listen 80; server_name weixin; location / { root html; index get-weixin-code.html; #----------将"get-weixin-code.html"文件放到"D:\<nginx安装根目录>\html\" 文件目录下 ,即访问80端口时就会访问这个文件 } location /nginxStatus { #----------添加的status模块,是查看Nginx的运行状态 stub_status on; access_log off; error_log off; } proxy_http_version 1.1; #------ HTTP1.0为短连接 HTTP1.1为长连接 这两个参数参照《nginx优化——keepalive等.html》 proxy_set_header Connection ""; proxy_set_header Host $host; #--------- 变量$host等于客户端请求头中的Host值。 #如果是非80端口,配置为Host $host:端口号,目的是将代理服务器收到的用户的信息传到真实服务器上 eg: proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; #--------- $remote_addr客户端的ip地址 proxy_set_header REMOTE-HOST $remote_addr; #--------- $remote_addr客户端的ip地址 proxy_set_header X-Forwarded-For $http_x_forwarded_for; #--------- 后端的web服务器可以通过X-Forwarded-For获取真实的IP地址 } #------监听8083端口,跳转到另一台服务器 server { listen 8083; server_name wuyu; location / { proxy_pass http://172.1.1.152; #----------将定向的路径转向 add_header Access-Control-Allow-Origin *; } location /nginxStatus { #----------添加的status模块,是查看Nginx的运行状态 stub_status on; access_log off; error_log off; } proxy_http_version 1.1; #------ HTTP1.0为短连接 HTTP1.1为长连接 这两个参数参照《nginx优化——keepalive等.html》 proxy_set_header Connection ""; proxy_set_header Host $host:$server_port; #--------- 变量$host等于客户端请求头中的Host值。 #如果是非80端口,配置为Host $host:端口号,目的是将代理服务器收到的用户的信息传到真实服务器上 eg: proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; #--------- $remote_addr客户端的ip地址 proxy_set_header REMOTE-HOST $remote_addr; #--------- $remote_addr客户端的ip地址 proxy_set_header X-Forwarded-For $http_x_forwarded_for; #--------- 后端的web服务器可以通过X-Forwarded-For获取真实的IP地址 #proxy_redirect http://$host http://$host:$server_port; #proxy_redirect off; } #------注意:如何要再增加监听端口,不要忘了在安全狗上也配置下开通此端口 }
location /nginxStatus { #----------添加的status模块,是查看Nginx的运行状态 stub_status on; access_log off; error_log off; }
http://xxxx/nginxStatus
active connections //对后端发起的活动连接数 server accepts handled requests //nginx 总共处理了2268692 个连接, 成功创建2268692 次握手,总共处理了15002597个请求 reading // nginx 读取到客户端的Header信息数 writing //nginx 返回给客户端的Header信息数 waiting // 开启 keep-alive 的情况下,这个值等于 active- (reading + writing),意思就是Nginx说已经处理完正在等候下一次请求指令的驻留连接 (如果reading或writing的值很高,说明正在处理的数据量很大,可能是因为后端的 php 程序处理慢,拖了后腿,而一般来说,PHP之后以慢,是因为MYSQL,另一个原因很可能就是IO慢,或者客户端的网络慢(这种情况在国内常见些)).
2.3. 如何使用windwos版本
参考地址:https://blog.csdn.net/qq_29407683/article/details/109216280
原因如下:
worker_connections 32768; #----------单个进程最大连接数 如为windows系统必须使用专门的Windows 版本的Nginx,否则非windosw版本文件访问句柄数被限制为1024了(参数worker_connections 超过1024的配置无效,当访问量大时就会无法响应,日志中查看报 :maximum number of descriptors supported by select() is 1024)
故windows系统要使用专门的windows系统才得,我下载的是《nginx 1.21.5.2 WhiteHorse.zip》版本。
1. 解压后在服务器上面双击执行解压后的Tweak-Optimize tcpip parameters for nginx connections.reg文件。修改注册表连接数配置信息
2. 将nginx.exe文件删除,将nginx_basic.exe文件改为nginx.exe;;
3. 配置文件nginx-win.conf改为nginx.conf即可
2.4. 便捷的bat
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
三、日志每日分割、定期清理
问题:nginx会按照nginx.conf的配置生成access.log和error.log,随着访问量的增长,日志文件会越来越大,既会影响访问的速度(写入日志时间延长),也会增加查找日志的难度。
默认的main配置如下:
解决方法:
3.1.编写bat脚本
用一个bat脚本按天切割日志,并删除几天前的日志(我放到了bak文件夹下,别忘了在logs下建个bak文件夹,之前忘了导致找了半天原因)。(参照:https://www.cnblogs.com/luozx207/p/11056996.html)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
效果如下:
另如要生成 年月日文件夹的格式。配置如下( eg:logs/bak/2019/08/16/access.log)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
(如何要切割日志,那么一定要把nginx解压安装到没有空格的文件路径里)
注意1:move命令如路径或文件名有空格则会报语法错误,解决方法是在加上双引号。Eg:
move D:\"Program Files"\nginx-1.16.0\"2 2.txt" D:\"Program Files"\nginx-1.16.0\"3 3.txt"
但下面的重新加载日志任务和删除历史记录任务执行不了。后来我把nginx安装位置换了个没有空格的文件路径后才ok
故:要切割日志,那么一定要把nginx解压安装到没有空格的文件路径里
注意2: 在测试时,windows自动任务执行结果是(0x1),费了我很长时间找不到原因,后来发现是执行bat时,没有可删除的文件,执行结果报(0x1)。当有文件可删时,执行结果就“操作成功完成。(0x0)”
3.2.配置windows任务计划程序
然后用windows自带任务计划定期执行logcut.bat这个可执行文件(windows2008R2创建任务)
四、学习参数
https://www.cnblogs.com/aguncn/p/11189159.html
https://www.iteye.com/blog/825635381-2197501
五、学习网址-启蒙
不容错过的Nginx配置详解,一文带你搞懂Nginx(内有一些参数介绍)
https://www.toutiao.com/article/7120973453053788675
tomcat+nginx+redis实现均衡负载、session共享(一):
https://www.cnblogs.com/zhrxidian/p/5432886.html
tomcat+nginx+redis实现均衡负载、session共享(二):
https://www.cnblogs.com/zhrxidian/p/5491285.html#4145879
使用Nginx实现Tomcat集群负载均衡:
https://www.cnblogs.com/machanghai/p/5957086.html
Nginx反向代理,负载均衡,redis session共享,keepalived高可用:
https://www.cnblogs.com/mrlinfeng/p/6146866.html
4种负载均衡方式:
https://uule.iteye.com/blog/2236475
下面是优化参数相关:
nginx.conf配置文件中timeout超时时间设置 :
https://blog.csdn.net/qq_29663071/article/details/80759098
nginx优化——keepalive等:
https://blog.csdn.net/dream_flying_bj/article/details/54709549
Nginx+Tomcat负载均衡详述与实战-include:
https://blog.csdn.net/qq_29663071/article/details/80759098
查看nginx运行状态:
https://blog.csdn.net/qq_40884473/article/details/118687650
http://www.voidcn.com/article/p-mdtfwngb-nw.html
https://blog.csdn.net/qq_34939308/article/details/120751229
本文来自博客园,作者:东方飘雪,转载请注明原文链接:https://www.cnblogs.com/zdyang/p/14200724.html