nginx的server_name和代理原理

server_name

假如接口地址是
https://bizapi.csdn.net/blog-console-api/v1/article/getQueryCriteriaNew

那么 nginx 的 server_name 匹配的就是 bizapi.csdn.net ,就算这个 bizapi.csdn.net 域名被dns服务器解析成实际的ip地址如123.12.212.11,它的请求头的host字段依然是 bizapi.csdn.net。到达nginx后依然匹配server_name = bizapi.csdn.net

入门nginx

网上的入门信息都很垃圾,看得让人头疼,好好的入门教程写的什么鬼玩意,我重新整理了一遍。

首先假设后端的接口ip为

192.168.184.20:8080

那么我们需要在本地起一个nginx去反向代理到后端,最关键的部分来了,看如下代码
假如我们电脑的ip是

192.168.184.240

我们来修改 nginx.config

// back_end 随便写,但是等下要用到
upstream back_end {
    // 后端服务器地址
    server 192.168.184.20:8080
}

// server就是在本地起一个http服务器
server {
    // 这个服务器的端口是80
    listen 80;
    // 定义这个服务器的域名是 proxy.kutian.edn
    server_name  proxy.kutian.edn;
    // 当用户请求 http://proxy.kutian.edn/proxy 会走这里
    location /proxy {
        // 这个 back_end 会匹配我们上面的 upstream,实际上发出请求是http://192.168.184.20:8080/proxy
        proxy_pass http://back_end/proxy
    }
    // 当用户请求 http://proxy.kutian.edn/xxxx 会走这里
    location /xxxx {
        proxy_pass http://back_end/yyy
    }
     // 当用户请求 http://proxy.kutian.edn 会走这里
    location / {
        proxy_pass http://back_end
    }
}

这样我们就起了一台域名为 http://proxy.kutian.edn 服务器,这时候你会直接在前端这样写

axios('http://proxy.kutian.edn')

你以为能够直接访问到后端的 192.168.184.20:8080

但是却很遗憾的说不行,因为你以为server_name就是起一个域名为

http://proxy.kutian.edn 的服务器所以直接访问 http://proxy.kutian.edn

就行了,其实不是。我们本地ip是什么,这里是 192.168.184.240:80

就是以 192.168.184.240:80 起一个服务器,名字叫 http://proxy.kutian.edn 而已。

所以我们还需要在host文件写上

192.168.184.240 proxy.kutian.edn

这里又引入一个问题,你可能又会以为那我请求的是 http://proxy.kutian.edn:80 ,我们的host文件将这个url域名改成 http://192.168.184.240:80 ,那么发出请求的是 http://192.168.184.240:80 ,那nginx服务器又怎么知道匹配的是那个 server 呢,现在只有一个server(就是nginx.conf的server {}),是有很多个server(你可以自行添加)但是每个server 的server_name
不一样。其实,我们在浏览器发出的每一个请求请求头都会有一个host字段(随便找个网站打开network就能看到),host文件只是把请求的url改了而已,但是请求头和请求体的内容不会发生改变,当请求经过host文件,到达nginx的时候,nginx会从请求的请求头上获取host字段来对比当前的server_name,如果一致就执行当前这个server。

nginx的server_name和代理原理_第1张图片

分割线 ===================================

nginx配置:server_name的作用

server name 为虚拟服务器的识别路径。因此不同的域名会通过请求头中的HOST字段,匹配到特定的server块,转发到对应的应用服务器中去。

修改nginx.conf

server {
	listen 80;
	server_name www;
	location / {
		default_type text/html;
		content_by_lua '
			ngx.say("

first

") '; } } server { listen 80; server_name www.zkh.com; location / { default_type text/html; content_by_lua ' ngx.say("

second

") '; } } server { listen 80; server_name www.zkh.*; location / { default_type text/html; content_by_lua ' ngx.say("

third

") '; } } server { listen 80; server_name ~\w+.com; location / { default_type text/html; content_by_lua ' ngx.say("

forth

") '; } } server { listen 80; server_name ~.*zkh.com; location / { default_type text/html; content_by_lua ' ngx.say("

fifth

") '; } }

修改hosts文件

118.126.100.138 www.zkh.com
118.126.100.138 www.zkh.org
118.126.100.138 zkh.com
118.126.100.138 zkh.org

通过network查看请求头,发现请求头携带了Host,由此可知nginx必定会拿它做uri匹配工作
自己随便找个网站打开看下就行了,我就不截图了

你可能感兴趣的:(nginx,http,web)