Nginx-4.Nginx如何处理请求
基于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如何处理请求的更多相关文章
- Nginx源码结构及如何处理请求
一.源码结构 1:下载安装包后,解压,可以看到目录结构,其中src目录下放的是源码 2:src源码目录下,可以看到这几个目录 mail:mail目录中存放了实现Nginx服务器 ...
- nginx如何处理请求
有必要了解一下nginx转发请求的方式,弄清它是如何转发请求的对我们理解nginx的server块的配置很有意义(虽然我也还不是很明白) 上一节说了配置文件中可以有多个server块,所以这里我配置2 ...
- 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器
现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...
- Nginx+Lua+Redis 对请求进行限制
Nginx+Lua+Redis 对请求进行限制 一.概述 需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器 ...
- nginx源代码分析--读请求主体(1)
首先,读取请求体已进入HTTP要求11相,我们需要做的请求正文部分处理一些模块,所以这个模块需要注册功能在这个阶段,在阅读功能要求的身体ngx_http_read_client_request_bod ...
- 利用nginx 虚拟主机、请求转发实现不同端口web访问
一个服务器上挂一个网站实在是有点浪费:一个服务器上可以放多个网站:可以开启nginx的虚拟主机功能:利用访问的路径或者域名不同访问不同的文件夹:例如: 1.一台服务器上放多个网站使用nginx的配置文 ...
- 记一次nginx强制将https请求重定向http
公司要做小程序,但是发现小程序只允许https请求 所以查了查资料使用nginx重定向请求得方式做 以下是过程: 阿里云ssl证书管理控制台申请ssl证书 下载nginx 证书: 解压后得到后缀为ke ...
- nginx反向代理导致请求header头信息丢失
背景:前端与后端调试接口,后端拿不到前段发过去的请求头信息,导致接口不通.(但是在本地是可以拿到的) 原因:nginx做了反向代理,没有请求时候加头信息的配置 报错如下: 解决方法: 方法一:NGIN ...
- Nginx 流量带宽等请求状态统计( ngx_req_status)
Nginx 流量带宽等请求状态统计 ( ngx_req_status) 插件下载地址: wget http://nginx.org/download/nginx-1.4.2.tar.gz git c ...
- nginx限制请求之三:Nginx+Lua+Redis 对请求进行限制
相关文章: <高可用服务设计之二:Rate limiting 限流与降级> <nginx限制请求之一:(ngx_http_limit_conn_module)模块> <n ...
随机推荐
- NOI2.5 1817:城堡问题
描述 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # ...
- Redis(七):set/sadd/sismember/sinter/sdiffstore 命令源码解析
上两篇我们讲了hash和list数据类型相关的主要实现方法,同时加上前面对框架服务和string相关的功能介绍,已揭开了大部分redis的实用面纱. 现在还剩下两种数据类型: set, zset. 本 ...
- Ubuntu通过终端命令行换阿里源
检查Ubuntu系统的Codename $ lsb_release -a 得到结果: No LSB modules are available. Distributor ID: Ubuntu Desc ...
- MVC ajaxfileupload 实现无刷新导入或上传功能
直接上代码吧 前台 先引用 ajaxfileupload.js <script src="~/Scripts/ajaxfileupload.js"></scrip ...
- FD_WRITE是如何触发的?
The FD_WRITE network event is handled slightly differently. An FD_WRITE network event is recorded wh ...
- ubuntu 全英文环境下安装 拼音输入法
原文转自:http://my.oschina.net/No5stranger/blog/290026 ubuntu默认的输入法是ibus,综合网上评论,fcitx的支持者更多,而且个人感觉fcitx也 ...
- Codeforces_832
A.判断n/k的奇偶性. #include<bits/stdc++.h> using namespace std; long long n,k; int main() { ios::syn ...
- Codeforces_733_C
http://codeforces.com/problemset/problem/733/C 从后往前一个个b对应一组组a. #include<iostream> #include< ...
- HDU_1232_并查集
http://acm.hdu.edu.cn/showproblem.php?pid=1232 第一道并查集,挺好理解的,初始化,查找根节点,连接,路径压缩. #include<iostream& ...
- HDU_2579_bfs
http://acm.split.hdu.edu.cn/showproblem.php?pid=2579 简单bfs题,刚开始在纠结怎么存放vis,因为步数可能有几百步,这么多格子开数组的话也太多了, ...