免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2309 | 回复: 1
打印 上一主题 下一主题

Nginx配置与部署中文手册(1)Nginx的请求处理 . [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-07 16:01 |只看该作者 |倒序浏览
Nginx配置与部署中文手册(1)Nginx的请求处理 .











英文原文:http://nginx.org/en/docs/http/request_processing.html

原文作者:Igor Sysoev

中文译者:Poechant

特别声明:

(1)本人提供意译,不提供咬文嚼字的逐句翻译。

(2)由于本人语言水平有限,部分词汇无法找到合适的中文词汇对应,所以仍然使用英文。另外关键词等,不会翻译成中文。

(3)本文欢迎传播,但请注明出处。

(4)欢迎提各种宝贵建议。




1.处理什么样的请求

处理访问到Nginx所在IP地址的请求,并且这些请求的HTTP头信息中的Host为所要处理的域名(如下以80端口为例),如下几个server就对应响应的请求:
  1. view plaincopy to clipboardprint?
  2. 01.server {  
  3. 02.    listen       80;  
  4. 03.    server_name  nginx.org  www.nginx.org;  
  5. 04.    ...  
  6. 05.}  
  7. 06.  
  8. 07.server {  
  9. 08.    listen       80;  
  10. 09.    server_name  nginx.net  www.nginx.net;  
  11. 10.    ...  
  12. 11.}  
  13. 12.  
  14. 13.server {  
  15. 14.    listen       80;  
  16. 15.    server_name  nginx.com  www.nginx.com;  
  17. 16.    ...  
  18. 17.}  
  19. server {
  20.     listen       80;
  21.     server_name  nginx.org  www.nginx.org;
  22.     ...
  23. }

  24. server {
  25.     listen       80;
  26.     server_name  nginx.net  www.nginx.net;
  27.     ...
  28. }

  29. server {
  30.     listen       80;
  31.     server_name  nginx.com  www.nginx.com;
  32.     ...
  33. }
复制代码
2.默认server

如果不主动设置默认server,那么第一个server就会被当做默认server。若要主动设置,应该如下配置:
  1. view plaincopy to clipboardprint?
  2. 01.server {  
  3. 02.    listen       80  default_server;  
  4. 03.    server_name  nginx.net  www.nginx.net;  
  5. 04.    ...  
  6. 05.}  
  7. server {
  8.     listen       80  default_server;
  9.     server_name  nginx.net  www.nginx.net;
  10.     ...
  11. }
复制代码
此项的版本注意事项:

0.8.21版本之前,使用default关键词;

从0.8.21版本开始,使用default_server关键词。




另外注意,default_server是端口的一个属性,不是server_name的一个属性。


3.如何处理未定义host为server_name的请求
比如,如果不想处理HTTP请求中没有HOST字段的头信息的情况,那么可以如下:
  1. view plaincopy to clipboardprint?
  2. 01.server {  
  3. 02.    listen       80;  
  4. 03.    server_name  "";  
  5. 04.    return       444;  
  6. 05.}  
  7. server {
  8.     listen       80;
  9.     server_name  "";
  10.     return       444;
  11. }
复制代码
此项的版本注意事项:

0.8.48之前的版本,如果没有设置server_name的话,那么会把server_name设置为本机的hostname。

0.8.48开始的版本,如果没有设置server_name的话,那么会把server_name设置为"",所以如果要达到上述代码的效果,在此版本开始可以不设置server_name。




4.Nginx的虚拟主机监听

请先看如下配置:
  1. view plaincopy to clipboardprint?
  2. 01.server {  
  3. 02.    listen       192.168.1.1:80;  
  4. 03.    server_name  nginx.org  www.nginx.org;  
  5. 04.    ...  
  6. 05.}  
  7. 06.  
  8. 07.server {  
  9. 08.    listen       192.168.1.1:80;  
  10. 09.    server_name  nginx.net  www.nginx.net;  
  11. 10.    ...  
  12. 11.}  
  13. 12.  
  14. 13.server {  
  15. 14.    listen       192.168.1.2:80;  
  16. 15.    server_name  nginx.com  www.nginx.com;  
  17. 16.    ...  
  18. 17.}  
  19. server {
  20.     listen       192.168.1.1:80;
  21.     server_name  nginx.org  www.nginx.org;
  22.     ...
  23. }

  24. server {
  25.     listen       192.168.1.1:80;
  26.     server_name  nginx.net  www.nginx.net;
  27.     ...
  28. }

  29. server {
  30.     listen       192.168.1.2:80;
  31.     server_name  nginx.com  www.nginx.com;
  32.     ...
  33. }
复制代码
这个应该很好理解,如果listen的IP地址和端口号都吻合了,就看HTTP请求中的HOST头信息与某个server_name中的name是否吻合。如果server_name不吻合,就到该端口对应的default_server那里处理请求,如果default_server的server_name也没有与HOST头信息吻合,那么就放弃该请求。

特别再次强调,default_server是端口的属性,而非server_name的属性。所以可以有如下配置:
  1. view plaincopy to clipboardprint?
  2. 01.server {  
  3. 02.    listen        192.168.1.1:80;  
  4. 03.    server_name   nginx.org  www.nginx.org;  
  5. 04.    ...  
  6. 05.}  
  7. 06.  
  8. 07.server {  
  9. 08.    listen        192.168.1.1:80  default_server;  
  10. 09.    server_name   nginx.net  www.nginx.net;  
  11. 10.    ...  
  12. 11.}  
  13. 12.  
  14. 13.server {  
  15. 14.    listen        192.168.1.2:80  default_server;  
  16. 15.    server_name   nginx.com  www.nginx.com;  
  17. 16.    ...  
  18. 17.}  
  19. server {
  20.     listen        192.168.1.1:80;
  21.     server_name   nginx.org  www.nginx.org;
  22.     ...
  23. }

  24. server {
  25.     listen        192.168.1.1:80  default_server;
  26.     server_name   nginx.net  www.nginx.net;
  27.     ...
  28. }

  29. server {
  30.     listen        192.168.1.2:80  default_server;
  31.     server_name   nginx.com  www.nginx.com;
  32.     ...
  33. }
复制代码
5.一个简单的PHP站点的Nginx配置
  1. view plaincopy to clipboardprint?
  2. 01.server {  
  3. 02.    listen        80;  
  4. 03.    server_name   nginx.org  www.nginx.org;  
  5. 04.    root          /data/www;  
  6. 05.  
  7. 06.    location / {  
  8. 07.        index     index.html  index.php;  
  9. 08.    }  
  10. 09.  
  11. 10.    location ~* \.(gif|jpg|png)$ {  
  12. 11.        expires   30d;  
  13. 12.    }  
  14. 13.  
  15. 14.    location ~ \.php$ {  
  16. 15.        fastcgi_pass   localhost:9000;  
  17. 16.        fastcgi_param  SCRIPT_FILENAME  
  18. 17.                       $document_root$fastcgi_script_name;  
  19. 18.        include        fastcgi_params;  
  20. 19.    }  
  21. 20.}  
  22. server {
  23.     listen        80;
  24.     server_name   nginx.org  www.nginx.org;
  25.     root          /data/www;

  26.     location / {
  27.         index     index.html  index.php;
  28.     }

  29.     location ~* \.(gif|jpg|png)$ {
  30.         expires   30d;
  31.     }

  32.     location ~ \.php$ {
  33.         fastcgi_pass   localhost:9000;
  34.         fastcgi_param  SCRIPT_FILENAME
  35.                        $document_root$fastcgi_script_name;
  36.         include        fastcgi_params;
  37.     }
  38. }
复制代码
Nginx在匹配location的时候,不是按照配置代码给出的顺序进行匹配的,而是先按照匹配表达式中的文字字符串(literal string)的明确程度,从最明确的开始匹配。这么说可能有点含混不清,简单说,没有正则规则的匹配表达式,是最明确的。比如如果这个匹配表达式就是一个“/”或者“/abc”,那么这就是最明确的。上例中的"/"就是这个最明确的蚊子字符串(the most specific literal string),其实也是该例中唯一的。所以先从这个location开始,然后再按照location的列出顺序,依次匹配,直到出现第一个匹配的location后停止。如果所有的location都不匹配,就用第一个找到的最明确的文字字符串来匹配(the most specific literal string)。




6.待查询的HTTP请求

Nginx只处理无查询的HTTP请求,因为查询请求的查询字段的顺序不确定,比如:
  1. view plaincopy to clipboardprint?
  2. 01./index.php?user=john&page=1  
  3. 02./index.php?page=1&user=john  
  4. /index.php?user=john&page=1
  5. /index.php?page=1&user=john
复制代码
再比如:
  1. view plaincopy to clipboardprint?
  2. 01./index.php?page=1&something+else&user=john  
  3. /index.php?page=1&something+else&user=john
复制代码
7.几个location的例子

例1:
  1. view plaincopy to clipboardprint?
  2. 01./logo.gif  
  3. /logo.gif
复制代码
“/”先被找到,然后匹配"\.(gif|jpg|png)$",再根据redirective找到root是/data/www,然后这个请求就被映射到"/data/www/logo.gif"了,最后文件就被发送给到了客户端。

例2:
  1. view plaincopy to clipboardprint?
  2. 01./index.php  
  3. /index.php
复制代码
"/"先被找到,然后匹配"\.(php)$",然后request就被传递给在9000端口上监听的FastCGI服务器,"fastcgi_param" directive设置FastCGI的参数SCRIPT_FILENAME为"/data/www/index.php",然后FastCGI服务器就执行这个文件。(注意其中document_root是/data/www,fastcgi_script_name是/index.php。)

例3:
  1. view plaincopy to clipboardprint?
  2. 01./about.html  
  3. /about.html
复制代码
"/"先被找到,且只有这一个匹配的。然后根据root值/data/www,就找到了文件/data/www/about.html,然后发送给客户端。

例4:

  1. view plaincopy to clipboardprint?
  2. 01./  
  3. /
复制代码
"/"是很复杂的,先找到"/"这个location,然后根据root值/data/www,看/data/www/index.php是否存在,如果存在directive就在内部重定向到/index.php,然后Nginx根据这个再次搜索location,重复上面第二个例子。

论坛徽章:
0
2 [报告]
发表于 2011-12-22 19:04 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP