Web服务器Nginx企业级优化

部署Nginx软件

1)安装支持软件:

Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利完成。

[root@nginx~]#systemctl stop firewalld

[root@nginx~]#iptables -F

[root@nginx~]#setenforce 0

[root@nginx~]# yum -y install pcre-devel zlib-devel  openssl-devel

2)创建运行用户、组:

Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性、降低安全风险。如:创建一个名为nginx的用户,不建立宿主目录,也禁止登录到shell环境。

[root@nginx~]#useradd -M -s /sbin/nologin nginx

指定shell  /sbin/noligin  是不允许用户登录的意思

3)编译安装nginx:

释放nginx源码包

[root@nginx~]# tar xf nginx-1.16.0.tar.gz  -C /usr/src/

4)配置编译:

[root@nginx~]# cd /usr/src/nginx-1.16.1/

[root@nginxnginx-1.14.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module  --with-http_ssl_module  --with-http_flv_module    --with-http_gzip_static_module && make && make install

注:配置前可以参考:./configure --help给出说明

l  --prefix               设定Nginx的安装目录

l  --user和--group       指定Nginx运行用户和组

l  --with-http_stub_status_module     启用http_stub_status_module模块以支持状态统计

l  --with-http_ssl_module    启用SSL模块

l  --with-http_flv_module    启用FLV模块,提供寻求内存使用基于时间的偏移量文件

为了使Nginx服务器的运行更加方便,可以为主程序nginx创建链接文件,以便管理员直接执行nginx命令就可以调用Nginx的主程序。

[root@nginxnginx-1.14.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/

[root@nginxnginx-1.14.2]#ll /usr/local/sbin

lrwxrwxrwx 1 root root 27 12-29 07:24 /usr/local/sbin-> /usr/local/nginx/sbin/nginx

5)Nginx的运行控制:

与Apache的主程序httpd类似,Nginx的主程序也提供了"-t"选项用来对配置文件进行检查,以便找出不当或错误的配置。配置文件nginx.conf默认位于安装目录/usr/local/nginx/conf/目录中。若要检查位于其他位置的配置文件,可使用"-c"选项来指定路径。

[root@nginxconf]#nginx -t

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

6)启动、停止Nginx:

直接运行nginx即可启动Nginx服务器,这种方式将使用默认的配置文件,若要改用其他配置文件,需添加"-c 配置文件路径"选项来指定路径。需要注意的是,若服务器中已安装有httpd等其他WEB服务软件,应采取措施(修改端口,停用或卸载其他软件)避免部突。

[root@nginxconf]# netstat -anpt |grep :80

[root@nginxconf]#nginx

[root@nginxconf]# netstat -anpt |grep :80

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      6810/nginx: master  

一。配置Nginx隐藏版本号

在生产环境中,需要隐藏Nginx的版本号,以避免安全漏洞的泄露

需要记住三个命令

1.    elinks –dump 本机IP

2.       curl -I 本机IP

3.       lynx 本机IP

查看ngxin版本及型号

 

[root@localhost ~]# curl -I 192.168.200.112
HTTP/1.1 200 OK     
Server: nginx/1.16.0   ##nginx版本号

1。。若是已安装ngxin的情况修改源码包

####清理已安装包及配置文件

[root@localhost ~]# rm -rf /usr/local/nginx/
[root@localhost ~]# cd /usr/src/nginx-1.16.0/
[root@localhost nginx-1.16.0]# make clean
rm -rf Makefile objs
[root@localhost nginx-1.16.0]# cd
[root@localhost ~]# rm -rf /usr/src/nginx-1.16.0/

####重新安装修改

[root@localhost ~]# tar xf nginx-1.16.0.tar.gz -C /usr/src/

[root@localhost ~]# vim /usr/src/nginx-1.16.0/src/core/nginx.h 

修改nginx版本为8.8.8.8

网页版本为乱码

[root@localhost ~]# cd /usr/src/nginx-1.16.0/
[root@localhost nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module && make && make install

[root@localhost nginx-1.16.0]# /usr/local/nginx/sbin/nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()

 2.直接修改配置文件

[root@localhost ~]# ln -s /usr/local/nginx/conf/nginx.conf /etc/nginx.conf   ##因为需要经常需要修改这个配置文件所以做个软链接方便

[root@localhost ~]# vim /etc/nginx.conf

28行添加 :

server_tokens off;

[root@localhost ~]# killall -1 nginx

[root@localhost ~]# curl -I 192.168.200.112
HTTP/1.1 200 OK
Server: nginx             ###Server变成了nginx,隐藏成功
Date: Fri, 13 Sep 2019 01:07:52 GMT   

 测试成功

如果php配置文件中配置了 fastcgi_param SERVER_SOFTWARE 选项,则编辑php-fpm配置文件,将fastcgi_param SERVER_SOFTWARE 对应值修改为fastcgi_param SERVER_SOFTWARE nginx

 二。修改Nginx用户与组

Nginx运行时进程需要有用户与组身份的支持,以实现对网站文件读取时进行访问控制。Nginx默认使用nobody用户账号与组账号,一般需要修改。

 前面基本修改

[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# killall -1 nginx

[root@localhost ~]# ps -aux |grep nginx
root 34425 0.0 0.1 47544 1956 ? Ss 08:58 0:00 nginx: master process nginx
nginx 34763 0.0 0.1 50088 2004 ? S 09:26 0:00 nginx: worker process     ##配置文件worker_processes 修改的是2 所以有两个进程
nginx 34764 0.0 0.1 50088 2004 ? S 09:26 0:00 nginx: worker process    ##
root 34768 0.0 0.0 112656 972 pts/1 R+ 09:26 0:00 grep --color=auto nginx

三。配置Nginx网页缓存时间

当Nginx将网页数据返回给客户端后,可设置资源在客户端缓存的时间,以方便客户端在日后进行相同内容的请求直接返回,以避免重复请求,加快了访问速度,一般针对静态网页进行设置,对动态网页不用设置缓存时间

方法:

 expires 1d;   ##缓存时间为一天

[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@localhost ~]# killall -1 nginx

测试:

[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# ls
50x.html index.html
[root@localhost html]# rz

[root@localhost html]# ls
50x.html index.html linux.jpg
[root@localhost html]# vim index.html

<img src="linux.jpg">    

 在</body>  内添加

[root@localhost html]# killall -1 nginx

 

 在谷歌浏览器中按F12 出现这个,很明显图片加载时间比文字加载时间长

 第二次加载时间为0,说明已经被缓存,执行成功!

 查看信息,最大缓存时间86400s=1D,完成

有个技巧Ctrl+F5刷新,图片不从缓存中取

八。实现Ngnxin日志切割

需要用脚本实现

nginx

#!/bin/bash

#fenge.sh

datetime=$(date -d "-1 day" "+%Y%m%d")     ##前一天的年月日

log_path="/usr/local/nginx/logs"     ##Nginx的日志文件

pid_path="/usr/local/nginx/logs/nginx.pid"    ##Nginx进程号

[ -d $log_path/backup ] || mkdir -p $logs_path/backup    ##-d判断是不是目录

if [ -f $pid_path ];then              ##-f判断是不是文件

        mv $log_path/access.log  $log_path/backup/access.log-$datetime   ##移动到backup下并以时间戳来命名

        kill -USR1 $(cat $pid_path)    ##产生新的日志文件

        find $log_path/backup -mtime +30 | xargs rm - f   ##找出backup中30天前改动过的文件 ,并删除,意思就是指保留30的日志文件

else

        echo "Error,Nginx is not working!" | tee -a /var/log/messages  ##如果没有pid号说明nginx为启动

fi

[root@localhost ~]# bash /opt/fenge.sh

[root@localhost ~]# ls /usr/local/nginx/logs/backup/
access.log-20190912

成功

[root@localhost ~]# killall -9 nginx

[root@localhost ~]# rm -rf /usr/local/nginx/logs/nginx.pid   ##必须删掉pid号否则报错 
[root@localhost ~]# bash /opt/fenge.sh
Error,Nginx is not working!

[root@localhost ~]# nginx 

四。配置Nginx实现连接超时

在企业网站中,为了避免同一个客户长时间占用连接,造成服务器浪费,可以设置相应的连接超时参数,实现控制连接访问时间

keepalived_timeout:设置连接保持超时时间,一般只可设置该参数,默认为65秒,可根据网站的情况设置,或者关闭,可在http段,server段,或者location段设置

client_header_timeout:指定等待客户端发送请求头的超时时间。

Client_dody_timeout:设置请求体读取超时时间

注意:若出现超时,会出现408报错

[root@localhost logs]# vim /etc/nginx.conf 

[root@localhost logs]# killall -1 nginx

五。更改Nginx运行进程数

在高并发场景,需要启动更多的ngin进程以保证快速影响,以处理用户的请求,避免造成阻塞

修改配置文件的worker_processes参数,一般设置为CPU的个数或者核数的2倍

[root@localhost logs]# grep 'core id' /proc/cpuinfo |uniq |wc -l   ##查看CPU内核个数
1

[root@localhost ~]# vim /etc/nginx.conf   ##

worker_processes  2; 

worker_cpu_affinity 01 10;   ##CPU进程核心分配 如果是四核orker_processes  4; 那么就是0001 0010 0100 1000

[root@localhost logs]# killall -1 nginx

六。配置Nginx实现网页压缩功能

Nginx的nginx_http_gzip_module压缩模块提供了对文件内容压缩的功能,允许nginx服务器将输出内容发送到客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,模块默认已经安装

在   http     中添加

[root@localhost ~]# vim /etc/nginx.conf

gzip on;            ##开启gzip压缩输出
gzip_min_length 1k;   ##
用于设置允许压缩的页面最小字节数
gzip_buffers 4 16k;    ##
表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来储存gzip压缩结果
gzip_http_version 1.1;   ##
设置识别http协议版本,默认是1.1
gzip_comp_level 2;   ##gzip
压缩比,1-9等级
gzip_types text/plain test/jiavascript application/x-javasciript text/css text/xml application/xml application/xml+rss;  ##
压缩类型,是就对哪些网页文档启用压缩功能

[root@localhost logs]# killall -1 nginx

七。配置Nginx实现防盗链功能

实验环境:

资源主机 www.source.com  192.168.200.111

盗链主机 www.steal.com   192.168.200.112

首先登录192.168.200.111复制图片链接地址

修改112的inxde.html

添加<img src="http://192.168.200.111/linux.jpg">

 修改物理机的host文件

资源主机111设置防盗链

       location ~* .(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ {

           valid_referers none blocked *.source.com source.com;    ##信任的网站是*.source.com

           if ($invalid_referer) {

               rewrite ^/ http://www.source.com/error.txt;       ##不信任的网站让他们访问html下得error.txt

       }

valid_referers:设置信任网站

none:浏览器中referer为空的情况,就直接在浏览器访问图片

blocked referer不为空的情况,但是值被代理或防火墙删除了,这些值不以http//https//开头

[root@localhost ~]# vim /usr/local/nginx/html/error.txt

<h1>禁止盗链</h1>

[root@localhost ~]# killall -1 nginx

 盗链设置成功

八。对FPM模块进行参数优化

FPM优化参数:

pm                      使用哪种方式启动fpm进程,可以说static和dynamic,前者将产生固定数量的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为目录添加访问控制

用户访问控制:使用apche的htpasswd  来创建密码文件

基本认证(基准认证)

摘要认证

[root@localhost ~]# yum -y install httpd-tools

[root@localhost ~]# htpasswd -c /usr/local/nginx/.user crushlinux  ##这个是用户

New password:

Re-type new password:

Adding password for user crushlinux

[root@localhost ~]# cat /usr/local/nginx/.user

crushlinux:$apr1$Z1NC7BgP$2m8JBWCxCD7Qa7KQulL1m/

注意:第一次创建用户可以用-c  第二次创建就不需要创建了,若是还用-c 那么后面的用户就把前面的用户替代了

location /admin {

            stub_status on;

            access_log off;

            auth_basic "Nginx Admin" ;    ##认证方式基本认证

            auth_basic_user_file /usr/local/nginx/.user;     ##用户所存的位置目录

                          }

[root@localhost ~]# killall -1 nginx

客户端地址访问控制

location /admin {

            stub_status on;

            access_log off;

            auth_basic "Nginx Status" ;    ##认证方式基本认证

            auth_basic_user_file /usr/local/nginx/con/.user;     ##用户所存的位置目录

            allow 192.168.200.0/24;    ##允许哪个网段登录(可以不填,这样的话什么网段都可以登录)

                            deny 192.168.200.100;    ##拒绝这个IP地址访问

                          }

十。自定义错误页面

 

 换个404界面,上传到html目录下

 

 十一。自动索引

修改配置文件

location /mirrors {
autoindex on;
}

killall -1 nginx

[root@localhost html]# mkdir mirrors

[root@localhost html]# cd mirrors/
[root@localhost mirrors]# mkdir {3..9}.{1..9}

[root@localhost mirrors]# cd 7.9/

[root@localhost 7.9]# touch CentOS7.iso 

 十二。通过UA实现手机端和电脑端的分离

 [root@localhost html]# mkdir web mobile

[root@localhost html]# mv index.html web/

[root@localhost html]# vim mobile/index.html

www.mobile.com

vim  /etc/nginx.conf

location / {
root /usr/local/nginx/html/web;

}

root下面添加

 实验模拟:不同浏览器访问到不同的页面:

[root@localhost html]# mkdir chrome msie

[root@localhost html]# cat chrome/index.html
chrome test
[root@localhost html]# cat msie/index.html
msie test

修改配置文件

location / {
if ($http_user_agent ~ Chrome) {    ##浏览器内核版本为Chrome,谷歌为例
root /usr/local/nginx/html/chrome;
}
if ($http_user_agent ~ WOW64) {         ##这个是[root@localhost ~]# tail -f /usr/local/nginx/logs/access.log     刷新IE浏览器是出现的版本可以更改
root /usr/local/nginx/html/msie;
}
index index.html index.htm;
}

 十四。Nginx平滑升级

 nginx -v(小写) 查看nginx版本

nginx -V  (大写)编译模块

假如我现在安装的时nginx-1.14.0版本    ##原来的安装路径也是/usr/src

我要升级成nginx-1.16.0版本

[root@localhost ~]# tar xf nginx-1.16.0.tar.gz -C /usr/src/

[root@localhost ~]# cd /usr/src/nginx-1.16.0/

[root@localhost nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module  --with-http_ssl_module  --with-http_flv_module    --with-http_gzip_static_module && make    

注意:不要make install

[root@localhost nginx-1.16.0]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# mv nginx nginx.old

[root@localhost sbin]# cd -     ##返回上一路径
/usr/src/nginx-1.16.0

[root@localhost nginx-1.16.0]# cp objs/nginx /usr/local/nginx/sbin/

 出现两个主进程前面的是旧的,后面的是新的

 -WINCH杀死worker

-QUIT杀死master

nginx -v查看版本 完成

原文地址:https://www.cnblogs.com/maoyanqing/p/11516008.html