有必要了解一下nginx转发请求的方式,弄清它是如何转发请求的对我们理解nginx的server块的配置很有意义(虽然我也还不是很明白)
上一节说了配置文件中可以有多个server块,所以这里我配置2个server块,来看当以不同域名(虚拟主机地址)发送请求时,nginx将该请求转发到了哪里
1.首先2个server块配置如下
server {
listen 80;
server_name hanmk.com;
location / {
root /tmp/data/;
autoindex on;
}
}
server {
listen 80 default_server;
server_name demo.com ; location / { # tomcat首页
proxy_pass http://localhost:8080;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /jenkins { #tomcat部署jenkins
proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; #获取真实ip
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#获取代理者的真实ip
proxy_redirect off;
}
location /ApprPhD { #nodeJs服务器
proxy_pass http://192.168.XXX.XXX:3030;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; #获取真实ip
proxy_set_header REMOTE-HOST $remote_addr;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#获取代理者的真实ip
proxy_redirect off;
}
}
说明:
第1个server中,把服务指向了服务器 /tmp/data/路径下的静态文件;
第2个server中,把服务指向了3个路由(一个路由指向拟机本地部署的tomcat首页,一个指向tomcat下部署的jenkins,一个指向另一台虚拟机上部署的应用)
两个server中配置的监听端口都是80(也是为了更好地查看测试效果)
server_name指定(虚拟主机)服务器名称,一般会配置域名(example.org ,www.example.org,可以使用精确的名称、通配符名称或正则表达式定义;当你在外网访问一个请求链接时,nginx会根据你填写的主机名称来匹配是转发到server1还是server2)
同样为了更好地查看测试效果,我在server_name中填写域名,而不是填写虚拟机真实的ip或者localhost(因为ip地址都是虚拟机ip,填写ip地址的话,看不出来nginx是如何转发请求的)(另外,如果只有一个server的话,server_name其实没有填写的必要,因为最终都会转发至该server下的服务器,我试了下,只要端口正确,都可以转发成功,内部原理还不清楚。。。)
server1中server_name填写hanmk.com
server2中server_name填写demo.com
完成上述配置后,需要重新加载一下配置文件nginx.conf
2.配置客户端的hosts文件
在第一步中分别在server_name中配置了hanmk.com和demo.com,但是因为并没有开通域名服务,所以直接在客户端使用这2个域名来发送请求,是会失败的,所以为了能够使用这两个假域名正常发送请求,要先在客户端主机配置一下,步骤如下:
打开hosts文件,添加如下两行即可(因为映射ip地址相同,所以把两个域名加在一行也可以,用空格隔开)
3.测试
(1)使用http://hanmk.com/发送请求,访问到的是虚拟机 /tmp/data/路径下的静态文件
(2)分别访问http://demo.com/、http://demo.com/jenkins、http://demo.com/ApprPhD/index,结果如下
说明nginx根据访问链接域名的不同匹配到了相应的server服务器,然后再根据location路径,路由到对应的服务
补充:上面第2个server块中,监听端口后有一个参数 default_server
当一个请求host名与任何一个server_name都不匹配时,那么这个请求会默认转向第一个server(这是nginx的标准默认行为),此外也可以显式地设置哪个服务器应该是默认的,并在listen指令中使用default_server参数
示例1:在两个server块中都不加default_server参数
然后以ip地址进行访问 :http://192.168.233.128/
因为ip地址不匹配hanmk.com和demo.com,所以默认转发到了第一个server块
示例2:在第二个sever块中加上default_server参数,如下
server {
listen default_server;
server_name demo.com ;
#charset koi8-r;
访问:http://192.168.233.128/
同样的ip链接,转发到了第二个server块
nginx如何处理请求的更多相关文章
-
Nginx-4.Nginx如何处理请求
原文 基于server_name 的虚拟站点 Nginx首先需要确定使用哪个server来处理请求.举个简单的例子,有下面几个server 第一个,监听80端口,为org站点 server { lis ...
-
Nginx如何处理一个请求
看了下nginx的官方文档,其中nginx如何处理一个请求讲解的很好,现在贴出来分享下.Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听 ...
-
Nginx源码结构及如何处理请求
一.源码结构 1:下载安装包后,解压,可以看到目录结构,其中src目录下放的是源码 2:src源码目录下,可以看到这几个目录 mail:mail目录中存放了实现Nginx服务器 ...
-
[转载]Nginx如何处理一个请求
http://nginx.org/cn/docs/http/request_processing.html 对我的扫盲文章 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一 ...
-
nginx学习笔记(7)Nginx如何处理一个请求---转载
如何防止处理未定义主机名的请求基于域名和IP混合的虚拟主机一个简单PHP站点配置 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口 ...
-
Nginx 如何处理一个请求
基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始: server { listen 80; server_na ...
-
nginx的请求接收流程(一)
今年我们组计划写一本nginx模块开发以及原理解析方面的书,整本书是以open book的形式在网上会定时的更新,网址为http://tengine.taobao.org/book/index.htm ...
-
《ASP.NET Core In Action》读书笔记系列三 ASP.NET Core如何处理请求的?
在本节中,您将看到ASP.NET Core应用程序如何运行的,从请求URL开始到页面呈现在浏览器中. 为此,您将看到 一个HTTP请求在Web服务器中是如何被处理的.ASP.NET Core如何扩展该 ...
-
Nginx处理请求过程
1. worker进程工作机制 现在我们了解了当我们在操作nginx的时候,nginx内部做的一些事情,那么worker进程又是如何处理请求的呢? 我们前面有提到,worker进程之间是平等的, ...
随机推荐
-
Java消息队列--ActiveMq 实战
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
-
C语言 负数取余的原理
负数求余数运算是一个数学问题: 任何一个整数n都可以表示成 n=k*q+r 其中0<=|r|<|q| 这里的r就是n除以q的余数,即 r==n%q 例如: -9=(-2)*4+(-1) 则 ...
-
cocos2dx lua 绑定之二:手动绑定自定义类中的函数
cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一 ...
-
智能电视TV开发---客户端和服务器通信
在做智能电视应用的时候,最头疼的就是焦点问题,特别是对于个人开发者,没有设备这是最最头疼的事情了,在没有设备的情况下,怎么实现智能电视应用呢,接下来我是用TV程序来做演示的,所以接下来的所有操作是在有 ...
-
Struts2+JFreeChart
前言 关于Struts2入门以及提高等在这里就不介绍了,但是关于Struts2的学习有以下推荐: struts2-showcase-2.0.6.war:这个是官方自带的Demo(struts-2.0. ...
-
前端面试题总结:HTML5,JS,CSS3,兼容性。
1. 请写出至少20个HTML5标签 <article><aside> <audio><video> <canvas><datalis ...
-
layer,Jquery,validate实现表单验证,刷新页面,关闭子页面
1.表单验证 //获取父层 var index = parent.layer.getFrameIndex(window.name); //刷新父层 parent.location.reload(); ...
-
BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS
BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS Description Diffie-Hellman密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码 ...
-
python多进程web爬虫-提升性能利器
背景介绍: 小爬我最近给部门开发了一系列OA的爬虫工具,从selenium前端模拟进化到纯requests后台post请求爬取,效率逐步提升.刚开始能维持在0.5秒/笔.可惜当数据超过2000笔后,爬 ...
-
Linux 调试打印时间和颜色
Linux调试打印时间和颜色 #include <sys/time.h> #include <unistd.h> void print_time(void) { struct ...