一、需求

具体实现以下功能:使用 nginx 作为对外的服务机器,让客户端通过访问 nginx 所在的IP+端口的方式能访问内部多个系统,这样一来通过对单台机器作访问控制就可以保证内部系统的访问安全。
实现思路如下:在对外的机器上部署 nginx 服务,通过 nginx 虚拟机功能和代理功能相结合实现多组代理。具体场景如下:

代理服务器 代理服务
nginx 192.168.10.10:8080 192.168.10.11:8080
nginx 192.168.10.10:8081 192.168.10.11:9000

二、环境

测试环境如下:

  • 代理服务器:ip 192.168.10.10;系统 CentOS7 ;
  • 需要代理的服务:192.168.10.11:8080 nginx ;192.168.10.11:9000 tomcat

三、配置代理

假如有两个服务需要配置代理,一个 web,一个 tomcat。web 运行在 192.168.10.11:8080
image.png

tomcat 运行在 192.168.10.11:9000
image.png

现在配置 nginx 代理。

1.安装 nginx
先在代理服务器上安装 nginx,使用命令:

  1. $ yum install -y nginx

安装成功后就可以尝试启动 nginx 服务器:

  1. $ systemctl start nginx

启动服务成功后,nginx 就运行在 80 端口。

2.修改配置文件
安装nginx就可以修改配置文件,配置文件的默认路径为

  1. $ ll /etc/nginx/nginx.conf
  2. -rw-r--r-- 1 root root 1822 Nov 24 19:30 /etc/nginx/nginx.conf

修改 nginx.conf 如下

  1. # 系统用户
  2. user nginx;
  3. # 工作进程数,配置高的机器可以适当增加
  4. worker_processes 4;
  5. # 错误日志
  6. error_log /var/log/nginx/error.log;
  7. # pid 文件存放目录
  8. pid /run/nginx.pid;
  9. events {
  10. # linux 使用 epoll 事件机制
  11. use epoll;
  12. # 连接数
  13. worker_connections 1024;
  14. }
  15. http {
  16. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  17. '$status $body_bytes_sent "$http_referer" '
  18. '"$http_user_agent" "$http_x_forwarded_for"';
  19. access_log /var/log/nginx/access.log main;
  20. sendfile on;
  21. tcp_nopush on;
  22. tcp_nodelay on;
  23. keepalive_timeout 65;
  24. types_hash_max_size 2048;
  25. include /etc/nginx/mime.types;
  26. default_type application/octet-stream;
  27. # 配置虚拟机,在该目录下配置多个配置文件对应多台需要代理的机器
  28. include /etc/nginx/conf.d/*.conf;
  29. # 配置 https
  30. # Settings for a TLS enabled server.
  31. #
  32. # server {
  33. # listen 443 ssl http2 default_server;
  34. # listen [::]:443 ssl http2 default_server;
  35. # server_name _;
  36. # root /usr/share/nginx/html;
  37. #
  38. # ssl_certificate "/etc/pki/nginx/server.crt";
  39. # ssl_certificate_key "/etc/pki/nginx/private/server.key";
  40. # ssl_session_cache shared:SSL:1m;
  41. # ssl_session_timeout 10m;
  42. # ssl_ciphers HIGH:!aNULL:!MD5;
  43. # ssl_prefer_server_ciphers on;
  44. #
  45. # # Load configuration files for the default server block.
  46. # include /etc/nginx/default.d/*.conf;
  47. #
  48. # location / {
  49. # }
  50. #
  51. # error_page 404 /404.html;
  52. # location = /40x.html {
  53. # }
  54. #
  55. # error_page 500 502 503 504 /50x.html;
  56. # location = /50x.html {
  57. # }
  58. # }
  59. }

注意 23 行的配置:include /etc/nginx/conf.d/*.conf; 这个目录下就是要存放代理的配置文件。一般这个文件默认是存在的,如果目录不存在,就创建并修改权限。

  1. $ mkdir /etc/nginx/conf.d
  2. $ chmod 755 /etc/nginx/conf.d

3.配置代理文件
在这个目录下存放代理服务的文件,最好一个代理对应一个配置文件。我们之前需求上需要代理的服务是两个,直接创建两个代理文件,并修改

  1. # /etc/nginx/conf.d/nginx.conf
  2. # 代理的节点
  3. # upstream <代理名称 唯一>
  4. upstream nginx_server {
  5. # 代理的ip:port,可添加多个ip地址就行负载均衡
  6. server 192.168.10.11:8080;
  7. }
  8. server
  9. {
  10. # 监听的地址和端口
  11. # 对应一个代理一个端口
  12. listen 192.168.10.10:8080;
  13. # 对外的域名
  14. server_name aaa.test.com;
  15. location / {
  16. # 代理配置,名称和以上的代理名称对应
  17. proxy_pass http://nginx_server;
  18. # 配置使用真实的地址访问,如果不配置此项会导致代理tomcat服务器 400 错误
  19. proxy_set_header Host $host;
  20. }
  21. }
  1. # cat /etc/nginx/conf.d/tomcat.conf
  2. upstream tomcat_server {
  3. server 192.168.10.11:9000;
  4. }
  5. server
  6. {
  7. listen 192.168.10.10:8081;
  8. server_name bbb.test.com;
  9. location / {
  10. proxy_pass http://tomcat_server;
  11. proxy_set_header Host $host;
  12. }
  13. }

修改并保存后,使用 nginx 命令来验证文件的语法:

  1. $ # nginx -t
  2. nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
  3. nginx: configuration file /etc/nginx/nginx.conf test is successful

之后就可以重启 nginx 服务

  1. $ systemctl restart nginx
  2. $ netstat -tnlp | grep nginx
  3. tcp 0 0 192.168.10.10:8080 0.0.0.0:* LISTEN 11643/nginx: master
  4. tcp 0 0 192.168.10.10:8081 0.0.0.0:* LISTEN 11643/nginx: master

可以看到成功绑定两个端口,代理两个服务。通过浏览器访问8080和8081
image.png
image.png

到这里配置就完成了。如果需要再代理,在 /etc/nginx/conf.d 目录下再添加相应的配置文件就可以。如果没有访问成功,请检查各种防火墙和安全策略。