一、nginx安装
1.1安装包下载路径
SSL功能需要openssl库,下载地址:http://www.openssl.org/
gzip模块需要zlib库,下载地址:http://www.zlib.net/
rewrite模块需要pcre库,下载地址:http://www.pcre.org/
Nginx的安装包:下载地址为:http://nginx.org/en/download.html
1.2 解压
yum -y install gcc gcc-c++
tar xf openssl-1.1.1w.tar.gz
tar xf pcre-8.45.tar.gz
tar xf zlib-1.2.13.tar.gz
tar xf nginx-1.24.0.tar.gz
1.3 编译
./configure --prefix=/data/nginx --with-http_ssl_module --with-pcre=/data/soft/pcre-8.45 --with-zlib=/data/soft/zlib-1.2.13 --with-openssl=/data/soft/openssl-1.1.1w
1.4 安装
make && make install
二、nginx优化
2.1 开启高效传输模式
# 在nginx.conf配置文件中
sendfile on;
tcp_nopush on; # 取消此注释
# sendfile on;
开启高效文件传输模式,sendfile指令nginx是否调用sendfile函数来传输,输出文件,当nginx是一个静态文件服务器时,开启sendfile配置项能大大提高nginx性能
# tcp_nopush no;
在sendfile开启模式才有效,防止网络阻塞,积极的减少网络报文的数量
2.2 长连接超时时间
# 主要目的是CPU,内存,控制连接数,因为建立连接也是需要消耗资源的
# 在nginx.conf配置文件中
keepalive_timeout 65;
# keepalived_timeout 与client的keep-alive连接超时时间,单位是秒,服务器和客户端无交互后将在这个时间后关闭连接,长连接可以减少重建连接的开销,如果设置时间过长,用户又多,长时间保持连接会占用大量资源。
2.3 文件上传大小控制
# 在nginx.conf配置文件中http下
client_max_body_size 10m;
2.4 gzip调优
- 启用gzip功能
#使用gzip压缩功能,可为我们节约带宽,加快传输速度,有更好的体验,节约成本;Nginx启用压缩功能需要用ngx_http_gzip_module模块,apache使用的是mod_deflate;一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的!
# 在nginx.conf配置文件中http{}区域添加
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/css text/xml application/javascript;
gzip_vary on;
# 参数说明
gzip on; #开启压缩功能
gzip_min_length 1k; #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length(内容长度)中获取,默认值是0,建议设置成大于1K,如果小于1K可能会越压越大。
gzip_buffers 4 32k; #压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
gzip_http_version 1.1; #压缩版本,用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。
gzip_comp_level 6; #压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。
gzip_types text/css text/xml application/javascript; #用来指定压缩的类型,‘text/html’类型总是会被压缩
默认值: gzip_types text/html (默认不对js/css文件进行压缩)
#不能使用通配符 text/*
#(不论是否指定)text/html 默认压缩
# 设置压缩哪种文本文件可参考 conf/mime.types
gzip_vary on; #启用应答头"Vary: Accept-Encoding"。和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩。其实cdn,代理服务器,原理上都是代理服务器。他们一般以url为key值进行缓存。而vary属性的设置,告诉了代理根据url缓存的同时,vary的信息也作为key。比如客户端(浏览器)请求的信息里带上了Accept-Encoding:gzip 则返回压缩副本。如果没有带这个头信息,默认返回非压缩副本。
2.5 expires缓存
# 缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的扩展名列出来!
在nginx.conf配置文件中server区域下
1. 以扩展名区分
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 365d;
}
location ~ .*\.(js|css)?$ {
expires 30d;
}
2.对目录及其进行判断
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
location ~ (robots.txt) {
expires 7d;
break;
}
2.6 去掉不需要的日志统计
健康检查的日志,不用输入到log中,这些日志没有意义,分析的话只需要分析访问日志,看看一些页面链接,如200,301,404的状态,在SEO中很重要,如我们统计pv是页面计算,法尔消耗了磁盘IO,降低了服务器的性能
# 在nginx.conf配置文件server下
location ~ .*\.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF)$ {
access_log off; #对以上.结尾的文件不做日志记录
}
2.7 目录文件访问控制
主要用在禁止目录下制定文件被访问
# 例如:1.进制访问images下php程序文件
# 在nginx.conf 配置文件中
location ~ ^/images/.*\.(php|php5|sh|py|pl)$ {
deny all; #对 images 下以.结尾文件禁止访问
}
# 多个目录书写方法
location ~ ^/images/(attachment|avatar)/.*\.(php|php5|sh|py|py)$ {
deny all;
}
2.8 对方问来源控制
需要ngx_http_access_module模块支持,默认安装
location ~ ^/(aa)/ {
allow 192.168.233.0/24; #允许233.0网段IP访问
deny all;
}
location /bb/ { return 403 ; }
针对整个网站根目录访问控制
location ~ / {
allow 192.168.233.0/24; #可以写IP段,也可以写IP
deny all;
}
2.9 隐藏版本号
在nginx.conf配置文件中,http区域下添加
server_tokens off;
三、 nginx升级
3.1 查看现有nginx版本
ps -ef|grep nginx
/usr/local/nginx/sbin/nginx -V #查看编译参数
3.2 解压编译安装
tar xf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure 编译参数
make # 不进行make install
3.3 备份就版本nginx执行文件
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx$(date +F)
3.4 拷贝新版本nginx执行文件
cp /data/soft/nginx/objs/nginx /usr/local/nginx/sbin/
3.5 执行升级
3.5.1 方法一
使用nginx自带升级方法更新升级
cd nginx-1.24.0
make upgrade
# 不报错的话说明更新成功了,然后查看nginx版本
/usr/local/nginx/sbin/nginx -V
如果遇见下面错误,需要将nginx服务停掉,然后使用绝对路径重新启动即可
[root@localhost nginx-1.22.0]# make upgrade
/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/lcoal/nginx/conf/nginx.conf test is successful
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
/bin/sh: line 0: kill: (13716) - No such process
make: *** [upgrade] Error 1
[root@localhost nginx-1.22.0]#
ps -ef|grep nginx
kill -9 nginx进程pid # 杀掉nginx所有进程
cd /usr/local/nginx/sbin
./nginx
cd /data/soft/nginx-1.24.0/
make upgrade
3.5.2 方法二
- 向master进程发送USR2信号,告知版本升级,旧master进程首先将logs/nginx.pid文件重命名为nginx.pid.oldbin,然后运行新版本nginx二进制文件,启动新master进程,新master进程启动新worker进程,其中新master进程的父进程是旧master进程
ps -ef|grep nginx
kill -USR2 [old-master-pid]
- 向master进程发送WINCH信号,告知其优雅关闭worker进程,但旧master进程不会自动退出
kill -WINCH [old-master-pid]
- 如果确认worker进程正常工作,可以向旧master进程发送QUIT信号,告知其自动退出
kill -QUIT [old-master-pid]
- 查看升级后nginx版本
/usr/local/nginx/sbin/nginx -V
四、日志切割
#!/bin/bash
# Date:2022-3-9
# Author:lizexin
# version:1.0
# Explain:Nginx log slicing script.
# 路径
Log_Path=/usr/local/nginx/logs
# 获取昨天的日期
YESTERDAY=$(date -d "yesterday" +%Y%m%d)
# PID文件路径
Log_PID=/usr/local/nginx/logs/nginx.pid
# 分割日志
mv ${Log_Path}/access.log ${Log_Path}/access_${YESTERDAY}.log
mv ${Log_Path}/error.log ${Log_Path}/error_${YESTERDAY}.log
# 向Nginx主进程发送USR1信号,重新打开日志文件
kill -USR1 `cat ${Log_PID}`
五、配置ssl证书
1. 进入nginx安装目录
cd /data/nginx
# 新建cert子目录,将证书上传至此目录
mkdir cert
server.crt
server.key
2. 修改配置文件
# 1.将https的server块前面的注释符号#去掉
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /data/nginx/cert/server.crt; # 修改此处两行内容
ssl_certificate_key /data/nginx/cert/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
# 2. 开启http转发https功能
server {
listen 80;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
3. 重启验证
/data/nginx/sbin/nginx -t
/data/nginx/sbin/nginx -s reload