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配置优化

LNMMP :Linux Nginx Mysql Memcached (为mysql做缓存的 用于缓解压力的)Php
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用户账号与组账号,一般也需要进行修改
1编译安装时指定  
 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运行进程数
在高并发场景,需要启动更多的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不同浏览器访问到不同的页面
vim /usr/local/nginx/conf/nginx.conf
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
注意:回滚步骤,发送HUP信号
如果这时需要退回继续使用旧版本,可向旧的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
USR1重新写新的日志
=======================================
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
free -m
df -Th
mii-tool ens32
原文地址:https://www.cnblogs.com/elin989898/p/11871391.html