一、概述

location模块是nginx中用的最多的,也是最重要的模块了,什么负载均衡啊、反向代理啊、虚拟域名啊都与它相关。

location 根据它字面意思就知道是来定位的,定位URL,解析URL,所以,它也提供了强大的正则匹配功能,也支持条件判断匹配,用户可以通过location指令实现Nginx对动、静态网页进行过滤处理,像我们的php环境搭建就是用到了它。

最常用的一个场景就是:服务器已经有了一个监听80端口的web服务了,此时我们如果想要再开启一个web服务就得要另外开启端口,这样的话就导致进入网站还得携带端口号,非常不方便,对于强迫症患者来说看起来也不舒服。

而有了反向代理之后,这个问题很轻松就能解决了,我们只需要配置一个二级域名,让nginx转发一下就OK了。

二、正向代理和反向代理

2.1 什么是代理

代理分为两种:正向代理反向代理 ,代理的过程就是客户端和服务端之间不直接进行通信,中间使用一台或者多态代理机器作为中转。

2.2 正向代理

正向代理是客户端在访问服务端的时候,客户端主动进行代理,连接代理主机以代理主机的身份访问服务端。然后服务端进行响应后,代理主机再把返回的数据发送到客户端,整个的流程为:

生活中正向代理的使用范围很广泛,最常用的就是翻墙了,然后各种网游加速器啊什么的也都是这个原理。

2.3 反向代理

反向代理的和正向代理相反,当客户端访问服务端的时候,服务端不是从自己主机取数据给客户端,而是从先从代理主机上获取相应的数据,然后假装成是自己的返回给客户端。

对于我们个人来说,用到反向代理的时候并不多,做内网穿透的ngrok 服务器就是这个原理。

三、反向代理的优点

反向代理的优点就比较多了:

  • 首先第一个是安全性高,真正提供服务的主机都放在代理主机内网后面,外部很难入侵。同时代理机上还可以配置防火墙。
  • 第二,就像上面所说的,80端口被占用之后还可以做到不加端口就能访问web服务。
  • 第三就是提供负载均衡服务,为不同的业务、不同的服务器做不同的请求处理。
  • many many ...

四、反向代理的配置

4.1 对端口实现代理

反响代理的配置大致为:

location / {
    proxy_pass http://127.0.0.1:8981;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

其中的参数说明为:

//TODO

假设现在要把端口8099 代理到8981 ,完整的server 模块内容应该为:

server {
    listen       8099;
    server_name  192.168.87.131;
    location / {
        proxy_pass http://127.0.0.1:8981;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }   
    charset utf-8;
    access_log  logs/demo.access.log  main;
    error_log  logs/demo.error.log  error;
}

重启nginx,开启一个godoc web版文档,监听8981 端口

[root@localhost nginx]# cd /usr/local/go/bin/
[root@localhost bin]# ./godoc -http=:8981

然后在浏览器中输入192.168.87.31:8099 ,注意端口是8099 不是8981

4.2 对域名实现代理

以上是根据端口来进行反向代理,端口代理好像没什么意义,因为反正要带端口号,带不代理都没意义。

现在我们改成根据域名来进行代理,实现用户通过域名maqian.test.com 访问80 端口的时候代理到godoc 页面。

server 段的配置如下:

server {
    listen       80; # 80端口
    server_name  maqian.test.com; # 服务名
    location / {
        proxy_pass http://127.0.0.1:8981; # 转发地址
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    charset utf-8;
    access_log  logs/demo.access.log  main;
    error_log  logs/demo.error.log  error;
}

在windows主机修改hosts,定义域名maqian.test.com 指向192.168.87.131

192.168.87.131    maqian.test.com

然后在命令行使用ipconfig /flushdns 刷新dns缓存,访问maqian.test.com

五、优化

上面的serverlocation 配置全部都放在nginx.conf 文件中,因为现在只有一个反向代理配置,所以修改起来还算是比较和谐。
但是一般情况下一个nginx下有很多个反向代理服务,同时也还会有多个负载均衡服务,这些东西一多起来配置也就多了,导致的结果就是管理就比较很麻烦,偌大一个文件,想定位到要操作的部分都很麻烦,一不小心看错了说不定会改错其他的配置。

对于这种情况,nginx提供了一种很好的方法来管理,就是单独把每个配置放到不同的文件中,然后使用include 把配置文件包含进来就可以了,就像C语言里面的包含头文件一样。

# 创建一个文件夹用来放配置文件
mkdir /etc/nginx/conf/ -p
# 创建配置文件
vi /etc/nginx/conf/godoc.conf
# 写入以下内容,保存退出
server {
    listen       80; # 80端口
    server_name  maqian.test.com; # 服务名
    location / {
        proxy_pass http://127.0.0.1:8981; # 转发地址
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
} 

nginx.conf 的配置里,需要先删除之前的server 段配置,然后在http 模块下加一行

include    /etc/nginx/conf/*.conf

重启服务器,再次访问maqian.test.com ,依旧能出现godoc 的页面。

这样的话,我们对配置文件进行增加修改或者删除操作就很方便了,再也不用都写到nginx.conf 中去了。

如果要添加代理,直接在/etc/nginx/conf 目录下添加一个新文件就可以,删除、修改也是一样,直接对配置文件进行操作就可以了。

最后修改:2024 年 03 月 10 日
喜欢就给我点赞吧