前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx-4.Nginx如何处理请求

Nginx-4.Nginx如何处理请求

作者头像
_淡定_
发布2020-02-29 15:57:54
3760
发布2020-02-29 15:57:54
举报
文章被收录于专栏:dotnet & javadotnet & java

基于server_name 的虚拟站点

Nginx首先需要确定使用哪个server来处理请求。举个简单的例子,有下面几个server

  • 第一个,监听80端口,为org站点
代码语言:javascript
复制
server {
  listen 80;
  server_name example.org www.example.org;
  ...
}
  • 第二个,监听80端口,为net站点
代码语言:javascript
复制
server {
  listen 80;
  server_name example.net www.example.net;
  ...
}
  • 第三个,监听80端口,为com站点
代码语言:javascript
复制
server {
  listen 80;
  server_name example.com www.example.com;
}

因为端口一样,所以这个Nginx会检查请求头中的Host和哪个server_name匹配。如果过来的Host和3个都不匹配,或者说请求中没有Host头,那么nginx会使用默认的server。没有指定就是第一个。也可以通过default_server这个参数来指定。这个参数属于listen指令,不是server指令块。

代码语言:javascript
复制
server {
  listen 80 default_server;
  server_name example.net www.example.net;
  ...
}

如何拒绝处理未定义的Host的请求

如果一个请求中没有Host,那么可以丢弃这个请求,可以如下定义:

代码语言:javascript
复制
server {
  listen 80;
  server_name "";
  return 444;
}

这个看到server_name定义成一个空字符串来匹配那些没有Host的请求,然后返回444状态码。0.8.48之前的版本,server_name 会默认使用计算机的hostname值。

server_name 和 IP并存的虚拟站点

让我们来看一个比较复杂一点的例子,listen指令用到了ip和端口,并且定义了不同的server_name

代码语言:javascript
复制
server {
  listen 192.168.1.1:80;
  server_name example.org www.example.org;#org 站点
  ...
}
server {
  listen 192.168.1.1:80; #default_server
  server_name example.net www.example.net;#net站点
  ...
}
server {
  listen 192.168.1.2:80;#.2服务器 #default_server
  server_name example.com www.example.com;
  ...
}

这个,Nginx会先检查过来的请求的ip和端口匹配哪一个。然后再通过Host头来决定使用的server。Host就是浏览器地址栏输入的地址。假设有一个192.168.1.1:80过来的对www.example.com的请求,由于没有匹配任意一个,那么会使用第一个。也可以通过在listen后面指定default_server来修改。

一个简单的php站点配置

我们来看看Nginx如何确定php站点请求的文件地址。

代码语言:javascript
复制
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;
    }
}

第一个location是个/,匹配所有,所以优先级最低,Nginx会找最精确的。Nginx只会检查url部分,不会考虑地址后面的参数。因为参数顺序不定。

举几个简单的例子:

  • /logo.gif,先匹配第一个location,然后也匹配第二个,所以用第二个。通过root指令得到具体为/data/www/logo.gif文件。
  • /index.php,同理,用最后一个location指令块。fastcgi_param指令吧SCRIPT_FILENAME 设置成后面变量,$document_root 为 root的 /data/www,$fastcgi_script_name为index.php,然后cgi server 9000就会去处理/data/www/index.php这个文件。
  • /about.html,只匹配第一个location。
  • /,只匹配第一个,所以回去请求index.html文件,如果不存在,会有一内部重定向,到index.php,然后到最后一个location去处理。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何拒绝处理未定义的Host的请求
  • server_name 和 IP并存的虚拟站点
  • 一个简单的php站点配置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档