原文

基于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. 2020.2,《The day after tomorrow》

    “The day after tomorrow, where will you be?” 2020春节冠状病毒肆虐被迫禁足家里,无意间打开了2004年由德国罗兰·艾默里奇(Roland Emmeric ...

  2. 使用dlib基于CNN(卷积神经网络)的人脸检测器来检测人脸

    基于机器学习CNN方法来检测人脸比之前介绍的效率要慢很多 需要先下载一个训练好的模型数据: 地址点击下载 // dlib_cnn_facedetect.cpp: 定义控制台应用程序的入口点. // # ...

  3. JVM第一弹

    JVM第一弹 基本概念 JVM是可运行java代码的假想计算机,包括一套字节码指令集,一组寄存器,一个栈,一个垃圾回收.堆和一个存储方法域.JVM是运行在操作系统之上的,它与硬件没有直接的交互. 运行 ...

  4. java反射机制梳理

    java反射机制梳理 Java反射简介 反射简介 编译和运行 编译时刻加载类是静态加载类.运行时刻加载类是动态加载类 要让Java程序能够运行,那么就得让Java类要被Java虚拟机加载.Java类如 ...

  5. php--->底层的运行机制与数据结构原理

    PHP 底层的运行机制与数据结构原理 1. PHP的设计理念及特点 多进程模型:由于PHP是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影响,当然,随着时代发展,PHP也早 ...

  6. kali linux下的部分命令

    查看发行版本 cat    /etc/issue cat   /etc/*-release 查看内核版本 uname  -a 显示机器的处理器架构 arch uname -m 清屏 clear 命令行 ...

  7. JQuery--使用JQuery 的$.ajax 方法进行异步请求,导致页面闪烁

    情景 目前有个需求是在文本框填入内容,自动触发keyup事件,下拉列表会自动过滤相应的选项,但是使用了$,ajax后发现,每次触发事件时,都导致整个网页闪烁,触发了全局ajax事件 代码片段 $.aj ...

  8. MybatisDao

    一.mybatisDao的编写(原始方式,不用) 1.接口编写 public interface UserDao { public void save(User user); public User ...

  9. Codeforces_733_C

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

  10. Codeforces_512_B

    http://codeforces.com/problemset/problem/512/B dp题,因为状态很多,所以用map保存,注意代码中的那个二层循环不能内外换,因为map会自动排序. #in ...