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/
视图:
三、版本发布:
-
开源社区版:http://nginx.org/ -
商业版版:https://www.nginx.com/
如何从官网获取源码包:
步骤:
1、打开官网首页,选择自己需要的版本
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的隐藏版本号
<注意事项>
-
注意配置文件中的结尾有“;”作为结束~!(切记!) -
每次实验修改完配置文件后需要重启 nginx 才会生效
环境说明:
无论是Apache还是Nginx都有自己对应的版本,如果黑客知道了对应的版本,找到了漏洞进行攻击,将是非常严重的后果,所以隐藏版本是非常有必要的
步骤: 隐藏前效果的展示:(可以使用F12利用开发工具进入查看网站的详细信息)
<方法一>
1、利用Nginx主配置文件隐藏版本号,加入以下即可实现
server_tokens off;
示例:
验证:
linux测试对比:curl -I http://10.10.10.11
<方法二>
1、在编译安装之前修改配置文件,做伪装
# tar -xf nginx-1.14.2.tar.gz -C /usr/src/
# vim /usr/src/nginx-1.14.2/src/core/nginx.h
示例:
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、验证
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、配置方法:可以修改配置文件,在http段、或者location段加入特定内容的过期参数
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
expires 1d; #缓存时间1天,h为小时
}
location ~ .*\.(js|css)$ {
expires 1h;
}
示例:
验证:
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、测试 查看资源主机:
盗链主机:
这是我们可以发现盗链主机,盗取了源资源主机的图片 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强制刷新
定义错误内容: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;
}
示例:
状态统计模块:
参数介绍:
"Active connections"表示当前的活动连接数;
"server accepts handled requests"表示已经处理的连接信息
三个数字依次表示已处理的连接数、成功的 TCP 握手次数、已处理的请求数
<注意事项>
-
注意配置文件中的结尾有“;”作为结束~!(切记!) -
每次实验修改完配置文件后需要重启 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企业级优化的主要内容,如果未能解决你的问题,请参考以下文章