俄罗斯人开发的一个web服务器
特点:高性能、配置简单、低消耗、稳定性、丰富的内容设置
一、安装
1、下载: wget http://nginx.org/download/nginx-1.10.1.tar.gz
http://nginx.org/download/nginx-1.11.5.tar.gz
2、确认包安装:yum install pcre-devel openssl-devel -y
以及安装gcc:yum -y install gcc-c++
3、添加nginx用户:useradd -s /sbin/nologin nginx
4、解压 nginx-1.10.0.tar.gz包
tar -zxvf nginx-1.10.0.tar.gz -C /usr/local/src
./configure --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
模块作用:(编译时选择哪些模块就可以使用哪些模块,否则没有指定的模块不能使用)
--with-http_stub_status_module:启动status网页(模块能够获取nginx自上次启动以来的工作状态)
--with-http_ssl_module:支持ssl模块
二、启动
/usr/local/nginx/sbin/nginx -h 查看命令帮助
-v:查看nginx版本
-V:查看编译参数
-t:测试默认配置文件
-c:加载非默认位置配置文件
/usr/local/nginx/sbin/nginx 启动
elinks -dump http://127.0.0.1 测试连接
三、停止
nginx的停止一般通过发送信号给nginx主进程的方式来停止nginx
ps -ef | grep nginx
1个nginx进行备注信息为“master process” 表示为主进程
另外进程备注信息为“worker process”,表示为子进程
四、信号
TERM,INT:快速关闭
QUIT:从容关闭
HUP:重载配置用新的配置开始新的工作进程从容关闭旧的工作进程
USR1:重新打开日志文件
USR2:平滑升级可执行程序
WINCH:从容关闭工作进程
(注意:要用nginx主进程号关闭)
1、从容停止
kill -信号
kill -QUIT nginx主进程号
或者
kill -QUIT ‘cat /usr/local/nginx/logs/nginx.pid’
2、快速关闭
kill -TERM nginx主进程号
或
kill -INT Nginx主进程号
3、
kill -9 nginx主进程号
五、临时文件
在/usr/local/nginx中会出现一些临时文件,各个临时文件的作用:
client_body_temp:临时文件存放路径(只有当上传的请求超出缓存区大小时,才会使用临时文件目录)
proxy_temp:反向代理的数据在硬盘的存储目录
fastcgi_temp:fastcgi的缓存目录(与php结合时使用)
scgi_temp:fastcgi的精简版
uwsgi_temp:与python结合是使用
五、平滑重启和平滑升级
nginx平滑重启
kill -HUP nginx主进程号
当nginx接收到HUP信号时,它会尝试先解析配置文件(如果指定配置文件,就使用指定的,否则就是用
默认的),如果成功,就应用新的配置文件(例如,重新打开日志文件或者监听的套接字)。之后nginx
运行新的工作进程并从容关闭旧的工作进程。所有客户端的服务完成后,旧的工作进程被关闭。如果新的
配置文件应用失败,nginx将继续使用旧的配置文件进行工作
nginx平滑升级
当需要将正在运行的nginx升级,添加/删除服务模块时,可以在不中断服务的情况下,使用新版本,重编
译的nginx可执行程序替换旧版本的可执行程序,步骤如下:
1、使用新的可执行程序替换旧的可执行程序,对应编译安装的nginx,可以将新版本编译安装到旧
版本的nginx安装路径中,替换之前,最好备份一下旧的可执行程序
编译跟之前的安装一样,只是有些改变:
./configure --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
改成:
./configure --prefix=/usr/local/nginx1.11 --user=nginx --group=nginx
--with-http_stub_status_module --with-http_ssl_module
备份:
cd /usr/local/nginx/sbin/
mv nginx nginx.bak
cp /usr/local/nginx1.11/sbin/nginx ./
kill -USR2 旧的主进程
2、发送如下指令:
kill -USR2 旧版本的nginx主进程后号
3、旧版本的主进程将重命名它的pid文件为 .oldbin (例如:/usr/local/nginx/logs/nginx.pid.
oldbin),然后执行新版本的nginx可执行程序,依次启动新的主进程和新的工作进程
4、此时,新、旧版本的nginx实例会同时运行,共同处理输入的请求。要逐步停止旧版本的nginx实
例,你必须发送WINCH信号给旧的主进程,然后,它的工作进程就将开始从容关闭。
如:kill -WINCH 旧版本的nginx主进程号
5、一段时间后,旧的工作进程发(worker process)处理了所有已连接的请求后退出,仅由新的工
作进程来处理输入的请求了
6、这时候,我们可以决定是使用新版本,还是恢复到旧的版本(旧的主进程可以不关闭,这样出
问题可以回到旧的nginx版本,如果关闭后,回不到之前的版本了,可以用kill -TERM 旧的主
进程号 关闭旧的主进程)
回到旧的nginx版本:
使用kill -HUP 旧的主进程号,然后杀掉新的工作进程和新的主进程就OK了
六、基本设置
1、显示目录结构
当访问nginx时,如果访问的页面不存在,则会报403错误,此时,可以显示目录结构,在配置文件中设
置可以在/usr/local/nginx/conf/nginx.conf中的http标签里面加autoindex on设置,表示所有服务都会
显示目录结构,如果在指定的server的location中加此设置,表示只在这个服务中显示目录结构。
location后面的/表示根目录,即:/usr/local/nginx。也可以指定目录,或者取别名。具体如下:
#autoindex on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
autoindex on;
root html;
index index.html index.htm;
}
location /package{
autoindex on;
alias /opt; 表示如果/opt页面不存在(index.html,index.htm),则显示/opt目录结构到浏览器
index index.html index.htm;
}
2、访问控制
可以在server下面的location下面配置(allow 主机)或者(deny all)限制访问,allow表示允许哪个IP
访问,而deny表示限制哪些IP访问,按顺序匹配。如下:
location / {
autoindex on;
root html;
index index.html index.htm;
allow 192.168.1.101;
deny all;
}
3、登录验证
如在访问nginx时,需要设置用户密码登录后才能访问,可以在location下面添加auth_basic和
auth_basic_user_file两个属性设置提示语和用户密码的文件,具体如下:
location / {
autoindex on;
root html;
index index.html index.htm;
allow 192.168.61.1;
deny all;
auth_basic "请输入用户名和密码";
auth_basic_user_file /usr/local/nginx/auth_password.txt;
}
但是,必须先创建/usr/local/nginx/auth_password.txt文件,如下:
htpasswd -c -b /usr/local/nginx/auth_password.txt zhangsan 123
参数:
-c:创建
-b:添加用户
如果已经创建了文件,那么添加用户时不需要用 -c 选项了
4、虚拟主机
①、基于域名的虚拟主机
在 /usr/local/nginx/conf/nginx.conf中的http标签里面添加如下内容,可以设置基于域名的虚拟主
机,要设置DNS。多个域名对应同一网卡。配置如下:
server{
listen 8090;
server_name www.youku.com;
location /{
root /root/youku;
index index.html;
}
}
server{
listen 8090;
server_name www.tudou.com
lication /{
root /root/tudou;
index index.html;
}
}
②、基于IP地址的虚拟主机
基于IP地址的虚拟主机是每个IP地址对应一个域名,也要用DNS解析,配置如下:
server{
listen 172.16.10.1:8090;
location /{
root /root/youku;
index index.html;
}
}
server{
listen 10.10.10.1:8090;
lication /{
root /root/tudou;
index index.html;
}
}
③、基于端口的虚拟主机
这种情况不管域名用哪个,只要是访问8090,则都是寻找/root/youku/index.html;
访问8070,则寻找/root/tudou/index.html
server{
listen 8090;
location /{
root /root/youku;
index index.html;
}
}
server{
listen 8070;
lication /{
root /root/tudou;
index index.html;
}
}
5、rewrite
①、什么是rewrite
rewrite也称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他URL的过程
1)、URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。比
如http://www.123.com/news/index.jsp?id=123使用URLRewrite转换后可以显示为
http://www.123.com/news/123.html
2)、从安全角度上讲,如果在url中暴露太多的参数,无疑会造成一定量的信息泄露,可能会被一些
黑客利用,对你的系统造成一定的破坏,所以静态化的url地址可以给我们带来更高的安全性
3)、实现网站地址跳转
②、Rewrite相关指令
nginx rewrite相关指令有 if、rewrite、set、return等
1)、if指令
if的语法 if (condition) {…}
应用于server和location环境内(if与条件之间必须有空格)
if可以支持如下条件判断匹配符号
~:为区分大小写匹配
~*:为不区分大小写匹配
!和!*:分别为区分大小写不匹配及不区分大小写不匹配
-f 和 !-f :用来判断是否存在普通文件
-d 和 !-d:用来判断是否存在目录
-e 和 !-e:用来判断是否存在文件和目录
-x 和 !-x:用来判断文件是否可执行
在匹配过程中可以引用一些nginx的全局变量,更多的变量参考:
http://wiki.nginx.org/NginxHttpCoreModule的Variables部分
$args:请求中的参数
$host:请求信息中的“Host”,如果请求中没有Host行,则等于设置的服务器名
$request_filename:当前请求的文件路径名(带root指定的路径,即网站指定的主目录)
$request_uri:当前请求的文件路径名(不带root指定的路径)
flag(标记)
last:继续匹配
break:本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent:返回301永久重定向,浏览器地址会显示跳转后的URL地址
案例:(在location中追加)
rewrite /(.*)\.jsp$ /$1.html last;
rewrite /(.*)\.html$ /$1.txt break;
表示当访问rewrite.jsp时,首先会去找rewrite.html,然后再去找rewrite.txt文件
if (!-f $request_filename){
rewrite ^/(.*)$ /none.html break;
}
除了使用last、break以外,还可以使用permanent,表示永久重定向
防盗链:
通过判断头部是否携带其他网站的标记
location ~*\.(html)$ {
valid_referers none blocked www.kkk.com; #有效的没有经过引用的访问这个地址
if ($invalid_referer){ #无效的,即通过引用访问过来的
return 404; #返回404的错误页面
#也可以使用下面这种方式重定向到其他页面
rewrite ^/ http://192.168.61.129/aa.txt
}
}
七、nginx模块
1、status模块:通过网页查看状态
location /nginx_status{
stub_status on;
access_log off;
allow 192.168.61.129;
deny all;
}
显示内容:
Active connections:1 对后端发起的活动链接数
server accepts handled requests
1 1 1
nginx总共处理了1个链接,成功创建1此握手(证明中间没有失败的),总共处理了1个请求
Reading:0 Writing:1 Waiting:0
reading – nginx读取到客户端的Header信息数
writing – nginx返回给客户端的Header信息数
waiting – 开启keep-alive的情况下,这个值等于active -(reading + writing),意思就是nginx说已经
处理完正在等候下一次请求指令的驻留链接
2、autoindex模块
说明:当页面不存在时,显示目录结构
语法:autoindex on | off
默认:autoindex off;
位置:http,server,location
举例:
location /{
autoindex on;
}
3、limit_rate模块
说明:限制下载速度,limit_rate表示限制下载的速度,limit_rate_after表示下载完指定的大小后再限制
下载的速度
指令名称:limit_rate、limit_rate_after
使用环境:http、server、location、if in location
举例:
location /movie{
limit_rate_after 10m;
limit_rate 100k;
}
注意:可以使用下面的指令创建大文件
dd if=/dev/zero of=/root/movie/test.txt bs=100M count=1
4、alias指令与server_tokens指令
用alias关键字实现虚拟路径功能,使用如下:
location /test{
alias /var/www/web2/data;
}
为了提高服务器的安全性,可以隐藏nginx的版本信息,使用如下:
http{
server_tokens off;
}
5、限制单个IP的最大链接数(线程数)
指令名称:limit_conn_zone
使用环境:http
案例:
http{
limit_conn_zone $binary_remote_addr zone=client_addr:10m
}
指令名称:limit_conn
使用环境:http、server、location
案例:
server{
location /download{
limit_rate_after 4m;
limit_rate 100k;
limit_conn client_addr 1;
}
}
6、安装第三方模块
./config --prefix=源安装目录 -add-module=/第三方模块目录
以安装pagespeed模块示例
场景一:在未安装nginx的情况下安装nginx第三方模块
./config \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--add-module=../ngx_pagespeed-master
make && make install
场景二:在已安装nginx情况下安装nginx模块
./config --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--add-module=../ngx_pagespeed-master
make
/usr/local/nginx/sbin/nginx stop
cp objs/nginx /usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx
总结:安装nginx第三方模块实际上是使用 -add-module重新安装一次nginx,不要make install,而是直接
把编译目录下objs/nginx(源代码下面)文件直接覆盖老的nginx文件
八、日志管理
日志切割(轮转)
步骤:
cp -rf /etc/logrotate.d/yum /etc/logrotate.d/nginx
vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log { #日志的位置,*.log表示对所有以log结尾的日志进行轮转
missingok #源日志文件丢失后不提示错误
notifempty #空的日志不进行切割操作
daily #按天切割,每天切割一个日志文件
dateext #以日期格式显示日志文件的后缀
rotate 30 #保留多少分,如果每天切割一次,表示保留一个月的日志
olddir /nginx_old_log #老日志存放目录
create 644 nginx nginx
postrotate
/bin/kill -HUP `cat /usr/local/nginx/logs/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
添加一个计划任务:crontab -e
0 2 * * * logrotate -f /etc/logrotate.d/nginx
使用 logrotate -f /etc/logrotate.d/nginx表示强制执行/etc/logrotate.d/nginx文件,进行日志文件的切割
九、反向代理
需要添加新模块,所以需要重新编译安装nginx
下载新模块:ngx_cache_purge-master.zip解压到/usr/local/src
将之前安装过的nginx删除:rm -rf /usr/local/nginx
1、安装:进入/usr/local/src/nginx-1.11.5
./configure \
--user=nginx \
--group=nginx \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-pcre \
--add-module=../ngx_cache_purge-master \
参数解释:
--with-http_sub_module:此模块是一个过滤器
--with-http_realip_modlue:令处于不同网络运营商的用户收取静态文件的速度都有良好的体现
--with-pcre:rewrite支持正则表达式
ngx_cache_purge-master:反向代理支持缓存
2、nginx反向代理及缓存配置
指令:proxy_cache_path
语法:
proxy_cache_path path [levels=number] keys_zone=zone_name [inactive=time][max_size=size]
使用字段:http
指令:proxy_cache
语法:proxy_cache zone_name
使用字段:http,server,location
指令:proxy_cache_valid
作用:可以为不同的响应设置不同的时间
语法:proxy_cache_valid reply_code [reply_code …] time;
使用字段:http,server,location
预备知识:http协议返回代码,例如:2xx,3xx,4xx,5xx
示例代码:
http {
......
upstream serverpool{
server 192.168.61.1;
}
}
proxy_temp_path /usr/local/nginx/proxy_temp;
proxy_cache_path /usr/local/nginx/proxy_cache_path levels=1:2 keys_zone=cache1:500m
inactive=1d max_size=1g;
指令指定缓存的路径和一些其他参数,缓存的数据存储在文件中。缓存的文件名和key为代理URL的MD5码。
levels参数指定缓存的子目录,500分钟
注意:proxy_cache_path和proxy_cache_path指定目录必须位于同一文件系统
server{
listen 192.168.61.1:80;
server_name www.test.com;
add_header X-via $server_addr; #添加一个响应首部,响应服务器地址
add_header X-Cache $upstream_cache_status; #添加首部记录缓存状态
用于清除缓存,假设一个URL为http://192.168.61.1/test.txt,通过访问http://192.168.61.2/test.txt就可以清除该URL的缓存
location ~/purge(/.*) {
allow 127.0.0.1;
allow 192..168.61.1; #允许哪个客户删除
deny all;
proxy_cache_purge cache1 $host$1$is_args$args; #要删除key必须和缓存的key一致
}
location /{
proxy_cache cache1; #proxy_cache是把URL当中key,用md5编码哈希后保存在磁盘上,支持任意的URL,也支持非200状态码,如404/302等
proxy_cache_valid 200 302 10m; #对于http的什么状态码进行缓存以及缓存的时间
proxy_cache_valid 404 1m;
proxy_cache_valid any 1m;
proxy_cache_key $host$uri$is_args$args; #以域名、URL、参数组合成web缓存的key值,nginx根据key值哈希,存储缓存内容到二级缓存目录
proxy_redirect off; #如果需要修改从被代理服务器传来的应答头中的“location”和“refresh”字段,可以用这个指令设置
proxy_set_header Host $host; #Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真实的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应proxy_pass指令设置的服务器】
proxy_set_header X-Real-IP $remote_addr; #配合这个把真实的ip发送给转发的web服务器
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #X-Forwarded-For字段表示该条http请求是由谁发起的,如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了
proxy_pass http://serverpool;
expires 1d; #过期时间
}
}
十、负载均衡
使用:在/usr/local/nginx/conf/nginx.con中加入如下配置
http{
......
upstream htmlservers{
server 192.169.1.1:80;
server 192.168.1.2:80;
}
upstream jspservers{
server 192.168.1.3:80;
server 192.168.1.4:80;
}
location /{
...
proxy_pass http://htmlservers;
...
}
或者
location /{
...
if ($request_uri ~* \.html$){
proxy_pass http://htmlservers;
}
if ($request_uri ~* \.jsp$){
proxy_pass http://jspservers;
}
}
}
每个设备的状态设置:
1、down:表示当前的server暂时不参与负载
2、weight:默认为1。weight越大,负载的权重就越大
3、max_fails:允许请求失败的次数,默认为1
4、fail_timeout:max_fails次失败后,暂停的时间,单位为秒
5、backup:其他所有的非backup机器down或者忙碌的时候,请求backup机器。所以这台机器的压力
会最轻
案例:
http{
......
upstream htmlservers{
server 192.169.1.1:80 down;
server 192.168.1.2:80 max_fails=2 fail_timeout=10;
}
upstream jspservers{
server 192.168.1.3:80;
server 192.168.1.4:80 backup;
}
}
nginx负载均衡5种配置方式
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动删除
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不匀的情况
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问
题。例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
4、fair(第三方)
按后端服务器的响应事件来分配请求,响应时间短的优先分配。例如:
upstream backend {
server server1;
server server2;
fair;
}
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较
有效
例:在upstream中加入hash语句,server语句中不能写入weight等其他参数,hash_method是
使用hash算法
upstream backend {
server server1:80;
server server2:81;
hash $request_uri;
hash_method crc32;
}