共计 3696 个字符,预计需要花费 10 分钟才能阅读完成。
目录
- 基于名称的虚拟主机
- 如何避免处理没有服务器名的请求
- 混合基于名称和基于 IP 的虚拟服务器
- 简单的 PHP 站点配置
1. 基于名称的虚拟主机
Nginx 首先会决定哪个主机处理请求。我们先开始一个简单的配置三个虚拟主机监听在 80 端口。
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;
…
}
在这个配置中,nginx 仅仅检查请求头部的”Host”信息来判断请求应该送到哪个服务器,如果这个值没有匹配任何服务器名,或者请求没有包含头部 Host 信息,nginx 会使用默认服务器来处理这个请求。上面的配置,默认服务器是第一个 (nginx 的标准行为),你也可以精确的指定那个服务器用做默认服务器,只需要你在 listen 指令后面添加 default_server 参数。
server {
listen 80 default_server;
server_name example.net www.example.net;
…
}
注意:default_server 只是监听端口的属性,而不是服务器名称。
2. 如何避免处理没有服务器名的请求
如果请求没有”Host”信息,那么可以不处理这个请求,服务器用于终止 (drop) 掉这个请求可以这么做
server {
listen 80;
server_name “”;
return 444;
}
这里服务器名称被设置为空字符串,将会匹配任何没有”Host”头部的请求,然后返回给客户端 nginx 的非标准代码 404。
3. 混合基于名称和基于 IP 的虚拟服务器
让我们看看下面一个更加复杂的配置,虚拟服务器监听的不同的地址。
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;
server_name example.com www.example.com;
…
}
在这个配置中,nginx 首先会测试请求的 IP 地址和端口。然后测试头部的”Host”信息,如果服务器名称 (server name) 没找到,请求
会被默认服务器处理。例如一个请求 www.example.com 在 192.168.1.1:80 被接收将会通过 192.168.1.1:80 端口的默认服务器处理,因
为在这个端口上没有定义 www.example.com。
上面已经说过了,默认服务器只是监听端口的一个属性,不同的服务器可以被定义对于不同的端口来说。
server {
listen 192.168.1.1:80;
server_name example.org www.example.org;
…
}
server {
listen 192.168.1.1:80 default_server;
server_name example.net www.example.net;
…
}
server {
listen 192.168.1.2:80 default_server;
server_name example.com www.example.com;
…
}
4. 简单的 PHP 站点配置
现在,让我们看看 nginx 如何选择一个 location 处理典型的简单的 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 首先会不按照列出来的顺序 寻找最详细指定的前缀。上面的配置中,唯一的前缀是”/”,而且它匹配任何的请求,所有它会被用作最后的处理。然后 nginx 根据配置文件中的顺序检查正则表达式的 location。第一个匹配到之后就会停止向下搜寻然后使用这个 location。如果没有正则表达式匹配到,nginx 会使用最通用的最早的 location。
注意: 所有类型的 location 仅仅测试部分 URI,不会测试 URI 的参数。因为参数在查询字符串中可以有很多种方式,例如
/index.php?user=john&page=1
/index.php?page=1&user=john
除此之外,任何人可以请求任何事情就像这样
/index.php?page=1&something+else&user=john
现在让我们看看上面的配置如何处理请求的
- 首先”/logo.gif”请求会被前缀 location“/”匹配,然后通过正则表达式”\.(gif|jpg|png)”,因此,它会被后面的 location 处理。使用了指令“root /data/www”, 这个请求会被影射到 /data/www/logo.gif 文件,然后文件被发送到客户端。
- 请求”/index.php”也会被”/”匹配到,然后被正则表达式”\.(php)$”匹配到。因此它会被后面的匹配处理,然后请求传递监听在 9000 端口的 FastCGI 服务器。fastcgi_param 指令设置 FastCGI 参数 SCRIPT_FILENAME 为”/data/www/index.php”,然后 FastCGI 服务器执行这个文件,变量 $document_root 等价于 root 指令的值,变量 $fastcgi_script_name 等价于请求的 URI,”/index.php”
- 请求”/about.html”仅仅被前缀”/”匹配,因此仅仅在这个 location 被处理。使用指令”root /data/www”,这个请求映射到 /data/www/about.html 文件,然后文件发送到客户端。
- 处理请求”/”更加复杂。它仅仅匹配”/”,因此它被这个位置处理。然后 index 指令测试 index 文件是否存在,如果文件 /data/www/index.html 不存在,文件 /data/www/index.php 存在的话,然后指令做一个内部重定向到 /index.php,然后 nginx 再次寻找 location,就好像客户端已经发出请求一样。就像上面看到的,重定向请求最终会被 FastCGI 服务器处理。
CentOS 6.2 实战部署 Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm
使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm
搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm
CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm
CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm
CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm
Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm
Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm
Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-12/125790.htm