nginx虚拟主机配置
nginx配置文件概览
nginx -t
用于测配置文件语法错误,同时会显示主配置文件路径。nginx通常根据不同的需求,将不同用途的配置文件分离,并在主配置文件/etc/nginx/nginx.conf
中使用include
配置项,引入需要的配置文件。
块配置项
块配置项由一个配置项名和一对大括号组成,块配置项可以嵌套。块配置项会用大括号把一系列所属的配置项全包含进来表示大括号内的配置项同时生效。
块配置项基本语法:
配置项名 配置项值1 配置项值2 … ; # 注释行
- 配置项名必须是Nginx的某一个模块想要处理的,否则Nginx会认为配置文件出现了非法的配置项名。
- 对于一个配置项,既可以只有一个值,也可以包含多个值,配置项值之间仍然由空格符来分隔。
- 每行配置的结尾需要加上分号。
- 行首添加
#
注释掉这一行配置。 - 部分模块允许在配置项中使用变量,变量以
$
开头
虚拟主机与请求分发
由于IP地址的数量有限, 因此经常存在多个主机域名对应着同一个IP地址的情况。nginx支持使用虚拟主机来处理对不同域名的请求。每个server配置块就是一个虚拟主机, 它只处理与之相对应的主机域名请求。server块配置项如下:
监听端口
listen
参数决定Nginx服务如何监听端口。
# 格式 listen address:port # 在listen后可以只加IP地址、端口或主机名,非常灵活 listen 127.0.0.1:8000; # 注意: 不加端口时,默认监听80端口 listen 127.0.0.1; listen 8000; listen *:8000; listen localhost:8000; # 如果服务器使用1Pv6地址, 那么可以这样使用: listen [: :] :8000; listen [fe80:: 1]; listen [:::a8c9:1234] :80; # 在地址和端口后, 还可以加上其他参数, 例如: listen 443 default_server ssl; listen 127.0.0.l default_server accept_filter=dataready backlog=l024;
- listen的其它可选参数
- default/default_server:将所在的server块作为整个Web 服务的默认server块,当一个请求无法匹配配置文件中的所有主机域名时, 就会选用默认主机。
- bind:绑定当前端口/地址对,如127.0.0.1 :8000。只有同时对一个端口监听多个地址时才会生效。
- ssl:在当前监听的端口上建立的连接必须基于SSL协议。
主机名称
server_name
后可以跟多个主机名称,server_name
对应用户请求中的域名。 在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的server_name
进行匹配,以此决定到底由哪一个server块来处理这个请求。server_name
与Host的匹配优先级如下:- 首先选择所有字符串完全匹配的server_name
- 其次选择通配符在前面的server_name
- 再次选择通配符在后面的server_name
- 最后选择使用正则表达式才匹配的server_name
- 如果Host与所有的server_name都不匹配
- 优先选择在listen 配置项后加入
[default I default_server]
的server块 - 找到匹配listen端口的第一个server块
- 优先选择在listen 配置项后加入
注:Nginx正是使用server_name配置项针对特定Host域名的请求提供不同的服务,以此实现虚拟主机功能。
重定向主机名称
server_name_in_redirect on|off;
该配置需要配合servername使用。在使用on打开时, 表示在重定向请求时会使用server name里配置的第一个主机名代替原先请求中的Host头部, 而使用off关闭时, 表示在重定向请求时使用请求本身的Host头部。
location
location [=|~|~*|^~|@|] /uri {...}
location 会尝试根据用户请求中的URI来匹配上面的/uri
表达式, 如果可以匹配, 就选择location{}块中的配置来处理用户请求。当然, 匹配方式是多样的, 下面介绍location的 匹配规则。
=
表示把URI作为字符串, 以便与参数中的uri做完全匹配。~
表示匹配URI时是字母大小写敏感的,区分大小写。~*
表示匹配URI时忽略字母大小写问题。^~
表示匹配URI时只需要其前半部分与uri参数匹配即可。@
表示仅用于Nginx服务内部请求之间的重定向, 带有@
的location不直接处理用 户请求。location /
会匹配所有的HTTP请求。- 当一个请求匹配多个location时, 实际上这个请求会被第一个location处理。