nginx十四项配置优化
nginx十三项配置优化
nginx十三项配置优化:
~1、配置nginx隐藏版本号 :【1】已安装过nginx 修改源码包 【2】未安装过nginx 修改配置文件
~2、修改nginx用户与组 :【1】编译安装时指定 【2】修改配置文件
~3、配置nginx网页缓存时间
~4、实现nginx的日志切割 【1】日志存放位置 /usr/local/nginx/logs/access.log 【2】设置周期性计划任务
~5、配置nginx实现连接超时 修改主配置文件 /usr/local/nginx/conf/nginx.conf 这个文件的原文件内容在 /usr/src/nginx-1.6.0/conf/nginx.conf 文件
~6、更改nginx运行进程数 修改配置文件worker_processes参数 【1】全局配置 【2】I/O事键
~7、配置nginx实现网页压缩功能 修改/usr/local/nginx/conf/nginx.conf 文件 nginx的ngx_http_gzip_module 压缩模块提供了对文件内容压缩的功能,
~8、配置nginx实现防盗链功能 【1】资源主机设置防盗链 修改/usr/local/nginx/conf/nginx.conf 文件 主要针对server添加东西
~9、对FPM模块进行参数优化
~10、nginx为目录添加访问控制 【1】用户访问控制 【2】客户端访问控制
~11、自定义错误页面 /usr/local/nginx/conf/nginx.conf 主要修改server文件内容 建立错误页面文件 根据要求定义页面内容
~12、自动索引
~13、通过UA实现手机端和电脑端的分离 【1】移动端访问,实现不同的客户端访问不同内容 【2】不同浏览器访问到不同的页面
========================================================================================================================================
Nginx配置优化
LNMT : Linux nginx mysql tomcat
版本号要是被知道的话,容易被别人发现漏洞
一、配置Nginx隐藏版本号 F12用于检查元素使用的,可以看到 headers
1修改源码包 ,必须在安装之前(测试命令curl -I http://192.168.200.102)
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
tar xf nginx-1.16.1.tar.gz -C /usr/src/
cd /usr/src/nginx-1.16.1/
vim src/core/nginx.h
#define NGINX_VERSION "1.16.1" (修改版本号)
#define NGINX_VER "nginx/" NGINX_VERSION (修改服务名)
2修改配置文件(已安装nginx)
vim /usr/local/nginx/conf/nginx.conf
在http内添加一条,隐藏版本号
22 行 server_tokens off;
(在源码包已经隐藏版本号的情情况下,再修改主配置文件,会显示服务名,但不显示服务版本号)
如果安装php 的话也需要隐藏 php配置文件中配置了fastcgi_param SERVER_SOFTWARE选项,则编辑php-fpm配置文件,将fastcgi_param SERVER_SOFTWARE对应值修改为fastcgi_param SERVER_SOFTWARE nginx;(除了隐藏nginx的版本以外,php的版本也要隐藏)
二、修改Nginx用户与组
nginx 运行时进程需要有用户与组身份的支持,以实现对网站文件读取时进行访问控制。nginx默认使用nobody用户账号与组账号,一般也需要进行修改
useradd -M -s /sbin/nologin nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
2修改配置文件
vim /usr/local/nginx/conf/nginx.conf
user nginx nginx; (修改用户和[组]组可以省略)
killall -HUP nginx、
ps uax |grep nginx 查看进程
三、配置Nginx网页缓存时间
当nginx将网页数据返回给客户端后,可设置资源在客户端缓存的时间,以方便客户端在日后进行相同内容的请求时直接返回,以避免重复请求,加快了访问速度
一般针对静态网页进行设置,对动态网页不用设置缓存时间,因为动态网页在服务器上不是完整的存在
设置方法:可修改配置文件,在http段、或server段、或location段加入对特定内容的过期参数
编辑主配置文件,添加以下内容
vim /usr/local/nginx/conf/nginx.conf
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
expires 1d;
}
location ~ .*\.(js|css)$ { // js|css 表示缓存的文件 //~表示匹配 ~* 表示不区分大小写expires 1h; //表示缓存时间
}
killall -HUP nginx
做个小实验证明 CTRL+F5 表示强制刷新,F5时直接刷新
1、从桌面上传到虚拟机的/usr/local/nginx/html/一个图片 linux.jpg
2、vim /usr/local/nginx/html/index.html
在body 最后一行加上 <img src="linux.jpg" />
保存退出,
3、在浏览器中进行访问192.168.200.66
会出现一个图片
按下F12 或者右键查看网页元素 ,点击查看缓存时间, 然后再用F5刷新再看访问时间
四、实现Nginx的日志切割
输入:tail -f /usr/local/nginx/logs/access.log
再网页中每刷新一次,tail -f /usr/local/nginx/logs/access.log 就会出现一条记录
这样一来 这个日志文件信息会越来越大,所以就有了日志切割,用于分析数据,把文件保存成多份
日志存放位置/usr/local/nginx/logs/access.log
vim /opt/cut_nginx_log.sh
#!/bin/bash
# cut_nginx_log.sh
datetime=$(date -d "-1 day" "+%Y%m%d") (变量为前一天的完整时间)
log_path="/usr/local/nginx/logs" (定义日志存放位置变量)
pid_path="/usr/local/nginx/logs/nginx.pid" (定义PID文件变量)
[ -d $log_path/backup ] || mkdir -p $log_path/backup (如果P没有backup这个文件,则创建)
if [ -f $pid_path ] (如果Nginx在运行,有PID文件)
then
mv $log_path/access.log $log_path/backup/access.log-$datetime (移动现有日志文件到backup内,叫做access.log-一天前的日期)
kill -USR1 $(cat $pid_path) (重新生成新的空白日志文件)
find $log_path/backup -mtime +30 | xargs rm -f (寻找backup内30天修改过的文件删除)
else
echo "Error,Nginx is not working!" | tee -a /var/log/messages (输出Error,Nginx is not working!并且写入系统日志messages内)
fi
chmod +x /opt/cut_nginx_log.sh
设计周期性计划任务
crontab -e
0 0 * * * /opt/cut_nginx_log.sh
检测:
/opt/cut_nginx_log.sh
ls /usr/local/nginx/logs/backup/
killall -9 nginx
/opt/cut_nginx_log.sh //如果报错的话,可以把/usr/local/nginx/logs/nginx.pid文件删除了,再进行执行
tail -1 /var/log/messages
五、配置Nginx实现连接超时
用户每次访问都要重新建立TCP3次握手,4次断开,每访问一次就要响应与断开,增加了服务的资源浪费,
在企业网站中,为了避免客户长时间占用链接,造成服务器资源浪费,可以设置相应的连接超时参数,实现控制连接访问时间
keepalived_timeout: 设置连接保持超时时间,一般可只设置该参数,默认为65秒,可根据网站段的情况设置,或者关闭,可在http段、server段、或者location段设置
client_header_timeout:指定等待客户端发送请求头的超时时间
client_body_timeout :设置请求体读取超时时间
注意:若出现超时,会返回408错误
修改主配置文件 vim /usr/local/nginx/conf/nginx.conf
在http内添加
34 keepalive_timeout 65; (设置连接保持超时时间,一般可只设置该参数,默认为65秒,可根据网站的情况设置,或者关闭,可在http段、server段、或者location段设置。)
35 client_header_timeout 60; (指定等待客户端发送请求头的超时时间。)
36 client_body_timeout 60; (设置请求体读取超时时间。)
nginx -t
killall -HUP nginx
六、更改Nginx运行进程数
修改配置文件的worker_processes参数,一般设置为CPU的个数或者核数(也可两倍)
一般物理的服务器来说,两个CPU ,每个CPU 8核,一共是16核
默认nginx的多个进程可能更多的跑在一颗CPU上,可以分配不同的进程给不同的CPU处理,充分利用硬件多核多CPU,在一台4核物理服务器,可以进行下面的配置,将进程进行分配
3 worker_processes 4;
4 worker_cpu_affinity 0001 0010 0100 1000 ;
注意这两个要一一对应
1 全局配置 (在括号之外的内容)
user nginx [nginx]; 运行用户(nginx组可以不用写)
worker_processes 2; 指定工作进程数量 (一般都是按照核心数指定一比一)
worker_cpu_affinity 01 10; (指定CUP分配。如果四核0001 0010 0100 1000)
worker_rlimit_nofile 102400; (指定Nginx一个进程打开的最多文件数目,理论值应该是最多打开文件数【ulimit -n查看,修改:ulimit -n 新值】【ulimit -u 最大用户进程数,修改:ulimit -u 新值】这两个值最好一样,现在是临时修改,永久修改把这两条命令放在/etc/profile内)
error_log logs/error.log; (错误日志存放位置)
pid logs/nginx.pid; (进程PID存放位置)
2 I/O事键 (events括号内的内容)
use epoll; (使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能)
worker_connections 1024; (工作连接数量,一般工作中配置为4096。单个工作进程并发数量,服务器总并发数量为工作进程数X工作连接数)
killall -HUP nginx
七、配置Nginx实现网页压缩功能
nginx 的ngx_http_gzip_module 压缩模块提供了对文件内容的压缩的功能,允许nginx服务器将输出内容发送至客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,模块默认已经安装
nginx -v //查看nginx版本信息
nginx -V // 查看安装时./configure 的信息
在http内添加
Nginx的ngx_http_gzip_module压缩模块提供了对文件内容压缩的功能,允许nginx服务器将输出内容发送到客户端之前进行压缩
修改主配置文件 vim /usr/local/nginx/conf/nginx.conf
38 gzip on; (开启gzip压缩输出)
39 gzip_min_length 1k; (用于设置允许压缩的页面最小字节数【大于1K文件要压缩】)
40 gzip_buffers 4 16k; (表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来储存gzip压缩结果)
41 gzip_http_version 1.1; (设置识别http协议版本,默认是1.1)
42 gzip_comp_level 2; (gzip压缩比,1-9等级)
43 gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss; (压缩类型,是就对哪些网页文档启用压缩功能)
44 #gzip_vary on; (选项可以让前端的缓存服务器经过gzip压缩的页面)
killall -HUP nginx
八、配置Nginx实现防盗链功能
资源主机设置防盗链
盗链例子: 比如说打开网页后,A服务器由图片,B服务器没有图片,但是B服务器也想用图片,但是又不想增加自己服务器的流量压力,所以就复制了A服务器的图片连接,并添加到自己的html中,也即/usr/local/nginx/html/index.html 这个文件中,
然后用户访问B服务器时就会访问到A服务器上,这样就会造成A服务器,访问流量超标,导致压力很大,这就是资源盗链。
配置说明:
valid_referers 设置信任网站
none 浏览器中referer(Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理)为空的情况,就直接在浏览器访问图片
blocked referer不为空的情况,但是值被代理或防火墙删除了,这些值不以http://或https://开头
修改主配置文件 vim /usr/local/nginx/conf/nginx.conf
在server内添加
location ~* \.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ { (匹配以这些格式结尾的)
valid_referers none blocked *.source.com source.com; (设置信任的网站)
if ($invalid_referer) { (判断除了信任以外的)
rewrite ^/ http://www.source.com/error.jpg; (转到一个错误图片上)
#return 403;
}
}
killall -HUP nginx
九、对FPM模块进行参数优化
Nginx的PHP解析功能实现,如果时交由FPM(fastcgi 进程管理器)处理的,为了提高PHP的处理速度,可对FPM模块进行参数跳转
FPM优化参数:
pm (使用哪种方式启动fpm进程,可以说static(静态)和daynamic(动态),前者将产生固定数量的fpm进程,后者以动态的方式产生fpm进程)
pm._max_children (static放手机下开启的fpm进程数)
pm.start_servers (动态方式下初始的fpm进程数量)
pm.min_spare_servers (动态方式下最最小的fpm空闲进程数)
pm.max_spare_servers (动态方式下最大的fpm空闲进程数)
vim /usr/local/php5/etc/php-fpm.conf
pm = dynamic
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
十、Nginx为目录添加访问控制
用户访问控制:使用apache的htpasswd创建密码文件
两种认证方式: 基本认证(基准认证)
摘要认证
yum -y install httpd-tools (安装httpd-tools) //可以用rpm -qt $(which htpasswd)
htpasswd -c /usr/local/nginx/.htpasswd crushlinux //-c创键,但只用创建一次就可以了 (指定一个保存用户和密码的位置 。-c是创建,如果创建一次之后,以后不可以再加-c,会覆盖原文件)
htpasswd /usr/local/nginx/.htpasswd admin //创建多个用户,不需要用-c指定
vim /usr/local/nginx/conf/nginx.conf
location /admin {
stub_status on;
access_log off;
auth_basic "Nginx Admin"; //jai (basic为认证类型,一种为摘要认证,另一种为基本【基准认证】认证,basic为基本认证,摘要 认证很多浏览器不支持)
auth_basic_user_file /usr/local/nginx/.htpasswd; (指定认证文件名)
}
nginx -t
killall -HUP nginx
在浏览器中进行验证,输入www.source.com/admin
会出现用户验证的页面
客户端地址访问控制:
vim /usr/local/nginx/conf/nginx.conf
location ~ /status {
stub_status on;
access_log off;
auth_basic "Nginx Status"; //jai (basic为认证类型,一种为摘要认证,另一种为基本【基准认证】认证,basic为基本认证,摘要 认证很多浏览器不支持)
auth_basic_user_file /usr/local/nginx/.htpasswd; (指定认证文件名)
allow 192.168.200.2; //允许 访问
deny 192.168.200.0/24; //拒绝 访问
}
nginx -t
killall -HUP nginx
在上一条location里添加
allow IP; (允许IP)
deny IP; (拒绝IP)
也可添加网段短格式,192.168.200.0/24
在网页中进行测试 192.168.200.66/admin
会报错误状态码
404 页面找不到
401 用户名密码验证错误
403 地址被拒绝
408 连接超时
十一、自定义错误页面
首次在/usr/local/nginx/html 文件内上传一个自定义的错误页面
vim /usr/local/nginx/conf/nginx.conf
在server内添加
error_page 403 404 /404.html;
location = /404.html {
root html;
}
建立错误 页面文件(根据要求定义页面内容)
vim /usr/local/nginx/html/404.html
<img src="文件名" />
保存退出
nginx -t
killall -HUP nginx
十二、自动索引
类似做一个下载站
mkdir /usr/local/nginx/html/mirrors
cd /usr/local/nginx/html/mirrors/
mkdir {3..7}.{1..9}
cd 7.9
ls
touch Centos7.9.iso
cd
// cd /usr/local/nginx/html/ (进入nginx网页存放目录)
//mkdir 123/abc{1..10} -p (在文件夹内创建abc1-10个文件夹)
//touch 123/abc1/1.txt (建立测试文件)
编辑主配置文件
vim /usr/local/nginx/conf/nginx.conf
在server内添加
location /mirrors {
autoindex on;
}
nginx -t
killall -HUP nginx
当访问www.source.com/mirrors的时候会显 示目录,点击可以下载目录内内容
十三、通过UA实现手机端和电脑端的分离
实现nginx区分pc和手机访问不同的网站,是物理上完全隔离的两套网站(一套是移动端、一套是PC端),这样带来的好处PC端和移动端的内容可以不一样,移动版网站不需要包含特别多的内容,只要包含必要的文字和较小的图片,这样会更节省流量,但同时也会增加困难,难题就是需要维护两套环境,并且需要自动识别出来用户的物理设备并
跳转到相应的网站,当判断错误时用户可以自己手动切换回正确的网站
做法:
有两套网站代码,一套PC版放在/usr/loca/nginx/html/web,一套移动版放在/usr/local/nginx/html/mobile 只需要修改nginx的配置文件,nginx通过UA来判断是否来自移动端的访问,实现不同的客户端访问不同内容
1移动端访问,实现不同的客户端访问不同内容(判断 $http_user_agent 【有浏览器和客户端相关信息】变量)
cd /usr/local/nginx/html (进入网页存放目录)
mkdir web mobile (建立两个文件夹)
vim web/index.html (建立pc端访问页面)
vim mobile/index.html (建立手机端访问页面)
vim /usr/local/nginx/conf/nginx.conf (修改主配置文件)
location / {
root /usr/local/nginx/html/web; (默认PC端访问内容)
if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )
{
root /usr/local/nginx/html/mobile; ( 如果是手机移动端访问内容)
}
index index.html index.htm;
}
killall -HUP nginx
2不同浏览器访问到不同的页面
location / {
if ($http_user_agent ~ Firefox) { (如果浏览器匹配Firefox访问firefox)
root /usr/local/nginx/html/firefox;
}
if ($http_user_agent ~ MSIE) { (如果浏览器匹配MISE访问msie)
root /usr/local/nginx/html/msie;
}
index index.html index.htm;
}
nginx -t
cd /usr/local/nginx/html
mkdir firefox msie
echo "hello,firefox" >firefox/index.html
echo "hello,msie" >msie/index.html
killall -HUP nginx
十四、nginx平滑升级版本
1、nginx平滑升级概述
随着网站并发访问量越来越高,nginx web服务器也越来越流行,nginx版本换代越来越频繁,
1.15.2版本的nginx更新了许多新功能,生产环境中版本升级必然的,但是线上业务不能停,此时nginx的升级就是运维的重要工作了。
2、nginx平滑升级原理
多进程模式下的请求分配方式
nginx默认工作在多进程模式下,即主进程(master process)启动后完成配置加载和端口绑定等工作,fork出指定数量的工作进程(worker process),这些子进程回持有监听端口的文件描述符(fd),并通过在该
描述符上添加监听事件来接受连接(accpet)。
3、信号的接收和处理
nginx主进程在启动完成后会进入等待状态,负责响应各类系统消息,如:SIGCHLD、SIGHUP、SIGUSR2等
nginx信号简介:
主进程支持的信号
TERM INT : 立即退出
QUIT: 等待工作进程结束后再退出
KILL:强制终止进程
HUP:重新加载配置文件,使用新的配置启动工作进程,并逐步关闭旧进程
USR1:重新打开日志文件
USR2:启动新的主进程,实现热升级
WINCH: 逐步关闭工作进程
工作进程支持的信号:
TERM,INT :立即退出
QUIT: 等待请求处理结果后再退出
USR1:重新打开日志文件
nginx 平滑升级实战:
[1]、首先nginx旧版本的正常安装
yum -y install pcre-devel zlib-devel
ll nginx-*
useradd -M -s /sbin/nologin nginx
tar xf nginx-1.14.2.tar.gz -C /usr/src/
cd /usr/src/nginx-1.14.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_flv_module --with-http_gzip_static_module && make && make install
/usr/local/nginx/sbin/nginx
netstat -anpt | grep :80
elinks -dump http://localhost
nginx -V //查看旧版nginx的编译参数
[2]、编译新版本nginx源码包,安装路径需与旧版本一致,注意:不要执行make install
tar xf nginx-1.15.9.tar.gz -C /usr/src/
cd /usr/src/nginx-1.15.9/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_flv_module --with-http_gzip_static_module && make
//不要加make install ,作用是把make编译的配置项添加到指定文件中
[3]、备份二进制文件,用新版本的替换
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
ls objs/
cp objs/nginx /usr/local/nginx/sbin/
ll /usr/local/nginx/sbin/
[4]、确保配置文件无报错
nginx -t
[5]、发送USR2信号 目的是产生新版本的工作进程
向主程序(master)发送USR2信号,nginx会启动一个新版本的master进程和对应工作进程,和旧版本一起处理请求
ps aux |grep nginx //查看旧的nginx进程
kill -USR2 70556
ps aux |grep nginx
killall -USR2 nginx
业务不能断进行nginx升级
[6] 发送WINCH信号 让主进程在它手下的进程逐步退出
向旧的nginx主进程(master)发送WINCH信号,它会逐步关闭自己的工作进程(主进程不退出),这时所有的请求都会由新版的nginx处理
kill -WINCH 4108
ps aux | grep nginx |grep -v grep
如果这时需要退回继续使用旧版本,可向旧的nginx主进程发送HUP信号,它会重新启动工作进程,仍使用旧版本配置文件,然后可以将新版nginx进程杀死(使用QUIT、TERM、或者是 KILL)
kill -HUP 4108
[7]、发送QUIT信号 让master进程退出
升级完毕,可向旧的nginx主进程(master)发送(QUIT、TERM、或者KILL)信号,使旧的主进程退出
kill -QUIT 4108
ps aux| grep nginx| grep -v grep
[8]、验证nginx版本号,并访问测试
/user/local/nginx/sbin/nginx -v
CPU相关信息查看
查看cpu型号
grep "model name" /proc/cpuinfo |uniq
dmidecode -s processor-version | uniq
查询物理CPU个数
grep 'physical id' /proc/cpuinfo | sort -u |wc -l
grep 'physical id' /proc/cpuinfo | uniq |wc -l
查看cpu核心数
grep 'core id' /proc/cpuinfo | sort -u |wc -l
grep 'core id' /proc/cpuinfo | uniq |wc -l
查看cpu线程数
grep 'processor' /proc/cpuinfo | sort -u |wc -l
grep 'processor' /proc/cpuinfo | uniq |wc -l
df -Th
mii-tool ens32