上篇文章介绍了nginx静态虚拟配置的实现,而在实际项目中,情况都比较复杂。
项目nginx实用需求:
通过浏览器浏览获取数据,内部通过nginx实现端口转发,实现数据的传输实现。(通过浏览器访问192.168.11.27:9000, nginx转发到1010端口,返回数据)
毫无疑问,要想实现此功能,nginx.conf 配置文件才是我们操作的核心。关于端口转发的相关资料,nginx 中文文档中也有,这里就不做介绍了,直接贴代码了。
注意:
注意:
注意:本次例子中,用户请求存放在系统的 /usr/share/nginx/www/test.txt 路径下。
server{
listen 9000;
server_name mytest001;
access_log /var/log/nginx/access.9000.log;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
proxy_set_header Via "nginx";
#set config of websocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
location /usr {
proxy_pass http://192.168.11.127:1010;
}
}
server{
listen 1010;
server_name mytest;
access_log /var/log/nginx/access.1010.log;
location / {
root /;
index index.html index.htm;
}
}
在这里需要注意的是:
-
转发书写规则
location /usr { proxy_pass http://192.168.11.127:1010; }
当nginx检测到 192.168.11.127:9000/usr 时, 就会自动将该url转发到 192.168.11.127:1010/usr
-
路经要使得源端口与转发端口转化后路径一致
当上一章我们在设置虚拟静态路径时,将监听端口1010 的root 设置为了 /usr/share/nginx/www, 所以,我们可以通过
url:192.168.11.127:1010/test.txt 直接就能到test.txt 文件。
然而当不更改监听端口为1010的root路径时,我们通过url:192.168.11.127:9000/usr /test.txt 想要访问text.txt 文件,然而却返回404.
根据抓包和查看log文件可以得知,尽管nginx将来自9000端口的数据转发到了1010端口,但是实际请求数据为 /usr/test.txt, 所以端口1010端口收到的url 仅仅为/usr/test.txt,而并不是nginx根据静态路径转换到的 /usr/share/nginx/www/test.txt, 所以,根据实际的url (/usr/test.txt)是无法访问到test.txt 的,所以系统会返回404.为了解决路径问题,我们可以采用统一的采用跟路径为基准路径的方法,规范url中路径为绝对路径,这样就可以使得数据能够正常被访问。
所以,修正端口1010的root路径为 / ,可以通过url: 192.168.11.127:1010/usr/share/nginx/www/test.txt 来访问数据, 而当通过9000端口时(url: 192.168.11.127:9000/usr/share/nginx/www/test.txt ),nginx将来自9000端口的路径 /usr/share/nginx/www/test.txt 转发给1010端口,故1010端口收到的路径为 /usr/share/nginx/www/test.txt ,故能正常访问到test.txt中的数据。
验证:
根据上文中的nginx.conf文件,重新加载后(nginx -s reload), 通过浏览器和postman两个工具做测试
当访问端口为1010时,浏览器访问结果如下:
当访问端口为1010时,postman访问结果如下:
当访问端口为9000时,浏览器访问结果如下:
当访问端口为9000时,postman 访问结果如下:
至此,nginx的反向代理功能已经梳理通,剩下的工作就是根据项目需求实现数据的传递了。