nginx如何处理请求

Posted 我是冰霜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx如何处理请求相关的知识,希望对你有一定的参考价值。

有必要了解一下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    80 default_server;
        server_name demo.com ;
        #charset koi8-r;

访问:http://192.168.233.128/

同样的ip链接,转发到了第二个server块

 

以上是关于nginx如何处理请求的主要内容,如果未能解决你的问题,请参考以下文章

nginx如何处理请求

Nginx 是如何处理 HTTP 头部的?

Nginx 是如何处理 HTTP 头部的?

跟我学Nginx,nginx 如何处理请求?

nginx理解--如何处理一个请求

Nginx是如何处理一个请求