一个项目,使用https协议,用nginx做负载。使用当前较新的windows版本nginx1.23.3.2SnapDragonfly,使用Jmeter压测,很不理想,http协议能到2000并发,https不到500并发就不理想了,上网查了很多对https的优化最终都不行
然后再一个 网站跟我同样的问题<Nginx https 连接时间非常长,比Nginx http慢得多(32 倍),比 Apache https慢12倍>,里面说他改为linux系统才解决。参考此也改为linux系统,配置文件没做什么大的变动,压测
一、下载nginx版本
1. 官网直接下载.tar.gz
安装包,地址:http://nginx.org/en/download.html
2. 使用wget
命令下载到本文件夹下(如centos找不到wget,运行:yum -y install wget)(下面的https地址,是去查看下载地址复制的)
wget -c https://nginx.org/download/nginx-1.24.0.tar.gz
3.解压到本文件夹下
tar -zxvf nginx-1.24.0.tar.gz
二、配置
2.1 安装配置
我这里把nginx安装到 /opt/nginx目录下
(由于配置./configure --prefix=/opt/nginx ,故再执行完下面的命令后,在/opt目录下就会发现有个nginx新文件夹,nginx就安装到了这里)
#---1.安装nginx依赖工具包环境 yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel #---2.进入解压后的安装目录 cd nginx-1.24.0 #---3.配置nginx及安装环境 #配置nginx到指定目录(不需要SSL) <如已经安装好,却在后期要用https协议,即SSL,又不想重装,参考此方法(亲测有效):https://blog.csdn.net/Xiaoxin_Java/article/details/119187418> ./configure --prefix=/opt/nginx #配置nginx到指定目录(需要SSL) ./configure --prefix=/opt/nginx --with-http_stub_status_module --with-http_ssl_module #---4.编译并安装nginx make make install
2.2 配置nginx环境变量
配置环境变量后,在任何路径下都可以直接nginx命令,否则只能在安装目录下执行命令才得
#配置nginx环境变量: vi /etc/profile
此文件添加nginx配置(Insert按键:进入编辑模式; Esc按键:退出编辑模式; :wq 保存并退出vi模式):
#nginx bin目录配置 export NGINX_PATH=/opt/nginx/sbin export PATH=$PATH:$NGINX_PATH
使配置生效,命令:
source /etc/profile
2.3 设置开机启动
#--1.编辑/etc/rc.local文件 vi /etc/rc.local #增加一行: /opt/nginx/sbin/nginx #--2.设置执行权限 chmod 755 /etc/rc.local
到此基本完成配置。启动后,如果用其他电脑连接本服务器,别忘了linux的防护墙开放端口
2.4 CentOS7防火墙端口开放
https://www.cnblogs.com/zdyang/p/17484160.html
三、日志定期切割及删除
1.创建文件 log_cut.sh
2.log_cut.sh 配置(注意下面的路径,我的nginx安装路径是/opt/nginx)
#!/bin/bash #日期-年月日 #year=`date +%Y` #month=`date +%m` #day=`date +%d` rq=`date +%Y%m%d` #日志路径 logs_path="/opt/nginx/logs/" #历史路径 logs_backup_path="/opt/nginx/logs/bak" #logs_backup_path="/opt/nginx/logs/bak/$year$month"#按年月创建文件夹分割日志 方式 #nginx的pid路径 pid_path="/opt/nginx/logs/nginx.pid" [ -d $logs_backup_path ]||mkdir -p $logs_backup_path #移动 mv ${logs_path}access.log ${logs_backup_path}/access.log_${rq}.log mv ${logs_path}error.log ${logs_backup_path}/error.log_${rq}.log #重载打开日志文件 kill -USR1 `cat ${pid_path}` #删除100天前的文件 find $logs_backup_path -mtime +100 -type f -name "*.log" | xargs rm -f
3.修改脚本权限。(将log_cut.log文件上传到/opt/nginx/sbin/路径下)
chmod +x /opt/nginx/sbin/log_cut.sh
./log_cut.sh试验时,报如下错误
经百度,是在windows下编写文件再传到服务器上执行的,有时候会出现坏的解释器,原因是“由于windows系统下换行符为 \r\n,linux下换行符为 \n,所以导致在windows下编写的文件会比linux下多回车符号 \r。”
解决方法:只需要去掉多余的 \r 回车符 即可。操作办法可以用sed命令进行全局替换,执行命令sed 's/\r//' -i log_cut.sh。其他方法参考:https://blog.csdn.net/qq_56870570/article/details/120182874
4.添加定时任务
配置crontab每天凌晨00:00定时执行这个脚本
#--1.编辑计划任务 crontab -e #--2.复制以下 00 00 * * * /bin/bash /opt/nginx/sbin/log_cut.sh #--3.查看crontab计划任务是否启动 systemctl status crond
5.还有其他切割脚本方法,还有例如切割后进行压缩,可参考如下:
https://blog.csdn.net/eagle89/article/details/127394123
https://blog.51cto.com/u_64214/5510025
四、卸载nginx
#--1.卸载Nginx yum remove nginx #--2.查看Nginx是否还存在 which nginx
五.常用命令
命令 | 说明 |
---|---|
nginx -v | 显示版本信息并退出 |
nginx -V | 示版本和配置选项信息,然后退出 |
nginx -t | 检查配置文件nginx.conf |
nginx | 启动nginx服务 |
nginx -c /opt/nginx/conf/nginx.conf | 启动nginx服务(加载配置文件) |
nginx -s reopen | 重载日志 |
nginx -s reload | 重载Nginx配置文件 |
nginx -s stop | 强制停止Nginx服务 |
nginx -s quit | 优雅地停止Nginx服务 |
六.我的配置
SSL证书
#user nobody; worker_processes 32; #----------工作进程个数,可配置多个(一般等于CPU的总核数或总核数的两倍,例如两个四核CPU,则综合数为8.通过命令ps -ef|grep nginx可以看出来设置的是几个) worker_rlimit_nofile 10240; events { worker_connections 10240; #----------单个进程最大连接数 } error_log /opt/nginx/logs/error.log info; #----------指定错误日志存放的路径,错误日志记录级别可选项为:[debug|info|notice|warn|error|crit],默认是crit,记录的日志数量从crit到debug pid /opt/nginx/logs/nginx.pid; #----------指定pid存放的路径(pid 进程控制符。即代表了各进程的进程ID,也就是说,PID就是各进程的身份标识) http { include mime.types; default_type application/octet-stream; server_tokens off; #----------隐藏版本号 access_log /opt/nginx/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的长连接超时时间 keepalive_requests 10000; #---------- 设置一个keep-alive连接上可以服务的请求的最大数量,当最大请求数量达到时,连接被关闭。默认是100 proxy_connect_timeout 90; #---------nginx跟后端服务器连接超时时间(代理连接超时) proxy_read_timeout 90; proxy_send_timeout 90; ##---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 zyydh{ #---------- 集群配置(这里设置集群名称为test) upstream设置,设置代理服务器(负载均衡池),默认的负载均衡方式是轮询,另外一种是ip_hash #max_fails=1 fail_timeout=10s server 172.26.111.2:80 weight=1 max_fails=5 fail_timeout=300 ; #---------- weight为权重,不写默认为1:1 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 server 172.26.111.3:80 weight=1 max_fails=5 fail_timeout=300 ; #---------- max_fails、fail_timeout ip_hash; ip_hash; keepalive 1000; } #------监听80端口,HTTP请求重定向到HTTPS server { listen 80; server_name aaa.bbb.cn; rewrite ^(.*)$ https://aaa.bbb.cn:443$1 permanent; #rewrite ^(.*)$ https://${server_name}$1 permanent; #---这里${server_name}写证书绑定的域名 } #------监听80端口,HTTP请求重定向到HTTPS # server { # listen 80; # server_name aaa.bbb.cn; #路由配置 # location / { # proxy_pass http://zyydh; #----------将定向的路径转到访问你服务器集群上(对应上面设置的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地址 #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; # } # } #------监听443端口,跳转到集群 server { listen 443 ssl; #---------- 监听的端口(默认为443) server_name aaa.bbb.cn; #---------- 主机名称,填写绑定证书的域名 #ssl on; #---开启SSL(nginx 1.15 及以后的版本,不需要再写 ssl on) ssl_certificate SSL/bbb.cn_bundle.crt; #---对应单张证书。指定crt文件所在路径,如果写相对路径,必须把该文件和nginx.conf文件放到一个目录下。 pem 文件路径 ssl_certificate_key SSL/bbb.cn.key; #---对应私钥。 指定key文件所在路径。 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM; #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #---配置ssl加密算法,多个算法用:分隔,ALL表示全部算法,!表示不启用该算法,+表示将该算法排到最后面去。 #ssl_ciphers ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!eNULL; ssl_prefer_server_ciphers on; #---如果不指定默认为off,当为on时,在使用SSLv3和TLS协议时,服务器加密算法将优于客户端加密算法。 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #---支持的SSL协议标准(nginx默认参数为:ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;) #root xxxxxx; #---直接访问域名时,默认跳转的页面地址。 #client_max_body_size 500m; #--------上传文件最大限制 不设置默认1m #路由配置 location / { proxy_pass http://zyydh; #----------将定向的路径转到访问你服务器集群上(对应上面设置的upstream的集群名称)(upstream设置的是test,故这里写http://test) proxy_http_version 1.1; 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 $proxy_add_x_forwarded_for; #--------- 后端的web服务器可以通过X-Forwarded-For获取真实的IP地址 proxy_set_header X-Forwarded-Proto https; #---参考此地址https://blog.csdn.net/wufangliang/article/details/103331357 proxy_redirect http:// https://; #client_max_body_size 500m; #--------上传文件最大限制 不设置默认1m } # location /nginxStatus { #----------添加的status模块,是查看Nginx的运行状态 # stub_status on; # access_log off; # error_log off; # } } #------注意:如何要再增加监听端口,不要忘了在安全狗上也配置下开通此端口 }
本文来自博客园,作者:东方飘雪,转载请注明原文链接:https://www.cnblogs.com/zdyang/p/17483846.html