一、概述
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 对端口实现代理
反响代理的配置大致为:
1 2 3 4 5 6 7 |
location / { proxy_pass https://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
模块内容应该为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
server { listen 8099; server_name 192.168.87.131; location / { proxy_pass https://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
端口
1 2 |
[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
段的配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
server { listen 80; # 80 端口 server_name maqian.test.com; # 服务名 location / { proxy_pass https://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
1 |
192.168.87.131 maqian.test.com |
然后在命令行使用 ipconfig /flushdns
刷新 dns 缓存,访问 maqian.test.com
五、优化
上面的 server
和 location
配置全部都放在 nginx.conf
文件中,因为现在只有一个反向代理配置,所以修改起来还算是比较和谐。
但是一般情况下一个 nginx 下有很多个反向代理服务,同时也还会有多个负载均衡服务,这些东西一多起来配置也就多了,导致的结果就是管理就比较很麻烦,偌大一个文件,想定位到要操作的部分都很麻烦,一不小心看错了说不定会改错其他的配置。
对于这种情况,nginx 提供了一种很好的方法来管理,就是单独把每个配置放到不同的文件中,然后使用 include
把配置文件包含进来就可以了,就像 C 语言里面的包含头文件一样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 创建一个文件夹用来放配置文件 mkdir /etc/nginx/conf/ -p # 创建配置文件 vi /etc/nginx/conf/godoc.conf # 写入以下内容,保存退出 server { listen 80; # 80 端口 server_name maqian.test.com; # 服务名 location / { proxy_pass https://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
模块下加一行
1 |
include /etc/nginx/conf/*.conf |
重启服务器,再次访问 maqian.test.com
,依旧能出现 godoc
的页面。
这样的话,我们对配置文件进行增加修改或者删除操作就很方便了,再也不用都写到 nginx.conf
中去了。
如果要添加代理,直接在/etc/nginx/conf
目录下添加一个新文件就可以,删除、修改也是一样,直接对配置文件进行操作就可以了。
评论