原文

基于server_name 的虚拟站点

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

  • 第一个,监听80端口,为org站点
server {
listen 80;
server_name example.org www.example.org;
...
}
  • 第二个,监听80端口,为net站点
server {
listen 80;
server_name example.net www.example.net;
...
}
  • 第三个,监听80端口,为com站点
server {
listen 80;
server_name example.com www.example.com;
}

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

server {
listen 80 default_server;
server_name example.net www.example.net;
...
}

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

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

server {
listen 80;
server_name "";
return 444;
}

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

server_name 和 IP并存的虚拟站点

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

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站点请求的文件地址。

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去处理。

Nginx-4.Nginx如何处理请求的更多相关文章

  1. Nginx源码结构及如何处理请求

    一.源码结构   1:下载安装包后,解压,可以看到目录结构,其中src目录下放的是源码       2:src源码目录下,可以看到这几个目录     mail:mail目录中存放了实现Nginx服务器 ...

  2. nginx如何处理请求

    有必要了解一下nginx转发请求的方式,弄清它是如何转发请求的对我们理解nginx的server块的配置很有意义(虽然我也还不是很明白) 上一节说了配置文件中可以有多个server块,所以这里我配置2 ...

  3. 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器

    现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...

  4. Nginx+Lua+Redis 对请求进行限制

    Nginx+Lua+Redis 对请求进行限制 一.概述 需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器 ...

  5. nginx源代码分析--读请求主体(1)

    首先,读取请求体已进入HTTP要求11相,我们需要做的请求正文部分处理一些模块,所以这个模块需要注册功能在这个阶段,在阅读功能要求的身体ngx_http_read_client_request_bod ...

  6. 利用nginx 虚拟主机、请求转发实现不同端口web访问

    一个服务器上挂一个网站实在是有点浪费:一个服务器上可以放多个网站:可以开启nginx的虚拟主机功能:利用访问的路径或者域名不同访问不同的文件夹:例如: 1.一台服务器上放多个网站使用nginx的配置文 ...

  7. 记一次nginx强制将https请求重定向http

    公司要做小程序,但是发现小程序只允许https请求 所以查了查资料使用nginx重定向请求得方式做 以下是过程: 阿里云ssl证书管理控制台申请ssl证书 下载nginx 证书: 解压后得到后缀为ke ...

  8. nginx反向代理导致请求header头信息丢失

    背景:前端与后端调试接口,后端拿不到前段发过去的请求头信息,导致接口不通.(但是在本地是可以拿到的) 原因:nginx做了反向代理,没有请求时候加头信息的配置 报错如下: 解决方法: 方法一:NGIN ...

  9. Nginx 流量带宽等请求状态统计( ngx_req_status)

    Nginx 流量带宽等请求状态统计 ( ngx_req_status)  插件下载地址: wget http://nginx.org/download/nginx-1.4.2.tar.gz git c ...

  10. nginx限制请求之三:Nginx+Lua+Redis 对请求进行限制

    相关文章: <高可用服务设计之二:Rate limiting 限流与降级> <nginx限制请求之一:(ngx_http_limit_conn_module)模块> <n ...

随机推荐

  1. NOI2.5 1817:城堡问题

    描述 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # ...

  2. Redis(七):set/sadd/sismember/sinter/sdiffstore 命令源码解析

    上两篇我们讲了hash和list数据类型相关的主要实现方法,同时加上前面对框架服务和string相关的功能介绍,已揭开了大部分redis的实用面纱. 现在还剩下两种数据类型: set, zset. 本 ...

  3. Ubuntu通过终端命令行换阿里源

    检查Ubuntu系统的Codename $ lsb_release -a 得到结果: No LSB modules are available. Distributor ID: Ubuntu Desc ...

  4. MVC ajaxfileupload 实现无刷新导入或上传功能

    直接上代码吧 前台 先引用 ajaxfileupload.js <script src="~/Scripts/ajaxfileupload.js"></scrip ...

  5. FD_WRITE是如何触发的?

    The FD_WRITE network event is handled slightly differently. An FD_WRITE network event is recorded wh ...

  6. ubuntu 全英文环境下安装 拼音输入法

    原文转自:http://my.oschina.net/No5stranger/blog/290026 ubuntu默认的输入法是ibus,综合网上评论,fcitx的支持者更多,而且个人感觉fcitx也 ...

  7. Codeforces_832

    A.判断n/k的奇偶性. #include<bits/stdc++.h> using namespace std; long long n,k; int main() { ios::syn ...

  8. Codeforces_733_C

    http://codeforces.com/problemset/problem/733/C 从后往前一个个b对应一组组a. #include<iostream> #include< ...

  9. HDU_1232_并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=1232 第一道并查集,挺好理解的,初始化,查找根节点,连接,路径压缩. #include<iostream& ...

  10. HDU_2579_bfs

    http://acm.split.hdu.edu.cn/showproblem.php?pid=2579 简单bfs题,刚开始在纠结怎么存放vis,因为步数可能有几百步,这么多格子开数组的话也太多了, ...