有必要了解一下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如何处理请求的更多相关文章

  1. Nginx-4.Nginx如何处理请求

    原文 基于server_name 的虚拟站点 Nginx首先需要确定使用哪个server来处理请求.举个简单的例子,有下面几个server 第一个,监听80端口,为org站点 server { lis ...

  2. Nginx如何处理一个请求

    看了下nginx的官方文档,其中nginx如何处理一个请求讲解的很好,现在贴出来分享下.Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听 ...

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

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

  4. [转载]Nginx如何处理一个请求

    http://nginx.org/cn/docs/http/request_processing.html 对我的扫盲文章 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一 ...

  5. nginx学习笔记(7)Nginx如何处理一个请求---转载

    如何防止处理未定义主机名的请求基于域名和IP混合的虚拟主机一个简单PHP站点配置 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口 ...

  6. Nginx 如何处理一个请求

    基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始: server { listen 80; server_na ...

  7. nginx的请求接收流程(一)

    今年我们组计划写一本nginx模块开发以及原理解析方面的书,整本书是以open book的形式在网上会定时的更新,网址为http://tengine.taobao.org/book/index.htm ...

  8. 《ASP.NET Core In Action》读书笔记系列三 ASP.NET Core如何处理请求的?

    在本节中,您将看到ASP.NET Core应用程序如何运行的,从请求URL开始到页面呈现在浏览器中. 为此,您将看到 一个HTTP请求在Web服务器中是如何被处理的.ASP.NET Core如何扩展该 ...

  9. Nginx处理请求过程

    1. worker进程工作机制  现在我们了解了当我们在操作nginx的时候,nginx内部做的一些事情,那么worker进程又是如何处理请求的呢?   我们前面有提到,worker进程之间是平等的, ...

随机推荐

  1. oracle常用SQL——创建用户、表空间、授权(12C)

    一.查询 查询用户所属 表空间 select username,default_tablespace from dba_users where username='xxx' 查询表空间情况 SELEC ...

  2. 动态规划之132 Palindrome Partitioning II

    题目链接:https://leetcode-cn.com/problems/palindrome-partitioning-ii/description/ 参考链接:https://blog.csdn ...

  3. SSH服务拒绝了密码

    原因一:密码错误 解决方法:修改密码 方式一:救援模式修改密码 方式二:单用户模式破解root密码 原因二: /etc/ssh/sshd_config里设置禁止root用户直接远程登录 解决方法: v ...

  4. error和exception有什么区别?

    Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题.比如:内存资源不足等.对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由Java虚拟机抛 ...

  5. linux内核中宏container_of是干什么的?

    Linux Kernel Version 4.14 1. container_of是干什么的? 已知一个结构体中某个成员的首指针,那么就可以通过宏container_of来获得此结构体的首指针 2 先 ...

  6. 【控制分片分配】控制Elasticsearch分片和副本的分配

    ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本.通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题.不能运 ...

  7. Android 设置app 启动

    首先建立一个Activity 类.然后他会自动生成一个Layout XML. 再去到AndroidManifest.xml <activity android:name="com.zx ...

  8. Shiro学习笔记(二)

    首先还是先搭建工程运行环境  依旧搭建的是Maven工程,如果不是Maven 也可以去网上找jar包然后导入 (我使用Maven主要是找依赖配置文件就行,我自己导jar包的时候就是很容易报错) 还是先 ...

  9. MongoDB集群配置笔记一

    MongoDB 的部署方案有单机部署.复本集(主备)部署.分片部署.复本集与分片混合部署.混合的部署方式如图: 分片集群的构造 (1)mongos :数据路由,和客户端打交道的模块.mongos本身没 ...

  10. ZooKeeper分布式过程协同技术详解1——ZooKeeper的概念和基础

    简介 分布式系统和应用,不仅能提供更强的计算能力,还能为我们提供更好的容灾性和扩展性. ZooKeeper是Google的Chubby项目的开源实现,它曾经作为Hadoop的子项目,在大数据领域得到广 ...