Open xiwenAndlejian opened 5 years ago
Nginx官方文档
server { listen 80; server_name example.org www.example.org; ... } server { listen 80; server_name example.net www.example.net; ... } server { listen 80; server_name example.com www.example.com; ... }
这里的server_name对应请求中的Host
server_name
Host
上述配置中,三个 server 均监听80端口,但 server_name 不相同。 即在监听(接受)端口相同的情况下,nginx 仅会根据匹配请求中的 host 与 server_name 是否相同,来确定请求路由到哪个服务器中。 如果请求的 host 与任何 server_name 都不匹配,则 nginx 会将请求路由到此端口的默认服务器。(如果没有指明默认服务,则默认服务器为第一个)
使用default_server设置默认服务器
default_server
server { listen 80 default_server; server_name example.net www.example.net; ... }
0.8.21版本后使用 default_server,更早版本应使用 default 注意:默认服务器是侦听端口(listen)的属性,不是服务器名称(server_name)的属性
如果想只允许请求通过 host 访问/请求服务器,则可以如下定义服务器
server { listen 80; server_name ""; return 444; }
上述配置中的服务器,将匹配没有 host 字段的请求,并且返回一个特殊的 nginx 非标准代码 444 来关闭连接。
从 0.8.48 版本开始,服务器名称默认为 "",因此可以省略 server_name ""; 早期版本使用计算机的主机名作为默认服务器名称。
server_name "";
server { listen 192.168.1.1:80; server_name example.org www.example.org; } server { listen 192.168.1.1:80; server_name example.net www.example.net; } server { listen 192.168.1.2:80;# 注意此处监听的ip地址 server_name example.com www.example.com; }
上述配置中的请求处理顺序
eg:192.168.1.1:80 端口上接受的请求,将由 192.168.1.1:80 端口上的默认服务器处理,即第一个服务器处理。
第一步明确处理请求的服务器后,nginx 的处理请求流程如下:
下面是一个简单的 php 站点配置
server { listen 80; server_name example.org www.example.org; root /data/www; location / { index index.html index.php; } location ~* \.(gif|jpg|png)$ { expires 30d; } location ~ \.php$ { fastcgi_pass localhost:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
注意:nginx 测试 location,仅测试不带参数的请求行的URI部分 eg: /index.php?user=john&page=1 /index.php?page=1&user=john 即只处理?之前hostname之后的部分,此处为:/index.php
?
hostname
/index.php
沿用上方 php 站点的配置。
/
\.(gif|jpg|png)$
root /data/www
/data/www/logo.gif
注:expires 30d;将会为响应添加两个HTTP标头(Expires、Cache-Control)。 浏览器将使用这些标头来缓存内容,避免每次加载页面时重复请求相同的静态文件。 参数30d表示静态文件将被浏览器缓存30天。
expires 30d;
30d
\.(php)$
localhost:9000
SCRIPT_FILENAME
/data/www/index.php
$document_root
root
$fastcgi_script_name
/data/www/about.html
index index.html index.php
/data/www/index.html
/inedx.php
Nginx学习笔记(二)nginx如何处理请求
Nginx官方文档
第一步:选择处理请求的服务器
服务器名称
上述配置中,三个 server 均监听80端口,但 server_name 不相同。 即在监听(接受)端口相同的情况下,nginx 仅会根据匹配请求中的 host 与 server_name 是否相同,来确定请求路由到哪个服务器中。 如果请求的 host 与任何 server_name 都不匹配,则 nginx 会将请求路由到此端口的默认服务器。(如果没有指明默认服务,则默认服务器为第一个)
设置默认服务器
使用
default_server
设置默认服务器只处理包含 host 的请求
如果想只允许请求通过 host 访问/请求服务器,则可以如下定义服务器
上述配置中的服务器,将匹配没有 host 字段的请求,并且返回一个特殊的 nginx 非标准代码 444 来关闭连接。
IP和名称混合
上述配置中的请求处理顺序
eg:192.168.1.1:80 端口上接受的请求,将由 192.168.1.1:80 端口上的默认服务器处理,即第一个服务器处理。
第二步:选择 location 块
第一步明确处理请求的服务器后,nginx 的处理请求流程如下:
下面是一个简单的 php 站点配置
几个请求处理示例
沿用上方 php 站点的配置。
/logo.gif
/
匹配\.(gif|jpg|png)$
匹配,因此由当前匹配成功的正则表达式 location 块处理。root /data/www
,将请求映射到文件/data/www/logo.gif
,并将文件发送到客户端/index.php
/
匹配成功\.(php)$
匹配。因此由当前 location 块处理。localhost:9000
的 FastCGI 服务器(大概是PHP的服务器的一种)SCRIPT_FILENAME
:为/data/www/index.php
$document_root
:等于root
的值$fastcgi_script_name
:等于请求URI,即/index.php
/about.html
/
匹配成功root /data/www
被映射到文件/data/www/about.html
,并将文件发送给客户端。/
/
匹配成功index index.html index.php
和root /data/www
处理/data/www/index.html
是否存在,如果存在则将文件发送给客户端/data/www/index.php
存在,则指令执行内部重定向到/inedx.php
,并且 nginx 再次匹配 location(像客户端发送的请求一样),最后重定向的请求将由 FastCGI 服务器处理。