HTTP协议配置格式
http {
...
...:各server的公共配置
server {
...
}:每个server用于定义一个虚拟主机;
server {
...
server_name
root
alias
location [OPERATOR] URL {
...
if CONDITION {
...
}
}
}
}
不同于HTTPD有一个默认的主机,Nginx必须使用server指令定义一个虚拟主机。
HTTP协议配置
所有的配置如果不加说明的话,都是配置在/etc/nginx/nginx.conf中
1.套接字相关配置
(1)server { ... }
- 作用:配置一个虚拟主机
- 示例:
server { listen address[:port] | port; server_name SERVER_NAME; root /PATH/TO/DOCUMENT_ROOT; }
(2)listen
语法:
listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
上下文:
只能放在server配置段中
解释:
- PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE:指明监听的地址和端口的方式,如果ip不指明则默认为本机所有ip,如果端口不指明则为80端口。若两则都省略则监听在本机所有ip的80端口上。
unix:/PATH/TO/SOCKET_FILE:表明通过socket文件进行通行,那就只能用于本机通信。 - default_server:指明默认处理请求的虚拟主机,在多个虚拟主机监听了同样的ip和port时,指明默认处理请求的虚拟主机。
- [ssl] [http2 | spdy] :指明客户端请求资源时使用的协议。
- [backlog=number]:监听套接字在处理请求时,如果处理不来,则将来不及处理的请求放入后援队列。backlog指明后援队列的大小。
- [rcvbuf=size]:监听套接字接受缓冲区大小。
- [sndbuf=size]:监听套接字发送缓冲区大小。
配置示例:
listen 80 default_server
listen 127.0.0.1:80 ssl backlog=512
(3)root
语法:
root PATH
上下文:
http、 server、 location、if in location
放置在不同的上下文中意味着生效范围的不同。
解释:
指明用户访问资源时对应于主机根目录。
示例:
root /var/www/vhost;
如果用户访问的URL为http://192.168.239.131/index.html ,将会获取主机上/var/www/vhost/index.html资源。也就是说URL中/index.html的/代表主机上的/var/www/vhost路径。root指明的路径如果不存在,语法检测时并不报错。如果多个上下文中有root配置,范围小的生效。
(4)server_name
指明虚拟主机的主机名称;可以指明多个,用空白字符分割
支持通配任意长度的任意字符;server_name .baidu.com www.baidu. 。基于
支持~起始的字符做正则表达式模式匹配;server_name ~^www\d+.baidu.com$
匹配机制:首先是精确匹配,再是左侧匹配,再是右侧*匹配,最后是正则表达式。
虚拟主机配置示例
- 基于IP的虚拟主机
node1节点有两个IP,192.168.239.131和192.168.239.132。不同的IP监听在相同的端口上,构成基于IP的虚拟主机
配置文件为:http { server { listen 192.168.239.131:80 ; server_name node1; root /var/www/vhost/131; } server { listen 192.168.239.132:80 ; server_name node1; root /var/www/vhost/132; } }
~]# mkdir /var/www/vhost/{131,132} -pv
~]# echo "131 virtual host" > /var/www/vhost/131/index.html
~]# echo "132 virtual host" > /var/www/vhost/132/index.html
~]# nginx -t
~]# nginx -r reload - 基于端口的虚拟主机
不同的虚拟主机监听在相同IP地址不同端口上
配置文件/etc/nginx/nginx.conf中http端配置http { server { listen 192.168.239.131:80; server_name node1; root /var/www/vhost/80; } server { listen 192.168.239.131:808; server_name node1; root /var/www/vhost/808; } }
- 基于IP和PORT的混合虚拟主机
虚拟主机监听在不同IP和不同端口上
配置文件/etc/nginx/nginx.conf中http端配置http { server { listen 192.168.239.131:80; server_name node1; root /var/www/vhost/131_80; } server { listen 192.168.239.132:808; server_name node1; root /var/www/vhost/132_808; } }
- 基于FQDN的虚拟主机
虚拟主机监听在相同的IP和端口上,不同的是用于访问虚拟主机时域名的不同。Nginx会通过请求头部中的Host的值确定交由那个虚拟主机处理请求。
配置文件配置/etc/nginx/nginx.confhttp { server { listen 192.168.239.131:80; server_name vhost1; root /var/www/vhost/vhost1; } server { listen 192.168.239.131:80; server_name vhost2; root /var/www/vhost/vhost2; } }
访问结果
2.与路径映射相关
(1)location
语法
location [ = | ~ | ~* | ^~ ] uri { ... }
解释
用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;。在一个server中location可以有多个,并且location可以嵌套。但需要注意的是“=”进行精确匹配时嵌套,nginx -t进行语法检测时会报错。匹配URI的方式有如下几种:
=:对URI进行精确匹配;精确匹配一旦匹配到,URI匹配机制就会关闭,起到了加速匹配的作用
location = / {
...此种配置只有http://192.168.239.131/ 能够匹配到,而http://192.168.239.131/index.html 不能匹配到,不然怎么称之为精确匹配呢。
}
^~:对URI左半部分做匹配检测,不区分大小写。此匹配一旦匹配到就会终止匹配,不会进行正则表达式匹配。
~:正则表达式匹配,区分大小写。
~*:正则表达式匹配,不区分大小写。
不带符号:匹配起始于此uri的所有URI。
既然有多种匹配方式,那就一定有优先级的问题。匹配优先级为:=,^~,~/~*,不带符号;
优先级示例
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
若我们的访问URI为“/”,将会匹配到配置A;若访问URI为“/index.html”,将会匹配到配置B;若我们访问的URI为“/document/index.html”,将匹配到配置C;若我们访问的URI为“/images/1.jpg”,将会匹配到配置D;如果访问URI为“/document/1.jpg”,将会匹配到配置E。
root和location同时配置示例
配置文件配置/etc/nginx/nginx.conf
server {
listen 80;
server_name node1;
location /admin/ {
root /var/www/vhost;
}
}
那么请问,http://192.168.239.131/admin/ 会获取主机/var/www/vhost/index.html文件,还是/var/www/vhost/admin/index.html?
从上图结果可以看出,root指明的路径等同于“/admin/”中左“/”,所以获取主机资源路径为“/var/www/vhost/admin/index.html”。root指明的路径中右斜线可有可无,即/var/www/vhost和/var/www/vhost/都可。但需要注意的是location中/admin/和/admin是不同的。我们可以看如下示例:
http {
server {
listen 80;
server_name node1;
location /admin {
root /var/www/vhost/;
}
}
}
从上图我们可以看到,用户访问URI为/admin,服务器返回一个301临时重定向,重定向的URI为/admin/,然后浏览器会再次发起请求,请求的URI为/admin/。在反向代理情景中我们可能不需要此功能,那么我们可以使用精确匹配
http {
server {
listen 80;
server_name node1;
location = /admin {
root /var/www/vhost/;
}
}
}
(2)alias
语法
alias path;
解释
定义路径别名,将制定的location替换成alias制定的路径。只能放在location中,不能与root指令同用。
示例
http {
server {
listen 80;
server_name node1;
location /admin/ {
alias /alias/;
}
}
}
可以看到alias指明的路径是相对于根文件系统的。
还需注意的是location中的路径和alias的路径右斜线要同时存在或不存在,否者资源会访问不到。例如:
location /admin {
alias /alias/;
}
或
location /admin/ {
alias /alias;
}
都是错误的,不可取
(3)index
用法
index file ...;
解释
用于指定默认访问资源,可用在http,server,location中。当用于访问的资源对应的路径是目录时,默认访问此目录的文件
示例
http {
server {
listen 80;
server_name node1;
location / {
root /var/www/vhost/;
index a.html;
}
}
}
(4)error_page
语法
error_page code ... [=[response]] uri;
解释
对于特定的错误返回一个指定的uri。code对应特定的错误。=response,指明返回给用户时的状态码。
示例1
我们将404错误定向百度页面
http {
server {
listen 80;
server_name node1;
location / {
root /var/www/vhost/;
error_page 404 http://www.baidu.com;
}
}
}
示例2
在正常线上环境,我们都会有对应的错误页面返回,并不会上上面那样重定向到百度页面。而在线上环境我们的配置往往是这样
http {
server {
listen *:80;
server_name node1;
locastion / {
root /var/www/vhost/;
error_page 404 /404.html
}
location /404.html {
root /etc/nginx/error_pages/;
index 404.html;
}
}
}
访问一个不存在的页。
示例3--返回一个指定的响应码
http {
server {
listen *:80;
server_name node1;
locastion / {
root /var/www/vhost/;
error_page 404 =200 /404.html
}
location /404.html {
root /etc/nginx/error_pages/;
index 404.html;
}
}
}
注意:示例1和示例2,3是不同,示例1是做了重定向,而示例2,3是nginx内部重新做了路径映射。所以示例一种使用=reponse是达不到指定响应码的效果。
参考
https://nginx.org/en/docs/http/ngx_http_core_module.html
原文地址:http://blog.51cto.com/13589448/2089223