1云计算系列课程-Nginx企业级优化

Posted 互联网工程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1云计算系列课程-Nginx企业级优化相关的知识,希望对你有一定的参考价值。

Part1nginx企业级优化方案

1Nginx 概述:

  • Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

  • 其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

  • Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

2优点:

Nginx 可以在大多数 Unix Linux OS 上编译运行,并有 Windows 移植版。 Nginx 的1.19.2稳定版已经于2020年8月11日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license。

Nginx 是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性: 在连接高并发的情况下,Nginx是Apache服务不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。

服务器

  • Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 php 程序对外进行服务,也可以支持作为 HTTP代理服务对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。

  • 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。

  • 无缓存的反向代理加速,简单的负载均衡和容错。

  • FastCGI,简单的负载均衡和容错。

  • 模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCG或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。

  • 支持 SSL 和 TLSSNI。

代理服务器

  • 作为邮件代理服务:Nginx 同时也是一个非常优秀的邮件代理服务(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

  • Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。

国外网站统计web市场占用率

  • 从以下网站可以分析出web使用率
https://news.netcraft.com/

视图:

淘宝Tengine:(Tengine是基于nginx二次开发的)

http://tengine.taobao.org/

视图:1、云计算系列课程-Nginx企业级优化

三、版本发布:

  • 开源社区版:http://nginx.org/
  • 商业版版:https://www.nginx.com/

如何从官网获取源码包:

步骤:

1、打开官网首页,选择自己需要的版本1、云计算系列课程-Nginx企业级优化

1、云计算系列课程-Nginx企业级优化
wget http://nginx.org/download/nginx-1.18.0.tar.gz

3Nginx的工作原理:

同步与异步:

同步与异步的重点在消息通知的方式上,也就是调用结果的通知方式不同。

同步: 当一个同步调用发出去后,调用者要一直等待调用的结果通知后,才能进行后续的执行。

异步: 当一个异步调用发出去后,调用者不必一直等待调用结果的返回,异步调用,要想获得结果。

一般有两种方式:

1、主动轮询异步调用的结果;

2、被调用方通过 callback(回调通知)来通知调用方调用结果。

实例解释:

同步取快递:小明收到快递将送达的短信,在楼下一直等到快递送达。

异步取快递:小明收到快递将送达的短信,快递到楼下后,小明再下楼去取。

异步取快递,小明知道快递到达楼下有两种方式:

阻塞与非阻塞:

阻塞与非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,当前进/线程是挂起状态,还是非挂起状态。 阻塞:调用在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活 非阻塞:调用在发出去后,不会阻塞当前进/线程,而会立即返回。

实例解释:

阻塞取快递: 小明收到快递即将送达的信息后,什么事都不做,一直专门等快递。

非阻塞取快递: 小明收到快递即将送达的信息后,等快递的时候,还一边敲代码、一边刷微信。

同步与异步,重点在于消息通知的方式;阻塞与非阻塞,重点在于等消息时候的行为。所以,就有了下面 4 种组合方式

  • 同步阻塞:小明收到信息后,啥都不干,等快递;(Apache)
  • 同步非阻塞:小明收到信息后,边刷微博,边等着取快递;
  • 异步阻塞:小明收到信息后,啥都不干,一直等着快递员通知他取快递;
  • 异步非阻塞:小明收到信息后,边刷着微博,边等快递员通知他取快递。(Nginx)

大部分程序的 I/O 模型都是同步阻塞的,单个进程每次只在一个文件描述符上执行 I/O 操作,每次 I/O 系统调用都会阻塞,直到完成数据传输。传统的服务器采用的就是同步阻塞的多进程模型。一个 server 采用一个进程负责一个 request 的方式,一个进程负责一个 request,直到会话结束。进程数就是并发数,而操作系统支持的进程数是有限的,且进程数越多,调度的开销也越大,因此无法面对高并发。

Nginx 采用了异步非阻塞的方式工作。我们先来先了解一下 I/O 多路复用中的 epoll 模型。

epoll 模型:

当连接有 I/O 事件产生的时候,epoll 就会去告诉进程哪个连接有 I/O 事件产生,然后进程就去处理这个事件。

例如: 小明家楼下有一个收发室,每次有快递到了,门卫就先代收并做了标记;然后通知小明去取送给小明的快递。

为什么 Nginx 比其他 web 服务器并发高(Nginx 工作原理)?

Nginx 配置 use epoll 后,以异步非阻塞方式工作,能够轻松处理百万级的并发连接。

处理过程: 每进来一个 request,会有一个 worker 进程去处理。但不是全程的处理,处理到可能发生阻塞的地方。比如向后端服务器转发 request,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事件:“如果后端服务器返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有新的 request 进来,他就可以很快再按这种方式处理。而一旦后端服务器返回了,就会触发这个事件,worker 才会来接手,这个 request 才会接着往下走。通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的。

4工作模式

Nginx 有两种工作模式:master-worker 模式和单进程模式。在 master-worker 模式下,有一个 master 进程和至少一个的 worker 进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。

master-worker:

该模式下,Nginx 启动成功后,会有一个 master 进程和至少一个的 worker 进程。master 进程负责处理系统信号,加载配置,管理 worker 进程(启动,杀死,监控,发送消息/信号等)。worker 进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是 worker 进程。生产环境下一般使用这种模式,因为这种模式有以下优点:

  • 稳定性高,只要还有 worker 进程存活,就能够提供服务,并且一个 worker 进程挂掉 master 进程会立即启动一个新的 worker 进程,保证 worker 进程数量不变,降低服务中断的概率。
  • 配合 linux 的 cpu 亲和性配置,可以充分利用多核 cpu 的优势,提升性能
  • 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)

单进程模式:

单进程模式下,nginx 启动后只有一个进程,nginx 的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用 gdb 等工具进行调试。该模式不支持 nginx 的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。(了解)

5Nginx部署

1、安全防护的关闭selinux与firewalld

iptables -F
setenforce 0
systemctl stop firewalld

2、下载对应的软件包,并安装所需要的依赖软件包

wget http://nginx.org/download/nginx-1.18.0.tar.gz
yum -y install pcre-devel zlib-devel openssl-devel

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

useradd -s /sbin/nologin -M nginx

4、配置、编译、安装

tar -xf nginx-1.18.0.tar.gz -C /usr/src/
cd /usr/src/nginx-1.18.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

注:配置前可以参考:./configure --help给出说明
--prefix      指定Nginx的安装目录
--user和--group 指定Nginx运行用户和组
--with-http_stub_status_module 启用http_stub_status_module模块以支持状态统计
--with-http_ssl_module      启用SSL模块
--with-http_flv_module   启用FLV模块,提供寻求内存使用基于时间的偏移量文件

5、创建软链接优化路径

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
ll /usr/local/sbin/
lrwxrwxrwx. 1 root root 27 1月  22 19:49 nginx -> /usr/local/nginx/sbin/nginx

6、检查Nginx配置文件问题,出现以下ok,表示配置文件没有问题;

[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

7、启动服务,并检测端口,测试

nginx 
netstat -atnp |grep 80
浏览器访问测试:http://10.10.10.11/

8、Nginx服务的运行控制

  • 主程序Nginx支持标准的进程信号,通过kill或者killall命令传送
HUP 重载配置 等同于-1
QUIT 退出进程 等同于-3
KILL 杀死进程 等同于-9

killall -s HUP nginx
killall -s QUIT nginx

当Nginx进程运行时,PID号默认存放在/usr/local/nginx/logs/目录下的nginx.pid文件中,因此若改用kill命令,也可以根据nginx.pid文件中的PID号来进行控制。

为了使Nginx服务的启动、停止、重载等操作更加方便,可以编写Nginx服务启动脚本,并使用chkconfig和systemctl工具来进行管理。

[root@nginx ~]# vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: 2345 99 20
# description: Nginx Server Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"

case "$1" in
start)
 $PROG
;;
stop)
 kill -s QUIT $(cat $PIDF)
;;
restart)
 $0 stop
 $0 start
;;
reload)
 kill -s HUP $(cat $PIDF)
;;
*)
 echo "Usage: $0 {start|stop|restart|reload}"
 exit 1
esac
exit 0

[root@nginx ~]# chmod +x /etc/init.d/nginx
[root@nginx ~]# chkconfig --add nginx
[root@nginx ~]# chkconfig nginx on
[root@nginx ~]# chkconfig --list nginx
# 通过nginx脚本来启动、停止、重启、重载Nginx服务器

6Nginx文件结构

在Nginx服务器的主配置文件nginx.conf中,包括全局配置、I/O事件配置、HTTP配置这三大块内容,配置语句的格式为"关键字 值;"(末尾以分号表示结束),以"#"开始的部分表示注释。

全局配置

由各种配置语句组成,不使用特定的界定标记。全局配置部分包括运行用户、工作进程数、错误日志、PID存放位置等基本设置。

常用配置项:

user nginx [nginx];     #运行用户,Nginx的运行用户实际是编译时指定的nginx,若编译时未指定则默认为nobody。
worker_processes 2;  #指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般和CPU核心数相等。
worker_cpu_affinity 00000001 00000010; #为每个进程分配cpu核心,上例中将2个进程分配到两个cpu,当然可以写多个,或者将一个进程分配到多个cpu
worker_rlimit_nofile 102400;  #这个指令是指当一个nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。(通过"ulimit –n 数值"可以修改打开的最多文件数目)
error_log logs/error.log;      #全局错误日志文件的位置
pid logs/nginx.pid;    #PID文件的位置

I/O事件配置:

使用"events {}"界定标记,用来指定Nginx进程的I/O响应模型,每个进程的连接数等设置

events {
use epoll;   #使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能
worker_connections 4096;  #每个进程允许的最多连接数(默认为1024),每个进程的连接数应根据实际需要来定,一般在10000以下,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。
}

HTTP配置

使用"http{}"界定标记,包括访问日志、HTTP端口、网页目录、默认字符集、连接保持、以及虚拟主机、PHP解析等一系列设置。其中大部分配置语句包含在子界定标记"server {}"内。

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;  #访问日志位
    sendfile        on;       #支持文件发送(下载)
    keepalive_timeout  65;    #连接保持超时

    server {                 #web服务的监听配置
        listen       80;     #监听地址及端口(IP:PORT)
        server_name  www.yjs.com; #网站名称(FQDN)
  charset utf-8;          #网页的默认字符集

        location / {         #根目录配置
            root   html;     #网站根目录的位置安装位置的html中
            index  index.html index.htm; #默认首页(索引页)
        }

        error_page   500 502 503 504  /50x.html; #内部错误的反馈页面
        location = /50x.html {                   #错误页面配置
            root   html;
        }
 }

7实验部分

1、Nginx的隐藏版本号

<注意事项>

  1. 注意配置文件中的结尾有“;”作为结束~!(切记!)
  2. 每次实验修改完配置文件后需要重启 nginx 才会生效

环境说明:

无论是Apache还是Nginx都有自己对应的版本,如果黑客知道了对应的版本,找到了漏洞进行攻击,将是非常严重的后果,所以隐藏版本是非常有必要的

步骤: 隐藏前效果的展示:(可以使用F12利用开发工具进入查看网站的详细信息)

1、云计算系列课程-Nginx企业级优化

<方法一>

1、利用Nginx主配置文件隐藏版本号,加入以下即可实现

server_tokens off;

示例:1、云计算系列课程-Nginx企业级优化

验证:

1、云计算系列课程-Nginx企业级优化

linux测试对比:curl -I http://10.10.10.11

1、云计算系列课程-Nginx企业级优化

<方法二>

1、在编译安装之前修改配置文件,做伪装

# tar -xf nginx-1.14.2.tar.gz -C /usr/src/
# vim /usr/src/nginx-1.14.2/src/core/nginx.h

示例:

1、云计算系列课程-Nginx企业级优化

2、安装所需要的依赖

yum -y install pcre-devel zlib-devel openssl-devel make

3、创建Nginx用户

useradd -s /sbin/nologin -M nginx

4、配置、编译、安装  (不需要全部配置,根据需要进行选择即可)

cd /usr/src/nginx-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

5、启动Nginx

/usr/local/nginx/sbin/nginx

6、验证1、云计算系列课程-Nginx企业级优化

2、修改Nginx用户与组

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

1、编译安装时指定

[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost nginx-1.14.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install

2、修改配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
  2 user  nginx nginx;
[root@localhost ~]# killall -HUP nginx
[root@localhost ~]# ps aux |grep nginx
root      6651  0.0  0.2  20300  1248 ?        Ss   13:38   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     6746  0.0  1.0  24472  5048 ?        S    14:27   0:00 nginx: worker process

3、Nginx的网页缓存

环境说明:

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

环境拓扑:

1、云计算系列课程-Nginx企业级优化

步骤:

1、配置方法:可以修改配置文件,在http段、或者location段加入特定内容的过期参数

      location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
           expires 1d;     #缓存时间1天,h为小时
        }
        location ~ .*\.(js|css)$ {
          expires 1h; 
        }

示例:

1、云计算系列课程-Nginx企业级优化

验证:

1、云计算系列课程-Nginx企业级优化

4、Nginx的日志切割

环境说明:

按照Nginx的配置文件会生成access.log和error.log,随着访问量的增加,日志文件会越来越大,即会影响访问的速度(写入日志时间延长),也会增加查找日志的难度,可以利用脚本对日志进行每日切割

步骤:

1、编写脚本来检测Nginx转态,进行日志切割

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"
[ -d $log_path/backup ] || mkdir -p $log_path/backup
if [ -f $pid_path ]
then
        mv $log_path/access.log $log_path/backup/access.log-$datetime
        kill -USR1 $( cat $pid_path )
        find $log_path/backup -mtime +30 | xargs rm -f
else
        echo "Error,Nginx is not working!" | tee -a /var/log/messages
fi

2、将Nginx杀死,并将pid文件杀死

killall -9 nginx
rm -rf /usr/local/nginx/logs/nginx.pid

3、执行脚本,查看返回值

[root@localhost ~]# bash /opt/cut_nginx_log.sh 
Error,Nginx is not working!
[root@localhost ~]# tail -f /var/log/messages 
…………………………
Error,Nginx is not working!

4、开启Nginx服务,并执行脚本,查看backup下的文件

[root@localhost ~]# nginx
[root@localhost ~]# ls /usr/local/nginx/logs/
access.log  backup  error.log  nginx.pid
[root@localhost ~]# bash /opt/cut_nginx_log.sh 
[root@localhost ~]# ls /usr/local/nginx/logs/backup/
access.log-20200708

5、将日志切割放到计划任务当中

[root@localhost ~]# crontab -e
0 0 * * * /opt/cut_nginx_log.sh    #格式:分时日月周

5、Nginx连接超时

环境说明:

保持连接(长连接)

在进行HTTP连接前要先建立TCP连接(TCP3次握手),再建立HTTP连接,当HTTP资源请求结束后,会断开HTTP连接,再断开TCP连接(TCP 4次挥手)。

很多情况下用户访问网站并不是只访问一个资源,可能会打开很多页面,访问很多资源,如果每个资源的访问都这么繁琐,将会造成用户访问慢,服务器压力过大的问题。

解决如上问题的最好办法是开启网站的保持连接功能。在企业网站中,为了避免同一个客户长时间占用连接,造成服务器资源浪费,可以设置相应的连接超时参数,实现控制连接访问时间。

keepalive_timeout: 设置连接保持超时时间,一般可只设置该参数,默认为65秒,可根据网站的情况设置,或者关闭,可在 http段、server段、或者location 段设置。client_header_timeout:指定等待客户端发送请求头的超时时间。
client_body_timeout:设置请求体读取超时时间。

步骤:

vim /usr/local/nginx/conf/nginx.conf
     keepalive_timeout  65;    #设置连接保持超时时间
     client_header_timeout 60;   #指定等待客户端发送请求头的超时时间
     client_body_timeout 60;    #设置请求体读取超时时间
注意:若出现超时,会返回408报错

6、Nginx网页压缩功能

环境说明:

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

vim /usr/local/nginx/conf/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等级,1最小,9最大
gzip_types text/plain text/javascript application/x-javascript text/css text/sml application/xml application/xml+rss;   #压缩类型,是对那些网页文档启用雅俗启用压缩功能
killall -HUP nginx     #重启服务即可

7、Nginx防盗链

环境说明:

公司的网站上存放了很多的资源,为了防止资源被盗链,已导致自身服务器性能标高 环境准备:将以下内容写入Windows中C:\Windows\System32\drivers\etc 资源主机:10.10.10.11  www.source.com 盗链主机:10.10.10.12  www.steal.com

步骤:

1、资源主机准备测试页面

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        ……
<img src="a.png" />  #这里以a.png为例,作为盗链的资源
</body>
</html>

2、盗链主机,盗取资源主机图片

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        ……
<img src="http://10.10.10.11/a.png" />
</body>
</html>

3、测试 查看资源主机:

1、云计算系列课程-Nginx企业级优化盗链主机:1、云计算系列课程-Nginx企业级优化

这是我们可以发现盗链主机,盗取了源资源主机的图片 4、资源主机设置防盗链

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.txt;
          }
       }

参数详解:

~* :表示后面的内容不区分大小写
valid_referers:设置信任的网站
none :浏览器中referer为空的情况,就直接在浏览器中访问图片(none浏览器中referer(Referer是 header 的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理)为空的情况,就直接在浏览器访问图片)
blocked :Referer不为空的情况,但是值被直接代理或防火墙删除了,这些值不以http://或者https://开头
if ($invalid_referer)  如果匹配有错误的,就做跳转errer.txt

第一行: wma /wmv|asf|mp3 mmf |zip|rarljpglgiflpng/swf|flv:表示对这些后缀的文件实行防盗链
第二行: none blocked *.source.com source.com;  不区分大小写
表示referers_信息中匹配 none blocked *.source.com source.com (*代表任何,任何的二级域名)
if{}得里面内容的意思是,如果链接不是来自第二行指定的就强制跳转到403错误页面,当然直接返回404也是可以的,也可以是图片。

5、测试 盗链测试:如果有缓存ctrl+F5强制刷新1、云计算系列课程-Nginx企业级优化

定义错误内容:echo "zun zhong ban quan" > /usr/local/nginx/html/error.txt

8、对FPM模块进行参数优化

Nginx的PHP解析功能实现如果是交由FPM(fastcgi 进程管理器)处理的,为了提高PHP的处理速度,可对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空闲进程数

示例:

服务器为云服务器,运行了个人论坛,内存为1.5G,fpm进程数为20,内存消耗近1G,处理比较慢

优化参数调整:

# vim /usr/local/php5/etc/php-fpm.conf
pm = dynamic
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8

9、Nginx 为目录添加访问控制

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

[root@localhost ~]# yum -y install httpd-tools
[root@localhost ~]# htpasswd -c /usr/local/nginx/.htpasswd user1
New password: 
Re-type new password: 
Adding password for user user1

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
        location ~ /status {
            stub_status on;
            access_log off;
            auth_basic "Nginx Status";
            auth_basic_user_file /usr/local/nginx/.htpasswd;
        }

示例:1、云计算系列课程-Nginx企业级优化

状态统计模块:

1、云计算系列课程-Nginx企业级优化

参数介绍:

"Active connections"表示当前的活动连接数;
"server accepts handled requests"表示已经处理的连接信息
三个数字依次表示已处理的连接数、成功的 TCP 握手次数、已处理的请求数

<注意事项>

  1. 注意配置文件中的结尾有“;”作为结束~!(切记!)
  2. 每次实验修改完配置文件后需要重启 nginx 才会生效
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
        location ~ /status {
            stub_status on;
            access_log off;
            auth_basic "Nginx Status";
            auth_basic_user_file /usr/local/nginx/.htpasswd;
   allow 10.10.10.11;
   deny 10.10.10.240/24;
}

9、自定义错误页面

        error_page 403 404              /404.html;
        location = /404.html {
            root html;
        }

[root@localhost html]# echo "Sorry,Page Not Found" >  /usr/local/nginx/html/404.html
[root@localhost html]# service nginx reload

示例:

10、自动索引

   location /download {
        autoindex on;
        }
[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# mkdir download/dir{1,2} -p
[root@localhost html]# touch download/1.txt
[root@localhost html]# touch download/2.txt
[root@localhost html]# service nginx reload
浏览器访问 http://192.168.200.101/download

11、目录别名

        location /abc {
                alias /html;
                index index.html;
        }
[root@localhost ~]# mkdir /html
[root@localhost ~]# echo “alias test” > /html/index.html
在浏览器中http://192.168.200.101/abc 进行测试

12、通过UA实现手机端和电脑端的分离

实现nginx区分pc和手机访问不同的网站,是物理上完全隔离的两套网站(一套移动端、一套pc端),这样带来的好处pc端和移动端的内容可以不一样,移动版网站不需要包含特别多的内容,只要包含必要的文字和较小的图片,这样会更节省流量。有好处当然也就会增加困难,难题就是你需要维护两套环境,并且需要自动识别出来用户的物理设备并跳转到相应的网站,当判断错误时用户可以自己手动切换回正确的网站。

有两套网站代码,一套PC版放在/usr/local/nginx/html/web,一套移动版放在/usr/local/nginx/html/mobile。只需要修改nginx的配置文件,nginx通过UA来判断是否来自移动端访问,实现不同的客户端访问不同内容。

location / {
 #默认PC端访问内容
    root /usr/local/nginx/html/web;

 #
如果是手机移动端访问内容
    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;
}
实验模拟:不同浏览器访问到不同的页面:
[root@localhost html]# mkdir firefox msie
[root@localhost html]# echo "hello,firefox" > firefox/index.html
[root@localhost html]# echo "hello,msie" > msie/index.html
        location / {
        if ($http_user_agent ~ Firefox) {
            root /usr/local/nginx/html/firefox;
        }
        if ($http_user_agent ~ MSIE) {
            root /usr/local/nginx/html/msie;
        }
            index  index.html index.htm;
        }

13、nginx平滑升级版本

一、nginx平滑升级概述

随着网站并发访问量越来越高,nginx web 服务器也越来越流行,nginx 版本换代越来越频繁,1.15.2版本的nginx更新了许多新功能,生产环境中版本升级必然的,但是线上业务不能停,此时nginx的升级就是运维的重要工作了

二、nginx平滑升级原理

多进程模式下的请求分配方式

Nginx默认工作在多进程模式下,即主进程(master process)启动后完成配置加载和端口绑定等动作,fork出指定数量的工作进程(worker process),这些子进程会持有监听端口的文件描述符(fd),并通过在该描述符上添加监听事件来接受连接(accept)。

信号的接收和处理

Nginx主进程在启动完成后会进入等待状态,负责响应各类系统消息,如SIGCHLD、SIGHUP、SIGUSR2等。

Nginx信号简介

主进程支持的信号
 TERM, INT:  立刻退出
 QUIT:   等待工作进程结束后再退出
 KILL:   强制终止进程
 HUP:   重新加载配置文件,使用新的配置启动工作进程,并逐步关闭旧进程。
 USR1:   重新打开日志文件
 USR2:   启动新的主进程,实现热升级
 WINCH:   逐步关闭工作进程
工作进程支持的信号
 TERM, INT:  立刻退出
 QUIT:   等待请求处理结束后再退出
 USR1:   重新打开日志文件

三、nginx平滑升级实战

[root@localhost ~]# rpm -q httpd
package httpd is not installed

[root@localhost ~]# yum -y install pcre pcre-devel zlib zlib-devel openssl-devel
[root@localhost ~]# ll nginx-*
-rw-r--r-- 1 root root 910812 Nov 15 15:00 nginx-1.15.9.tar.gz
-rw-r--r-- 1 root root 804164 Dec 11  2014 nginx-1.14.2.tar.gz

[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# tar xf nginx-1.14.2.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/nginx-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

[root@localhost ~]# /usr/local/nginx/sbin/nginx
[root@localhost ~]# netstat -anpt |grep :80       
[root@localhost ~]# elinks --dump http://localhost
                        Welcome to nginx!

1、查看旧版nginx的编译参数

[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.6.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) 
TLS SNI support enabled
configure arguments: --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

2、编译新版本Nginx源码包,安装路径需与旧版一致,注意:不要执行make install

[root@localhost ~]# tar xf nginx-1.15.9.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/nginx-1.15.9/
[root@localhost nginx-1.15.9]# ./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

3、备份二进制文件,用新版本的替换

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
[root@localhost nginx-1.15.9]# ls
auto     CHANGES.ru  configure  html     Makefile  objs    src
CHANGES  conf        contrib    LICENSE  man       README
[root@localhost nginx-1.15.9]# cp objs/nginx /usr/local/nginx/sbin/

4、确保配置文件无报错

[root@localhost nginx-1.15.9]# /usr/local/nginx/sbin/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

5、发送USR2信号 向主进程(master)发送USR2信号,Nginx会启动一个新版本的master进程和对应工作进程,和旧版一起处理请求

[root@localhost ~]# ps aux | grep nginx | grep -v grep
root       4108  0.0  0.2  45028  1152 ?        Ss   16:58   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      4109  0.0  0.4  45456  2012 ?        S    16:58   0:00 nginx: worker process      
[root@localhost ~]# kill -USR2 4108

[root@localhost ~]# ps aux | grep nginx | grep -v grep
root       4108  0.0  0.2  45028  1316 ?        Ss   16:58   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      4109  0.0  0.4  45456  2012 ?        S    16:58   0:00 nginx: worker process      
root       6605  0.5  0.6  45196  3364 ?        S    17:02   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      6607  0.0  0.3  45624  1756 ?        S    17:02   0:00 nginx: worker process 

6、发送WINCH信号 向旧的Nginx主进程(master)发送WINCH信号,它会逐步关闭自己的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理

[root@localhost ~]# kill -WINCH 4108
[root@localhost ~]# ps aux | grep nginx | grep -v grep
root       4108  0.0  0.2  45028  1320 ?        Ss   16:58   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root       6605  0.0  0.6  45196  3364 ?        S    17:02   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      6607  0.0  0.3  45624  1756 ?        S    17:02   0:00 nginx: worker process  

注意:回滚步骤,发送HUP信号 如果这时需要回退继续使用旧版本,可向旧的Nginx主进程发送HUP信号,它会重新启动工作进程, 仍使用旧版配置文件。然后可以将新版Nginx进程杀死(使用QUIT、TERM、或者KILL)

[root@localhost ~]# kill -HUP 4108

7、发送QUIT信号 升级完毕,可向旧的Nginx主进程(master)发送(QUIT、TERM、或者KILL)信号,使旧的主进程退出

[root@localhost ~]# kill -QUIT 4108
[root@localhost ~]# ps aux | grep nginx | grep -v grep
root       6605  0.0  0.6  45196  3364 ?        S    17:02   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      6607  0.0  0.4  45624  2056 ?        S    17:02   0:00 nginx: worker process

8、验证nginx版本号,并访问测试

[root@localhost nginx-1.15.9]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.15.9

如果觉得内容,对你有所帮助,扫描下方二维码获取更多内容!


以上是关于1云计算系列课程-Nginx企业级优化的主要内容,如果未能解决你的问题,请参考以下文章

零基础学习云计算及大数据DBA集群架构师企业级运维技术及实践项目2015年1月26日周二

Linux云计算课程具体学啥?

适合云计算开发者的企业级互联网分布式系统应用架构学习

openstack云计算实践-老男孩架构师课程教案笔记分享

云计算热度不减,如何高效掌握云计算技能?

云计算热度不减,如何高效掌握云计算技能?