一、概述
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
五、优化
上面的server
和location
配置全部都放在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
目录下添加一个新文件就可以,删除、修改也是一样,直接对配置文件进行操作就可以了。
此处评论已关闭