文章目录
一、Nginx是什么?
Nginx是一个开源的,轻量级、高性能、高并发的WWW服务和代理服务软件。因具有高并发(特别是静态资源)、占用系统资源少等特性,且功能丰富而逐渐流行起来。在功能应用方面,Nginx不但是一个优秀的Web服务软件,还具有反向代理和负载均衡功能和缓存功能。
➢支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
➢资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB
➢可以做HTTP反向代理及加速缓存,及负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS的功能
➢具备squid等专业缓存软件等的缓存功能
➢支持异步网络I/O事件模型epoll
二、安装nginx
1. 安装依赖包
[root@web01 ~]# yum -y install gcc gcc-c++ make #编译软件
[root@web01 ~]# yum -y install pcre pcre-devel #Nginx的Rewrite模块和HTTP核心模块会使用到PCRE正则表达式语法
[root@web01 ~]# yum -y install zlib zlib-devel # Nginx的各种模块中需要使用gzip压缩
[root@web01 ~]# yum -y install openssl openssl-devel # Nginx的安全套接字层密码库
[root@web01 ~]# yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
2. 下载源码
[root@web01 ~]# cd /usr/local/src/
[root@web01 src]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@web01 src]# tar -zxvf nginx-1.18.0.tar.gz
3. 创建设置nginx账号
[root@web01 ~]# groupadd nginx
[root@web01 ~]# useradd -M -g nginx -s /sbin/nologin nginx
4. 编译安装
[root@web01 src]# cd nginx-1.18.0
[root@web01 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx-1.18.0 --user=nginx --group=nginx --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module
[root@web01 nginx-1.18.0]# make && make install
[root@web01 nginx-1.18.0]# ln -s /usr/local/nginx-1.18.0 /usr/local/nginx
#这条ln命令的意义重大,之所以用ln做软链接,方便以后升级新版本,删除原来的软连接,重新建立新的链接到/usr/local/nginx的软连接就好
5. 配置开机自启
[root@web01 ~]# vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@web01 ~]# systemctl enable nginx #设置开机自启动
启动、查看状态、重启nginx,指令3件套
systemctl start nginx
systemctl status nginx
systemctl restart nginx
6. 配置nginx环境变量
[root@web01 ~]# vim /etc/profile
#nginx path
PATH=$PATH:/usr/local/nginx/sbin
export PATH
[root@web01 ~]# source /etc/profile
使配置生效后,就可以用nginx -s reload
7.nginx常用命令
验证配置是否正确: nginx -t
查看Nginx的详细的版本号:nginx -V
查看Nginx的简洁版本号:nginx -v
启动Nginx: nginx
快速停止或关闭Nginx:nginx -s stop
正常停止或关闭Nginx:nginx -s quit
配置文件修改重装载命令:nginx -s reload
三、Nginx虚拟主机配置
1. 虚拟主机概念
所谓虚拟主机,在web服务里就是一个独立的网站站点,这个站点对应独立的域名(也可能是IP或端口),具有独立的程序及资源目录,可以独立地对外提供服务供用户访问。
这个这个独立的站点在配置里是由一定格式的标签段标记,对于apache软件来说,一个虚拟主机的标签段通畅被包含在内,而nginx软件则使用一个server{}标签来标示一个虚拟主机,一个web服务里可以有多个虚拟主机主机标签对,即同时可以支持多个虚拟主机站点。
2. 虚拟主机类型
①基于域名的虚拟主机
所谓基于域名的虚拟主机,意思就是通过不同的域名区分不通的虚拟主机,基于域名的虚拟主机是企业应用最广的虚拟主机类型,几乎所有对外提供服务的网站都是使用基于域名的虚拟主机
②基于端口的虚拟主机
同理,所谓基于端口的虚拟主机,意思就是通过不同的端口来区分不同的虚拟主机。此类虚拟主机对应的企业应用主要为公司内部的网站,例如:一些不希望直接对外提供用户访问的网站后台等,访问基于端口的虚拟主机地址里要带有端口
③基于IP的虚拟主机
同理,所谓基于IP的虚拟主机,意思就是通过不同的IP区分不同的虚拟主机,此类虚拟主机对应的企业应用非常少见,一般不同业务需要使用多IP的常见都会在负载均衡器上进行VIP绑定,而不是在Web上通过绑定IP区分不同的虚拟机。
三种虚拟主机类型均可独立使用,也可以互相混合一起使用。 基于域名的虚拟主机类型是重点。
3. 基于域名的虚拟主机配置实战
①配置基于域名的nginx.conf内容
[root@web01 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.tiantian.com; #基于域名的虚拟主机
location / {
root html/tiantian; #域名www.tiantian.org对应自己的tiantian站点
index index.php index.html index.htm; #首页文件名字
}
}
}
②创建域名对应的站点目录及文件
[root@web01 ~]# mkdir /usr/local/nginx/html/tiantian/ -p
[root@web01 ~]# echo this is tiantian server > /usr/local/nginx/html/tiantian/index.html
[root@web01 ~]# cat /usr/local/nginx/html/tiantian/index.html
this is tiantian server
上述命令创建了一个html/tiantian站点目录,对应于虚拟主机配置文件里的root根目录的html/tiantian设置(root html/tiantian;)。然后生成一个默认的首页文件index.html,文件内容事this is tiantian server。
③检查语法并重新加载Nginx
先检查修改过的Nginx配置文件语法是否正确:
[root@web01 ~]# 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
然后平滑启动nginx,即重新加载配置文件。
[root@web01 ~]# nginx -s reload
然后在检查nginx重新加载情况,例如进程和端口是否OK。
[root@web01 ~]# ps aux | grep nginx
root 937 0.0 0.3 46036 2036 ? Ss Apr29 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 2306 0.0 0.3 46476 2044 ? S 01:31 0:00 nginx: worker process
root 2319 0.0 0.1 112812 976 pts/0 R+ 01:32 0:00 grep --color=auto nginx
[root@web01 ~]# netstat -anptul | grep nginx
tcp 0 0 0.0.0.0:80
④测试(不要忘了在访问的客户端做hosts解析)
客服端lb01测试
[root@lb01 ~]# echo 192.168.34.10 www.tiantian.com >> /etc/hosts
[root@lb01 ~]# curl www.tiantian.com
this is tiantian server
访问成功
多个基于域名的虚拟主机,就是在nginx.conf配置文件中多加一个server{} 更换域名,在hosts中同一个IP 拥有两个域名,重新创建一个新得web独立站点。
4. 基于端口的虚拟主机配置实战
①配置基于端口的nginx.conf内容
[root@web01 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 88; #修改端口号
server_name www.tiantian.com; #基于域名的虚拟主机
location / {
root html/tiantian; #域名www.tiantian.org对应自己的tiantian站点
index index.php index.html index.htm; #首页文件名字
}
}
}
②测试
[root@lb01 ~]# curl www.tiantian.com
curl: (7) Failed connect to www.tiantian.com:80; Connection refused #显然默认的80端口已经不能访问了
[root@lb01 ~]# curl www.tiantian.com:88 #修改后的88端口可以访问
this is tiantian server
基于IP的虚拟主机比较少见不常用,自己翻阅资料了解即可,大同小异。
5. Nginx配置虚拟主机的步骤
Nginx配置虚拟主机的步骤如下(适合各类型虚拟主机):
① 增加一个完整的server标签段到结尾处。注意 要放到http的结束大括号前,也就是将server标签段放入到http标签
② 更改server_name 及对应网页的root根目录,如果需要其他参数,可以增加或修改。
③ 创建server_name 域名对应网页的根目录,并且建立测试文件,如果没有index首页,会出现403错误
④ 检查Nginx配置文件语法,平滑启动Nginx服务,快速检查启动结果。
⑤ 在客户端对server_name 处配置的域名做host解析或DNS配置,并通过ping命令检查连接是否成功。
⑥ 在浏览器输入地址访问,或者在linux客户端做host解析,用wget或curl接地址访问。
四、Nginx常用功能配置实战
1.规范优化nginx配置文件
当有多个虚拟主机时,即在nginx.conf配置文件的http模块中就会有多个server模块,这样nginx…conf配置文件就会显得冗长而且容易配置出错,那么有什么方法能优化这点呢,答案就是将每个server单独配置成一个配置文件,然后在http模块中include进来,这样的实现方式就做到了虚拟主机单独为一个配置文件,和nginx的主配置文件nginx.conf分离开来。
include语法:include file
它可以放置在Nginx配置中的任何位置。用法如下:
include tiantian.conf
实施步骤如下:
[root@web01 ~]# mkdir /usr/local/nginx/conf/extra
[root@web01 ~]# cat /usr/local/nginx/conf/extra/tiantian.conf
server {
listen 88;
server_name www.tiantian.com;
location / {
root html/tiantian;
index index.php index.html index.htm;
}
}
删除主配置文件中关于www.tiantian.com虚拟主机的配置,把虚拟主机独立文件tiantian.conf包含到nginx.conf里面。
[root@web01 ~]# egrep -v "#|^$" /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include extra/tiantian.conf;
}
[root@lb01 ~]# curl www.tiantian.com:88 #可以正常访问
this is tiantian server
2. Nginx虚拟主机的别名配置
所谓虚拟主机别名,就是为了虚拟主机设置除了主域名以外的一个或多个域名名字,这样能实现用户访问的多个域名对应同一个虚拟主机网站的功能。
以www.tiantian.com域名的虚拟主机为例,为其增加一个tiantian.com,使得访问tiantian.com时,在该域名出现的网站内容和访问www.tiantian.com得到的结果是一样的,这是企业场景中活生生的基本需求配置。
①首先在配置文件中增加一个虚拟主机别名
[root@web01 ~]# cat /usr/local/nginx/conf/extra/tiantian.conf
server {
listen 88;
server_name www.tiantian.com tiantian.com; #增加虚拟主机别名
location / {
root html/tiantian;
index index.php index.html index.htm;
}
}
②配置域名解析(客户端)
[root@lb01 ~]# tail -1 /etc/hosts
192.168.34.10 www.tiantian.com tiantian.com
③访问结果
[root@lb01 ~]# curl tiantian.com:88
this is tiantian server
3.Nginx状态信息功能实战
Nginx软件的功能模块中有一个ngx_http_stub_status_module模块,这个模块的主要功能是记录Nginx的基本访问状态信息。
检查编译安装Nginx时是否设定了http_stub_status_module模块:
[root@web01 ~]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module
①生成状态配置,并增加状态配置参数:
[root@web01 extra]# cat /usr/local/nginx/conf/extra/status.conf
server {
listen 88;
server_name status.tiantian.com;
location / {
stub_status on; #打开状态信息开关
access_log off;
}
}
[root@web01 ~]# sed -i '117 i include extra/status.conf;' /usr/local/nginx/conf/extra/nginx.conf #增加包含文件的配置到主配置
②检查配置,并重新启动服务
[root@web01 ~]# 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@web01 ~]# nginx -s reload
③配置域名解析(客户端)
[root@lb01 ~]# tail -1 /etc/hosts
192.168.34.10 status.tiantian.com
④访问测试结果
[root@lb01 ~]# curl status.tiantian.com:88
Active connections: 1
server accepts handled requests
3 3 3
Reading: 0 Writing: 1 Waiting: 0
对上边数据做个说明:
Active connections: 1正处理的活动连接数
Server accepts handled requests: 总共处理了3个连接,成功创建3次握手(请求丢失数=(握手数-连接数),证明中间没有失败的),总共创建了3个请求。
Reading: nginx读取到客户端的Header信息数。
Writing: nginx返回给客户端的Header信息数。
Waiting为Nginx已经处理完正在等候下一次请求指令的驻留连接。在开启keep-alive的情况下,这个值等于 Active – (Reading + Writing),意思就是nginx已经处理完成,正在等候下一次请求指令的驻留连接.所以,在访问效率高,请求很快被处理完毕的情况下,Waiting数比较多是正常的。
4. 为Nginx增加错误日志(error_log)配置
配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(nginx_core_module)的参数,该参数名字为error_log,可以放在不同的虚机主机中单独记录。
error_log的语法格式及参数说明如下:
error_log file level;
关键字 日志文件 错误日志级别
其中,关键字error_log不能改变,日志文件可以指定任意存放日志的目录,错误日志级别常见的有[debug|info|notice|warn|error|crit|alert|emerg],级别越高,记录的信息越少,生产场景一般是warn|error|crit这三个级别之一,注意不要配置info等较低级别,会带来巨大磁盘I/O消耗。
error_log的默认值为:
#default: error_log logs/error.log error;
可以放置的标签段为:
#context: main, http, server, location
编辑主配置文件nginx.conf,增加错误日志的配置方法如下:
[root@web01 ~]# vim /usr/local/nginx/conf/nginx.conf
error_log logs/error.log; #一般配置这一行即可
五、Nginx访问日志(access_log)
1.Nginx访问日志介绍
Nginx软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由ngx_http_log_module模块负责。对应的官方地址为:http://nginx.org/en/docs/http/ngx_http_log_module.html。
2.访问日志参数
Nginx的访问日志主要由两个参数控制
参数 | 说明 |
---|---|
log_format | 用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可) |
access_log | 用来指定日志文件的路径及使用何种日志格式记录日志 |
Nginx日志格式中默认的参数配置如下:
log_format main '$remote_addr - $remote_user[$time_local]"$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
Nginx记录日志的默认参数配置如下:
access_log logs/access.log main;
3.访问日志配置说明
①日志格式的定义说明
先来看其语法:
定义语法: log_format name string ...;
其配置位置在http标签内。
日志格式说明如下:
log_format main '$remote_addr - $remote_user[$time_local]"$request"'
'$status $body_bytes_sent "$http_referer"
'"$http_user_agent" "$http_x_forwarded_for"';
其中,log_format为日志格式关键参数,不能变。
main是为日志格式指定的标签,记录日志时通过这个main标签选择指定的格式。其后所接的所有内容都是可以记录的日志信息,注意,所有的日志段以空格分隔,一行可以记录多个,不同列的意义:
Nginx日志变量 | 说明 |
---|---|
$remote_addr | 记录访问网站的客户端地址 |
$http_x_forwarded_for | 当前端有代理服务器时,设置Web节点记录客户端地址的配置,此参数生效的前提事代理服务器上也进行了相关的x_forwarded_for设置 |
$remote_user | 远程客户端用户名称 |
$time_local | 记录访问时间与时区 |
$request | 用户的http请求起始行信息 |
$status | http状态码,记录请求返回的状态,例如:200、404、301等 |
$body_bytes_sents | 服务器发送给客户端的响应body字节数 |
$http_referer | 记录此次请求是从哪个链接访问过来的,可以根据referer进行防盗链设置 |
$http_user_agent | 记录客户端访问信息,例如:浏览器、手机客户端等 |
在没有特殊要求的情况下,采用默认的配置即可,更多可以设置的记录日志信息的变量见:
http://nginx.org/en/docs/http/ngx_http_log_module.html
②记录日志的access_log参数说明
下面是有关access_log参数的官方说明。
语法如下:
access_log path[format[buffer=size[flush=time]][if=condition]];
access_log path format gzip[=level][buffer=size][flush=time][if=condition];
access_log syslog:server=address[,parameter=value][format[if=condition]];
buffer=size为存放访问日志的缓冲区大小,flush=time为将缓冲区的日志刷到磁盘的时间,gzip[=level]表示压缩级别,[if=condition]表示其他条件。一般的场景中,这些参数都无须配置,极端优化时才可能会考虑这些参数。
access_log off中的off,表示不记录访问日志。
默认配置:access_log logs/access.log combined;
放置位置在http、server、location、if in location、limit_except中。
4.访问日志配置实战
编辑主配置文件 nginx.conf ,配置日志格式如下:
[root@web01 conf]# sed -n '21,23 s@#@@gp' nginx.conf.default
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
把上述内容放到nginx.conf的http标签首部,如下:
...以上部分省略
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"';
...以下部分省略
然后在每个虚拟主机里面配置,使其使用上述格式记录用户访问日志。以www.tiantian.com站点为例,命令如下:
[root@web01 ~]# cat /usr/local/nginx/conf/extra/tiantian.conf
server {
listen 88;
server_name www.tiantian.com tiantian.com;
location / {
root html/tiantian;
index index.php index.html index.htm;
}
access_log logs/access_tiantian.log main;
}
如果不指定日志格式就会用默认的combined格式记录日志。
下面用浏览器模拟用户访问生成日志,在服务器上查看日志结果,命令如下:
[root@lb01 ~]# curl www.tiantian.com:88
this is tiantian server
[root@web01 ~]# cat /usr/local/nginx/logs/access_tiantian.log
192.168.34.13 - - [02/May/2021:21:34:00 -0400] "GET / HTTP/1.1" 200 24 "-" "curl/7.29.0" "-"
再使用谷歌浏览器进行测试访问,查看日志结果:
[root@web01 ~]# cat /usr/local/nginx/logs/access_tiantian.log
192.168.34.13 - - [02/May/2021:21:34:00 -0400] "GET / HTTP/1.1" 200 24 "-" "curl/7.29.0" "-"
192.168.34.1 - - [02/May/2021:21:38:13 -0400] "GET / HTTP/1.1" 200 24 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "-"
192.168.34.1 - - [02/May/2021:21:38:13 -0400] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.34.10:88/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "-"
我们可以将日志格式和日志内容做一个比对:
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
真实的日志内容如下:
192.168.34.1 - - [02/May/2021:21:38:13 -0400] "GET / HTTP/1.1" 200 24 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "-"
对应说明如下:
$remote_addr对应的是真实日志里的192.168.34.1,即客户端的IP。
$remote_user对应的是第二个中杠“-”,没有远程用户,所以用“-”填充。
[$time_local]对应的是[02/May/2021:21:38:13 -0400]。
“$request"对应的是"GET / HTTP/1.1”。
$status对应的是200状态码,200表示正常访问。
$body_bytes_sent对应的是24字节,即响应body的大小。
“$http_referer"对应的是"-",由于直接打开域名浏览的,referer就会没有值,为"-"。
“$http_user_agent"对应的是"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36x "。
“$http_x_forwarded_for"对应的是”-",因为Web服务没有使用代理,因此此处为"-"。
5.Nginx访问日志轮询切割
Nginx默认情况下会把日志生成到一个指定的访问日志文件access.log里面,时间长了会导致日志文件很大,不利于日志文件的分析和处理。因此要对Nginx日志文件按天或小时进行切割。这里使用按天切割方法。
具体切割脚本如下:
[root@web01 ~]# cat /usr/local/nginx/logs/cut_nginx_logs.sh
#!/bin/bash
Dateformat=`date +%Y%m%d` #定义时间格式 年-月-天
Basedir="/usr/local/nginx" #Nginx应用安装目录
Nginxlogdir="$Basedir/logs" #Nginx应用日志存储目录
Logname="access_tiantian" #日志文件名
[ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1 #判断是否是目录,并且进入此目录
[ -f ${Logname}.log ] || exit 1 #判断是否是文件
mv ${Logname}.log ${Dateformat}_${Logname}.log #重命名文件格式为【时间格式+日志名】
$Basedir/sbin/nginx -s reload #平滑加载,每次切割都需要重新加载nginx配置来生成新得access_tiantian.log文件
下面通过定时任务实现每天00点整定时执行/usr/local/nginx/logs/cut_nginx_logs.sh切割日志。操作命令如下:
[root@web01 ~]# crontab -l
00 00 * * * sh /usr/local/nginx/logs/cut_nginx_logs.sh
六、Nginx location
1. location的作用
location指令的作用是根据用户请求的URL来执行不同的应用。根据用户请求的网站地址URL进行匹配,匹配成功即进行相关操作。
2.location语法
location使用的语法为:
location [=|~|~*|^~] /uri/ { … }
模式 | 含义 |
---|---|
location = /uri | = 表示精确匹配,只有完全匹配上才能生效 |
location ^~ /uri | ^~ 开头对URL路径进行前缀匹配,并且在正则之前。 |
location ~ pattern | 开头表示区分大小写的正则匹配 |
location ~* pattern | 开头表示不区分大小写的正则匹配 |
location /uri | 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后 |
location / | 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default |
前缀匹配时,Nginx 不对 url 做编码,因此请求为 /static/20%/aa ,可以被规则 ^~ /static/ /aa 匹配到(注意是空格)
多个 location 配置的情况下匹配顺序为(仅供参考):
➢首先精确匹配 =
➢其次前缀匹配 ^~
➢其次是按文件中顺序的正则匹配
➢然后匹配不带任何修饰的前缀匹配。
➢最后是交给 / 通用匹配
➢当有匹配成功时候,停止匹配,按当前匹配规则处理请求
注意:前缀匹配,如果有包含关系时,按最大匹配原则进行匹配。比如在前缀匹配: location /dir01 与 location /dir01/dir02 ,如有请求 http://localhost/dir01/dir02/file 将最终匹配到 location /dir01/dir02
3.location匹配示例
下面是一组典型的location匹配。
server {
listen 88;
server_name www.tiantian.com tiantian.com;
charset utf-8;
location = / {
return 401;
}
location = /login {
return 402;
}
location ^~ /static/ {
return 403;
}
location ^~ /static/files {
return 404;
}
location ~ \.(gif|jpg|png|js|css)$ {
return 405;
}
location ~* \.png$ {
return 406;
}
location /img {
return 407;
}
location / {
root html/tiantian;
index index.php index.html index.htm;
}
}
那么产生的效果如下:
[root@lb01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.tiantian.com:88
401
[root@lb01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.tiantian.com:88/login
402
[root@lb01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.tiantian.com:88/static/
403
[root@lb01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.tiantian.com:88/static/files
404
[root@lb01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.tiantian.com:88/a.gif
405
[root@lb01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.tiantian.com:88/a.PNG
406
[root@lb01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.tiantian.com:88/img
407
[root@lb01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.tiantian.com:88/index.html
200
所以实际使用中,至少有三个匹配规则定义,如下:
# 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
# 这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是 nginx 作为 http 服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
# 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
# 非静态文件请求就默认是动态请求,自己根据实际把握
# 毕竟目前的一些框架的流行,带.php、.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}
七、Nginx rewrite
1.什么是Nginx rewrite
Nginx rewrite的主要功能是实现URL地址重写。Nginx的rewrite规则需要PCRE软件的支持,即通过Prel兼容正则表达式语法进行规则匹配。如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。默认参数编译时,Nginx就会安装支持rewirte的模块,但是,也必须要有PCRE软件的支持。
2. Nginx rewrite语法
指令语法:rewrite regex replacement [flag];
默认值:none
应用位置:server、location、if
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement部分,结尾是flag标记。下面是一个简单的URL rewrite跳转的例子:
rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,regex部分是/(.*),这是一个正则表达式,表示匹配所有,匹配成功后跳转到http://www.etiantian.org/$1。这里的$1是取前面regex部分括号里的内容,结尾的permanent;是永久301重定向标记,即跳转到后面的http://www.etiantian.org/$1地址上。
regex常用正则表达式说明
rewrite指令结尾的flag标记说明
在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器端访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。
last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite规则执行完毕后,会对其所在的server{………}标签重新发起请求,而break标记则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则。
3.Nginx rewrite的企业应用场景
Nginx的rewrite功能在企业里应用非常广泛:
➢可以调整用户浏览的URL,使其看起来更规范,合乎开发及产品人员的需求。
➢为了让搜索引擎收录网站内容,并让用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
➢网站换新域名后,让旧域名的访问跳转到新的域名上,例如:让京东的360buy换成了jd.com。
➢根据特殊变量、目录、客户端的信息进行URL跳转等。
4.Nginx rewrite 301跳转
以往我们是通过别名的方式实现tiantian.com和www.tiantian.com访问同一个地址的,事实上,除了这个方式以外,还可以使用Nginx rewrite 301跳转的方式来实现。
实现的配置文件如下:
[root@web01 ~]# cat /usr/local/nginx/conf/extra/tiantian.conf
server {
listen 88;
server_name tiantian.com;
rewrite ^/(.*) http://www.tiantian.com/$1 permanent; #当用户访问tiantia.com及下面的任意内容时,都会通过这条rewrite跳转到www.tiantian.com对应的网址
}
server {
listen 88;
server_name www.tiantian.com ;
charset utf-8;
location / {
root html/tiantian;
index index.php index.html index.htm;
}
access_log logs/access_tiantian.log main;
# access_log logs/access_tiantian.log main gzip buffer=32k flush=5s;
}
效果如下:
访问前:
跳转之后的网站
5.实现不同域名的URL跳转
示例:
实现访问http://blog.tiantian.com时跳转到http://www.tiantian.com/blog/oldboy.html
外部跳转时使用这种方法,可让浏览器地址变为跳转后的地址,另外,要事先设置http://www.tiantian.com/blog/oldboy.html有结果输出,不然会出现401等权限错误。
①配置nginx rewrite规则
跳转前,http://blog.tiantian.com对应站点的配置如下:
[root@web01 ~]# cat /usr/local/nginx/conf/extra/blog.conf
server {
listen 88;
server_name blog.tiantian.com ;
charset utf-8;
location / {
root html/blog;
index index.php index.html index.htm;
}
access_log logs/access_tiantian.log main;
# access_log logs/access_tiantian.log main gzip buffer=32k flush=5s;
if ( $http_host ~* "^(.*)"){
set $domain $1;
rewrite ^(.*) http://www.tiantian.com:88/blog/oldboy.html break;
}
}
②测试
跳转前访问网址:
跳转后:
实现访问http://blog.tiantian.com时跳转到http://www.tiantian.com另一种简单方法:
[root@web01 ~]# cat /usr/local/nginx/conf/extra/blog.conf
server {
listen 88;
server_name blog.tiantian.com ;
charset utf-8;
location / {
root html/blog;
index index.php index.html index.htm;
}
rewrite ^(.*) http://www.tiantian.com:88 break;
access_log logs/access_tiantian.log main;
# access_log logs/access_tiantian.log main gzip buffer=32k flush=5s;
}
八、Nginx访问认证
有时,在实际工作企业要求我们为网站设置访问账号和密码权限,这样操作后,只有拥有账号密码的用户才可以访问网站内容。这种使用账号密码才可以访问网站的功能主要应用在企业内部人员访问的地址上,例如:企业网站后台,MySQL客户端phpmyadmin,企业内部的CRM,WIKI网站平台。
1.创建密码文件
我们可以借用apache的htpasswd软件,来创建加密的账号和密码
[root@web01 ~]# htpasswd -bc /usr/local/nginx/conf/htpasswd yulei 123456
Adding password for user yulei
[root@web01 ~]# chmod 400 /usr/local/nginx/conf/htpasswd
[root@web01 ~]# chown nginx /usr/local/nginx/conf/htpasswd
[root@web01 ~]# ll /usr/local/nginx/conf/htpasswd
-r--------. 1 nginx root 44 May 10 23:14 /usr/local/nginx/conf/htpasswd
[root@web01 ~]# cat /usr/local/nginx/conf/htpasswd
yulei:$apr1$TVVvfHti$1Ehhr3t2P446GwjTZ4Z1F/ #密码是加密的
2.修改虚拟主机配置文件:
[root@web01 ~]# cat /usr/local/nginx/conf/extra/tiantian.conf
server {
listen 88;
server_name tiantian.com;
rewrite ^/(.*) http://www.tiantian.com/$1 permanent;
}
server {
listen 88;
server_name www.tiantian.com ;
charset utf-8;
location / {
root html/tiantian;
index index.php index.html index.htm;
auth_basic "yulei"; #用于设置认证提示字符串“yulei”
auth_basic_user_file /usr/local/nginx/conf/htpasswd; #用于设置认证的密码文件
}
access_log logs/access_tiantian.log main;
# access_log logs/access_tiantian.log main gzip buffer=32k flush=5s;
}