在实际工作中,遇到一个问题:由于客户数据保密性较高,所以需要使用VPN访问其网络。为减少漏洞筛查风险,只开放了一个8080端口。

但我们部署了产品(端口为8082)和OnlyOffice插件(端口为28080),需要使用Nginx反向代理,将端口转发。

经过一段时间的摸索,终于成功配置,做一个记录。

我们的所有服务都采用docker部署,部署nginx时,将宿主机的8080端口映射到了nginx的80端口上,由于server中默认监听端口是80,因此未再配置listen。如需配置,请自行在Server下配置监听。

部署在onlyoffice语句如下:

docker run --name onlyoffice --restart=always --privileged=true -i -t -d -p  28080:80 -v /opt/onlyoffice/DocumentServer/data:/var/www/onlyoffice -v /usr/local/onlyoffice/lib:/var/lib/onlyoffice -v /usr/local/onlyoffice/db:/var/lib/postgresql -e JWT_ENABLED=false onlyoffice/documentserver:latest

部署nginx语句如下:

docker run --name nginx-test -p 8080:80 -d nginx

进入nginx容器,进入/etc/nginx/目录下,编辑nginx.conf文件。

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

        map $http_host $this_host {
    "" $host;
    default $http_host;
        }

        map $http_x_forwarded_proto $the_scheme {
        default $http_x_forwarded_proto;
        "" $scheme;
        }

        map $http_x_forwarded_host $the_host {
        default $http_x_forwarded_host;
        "" $this_host;
        }


        map $http_upgrade $proxy_connection {
        default upgrade;
        "" close;
        }
server {
        listen       80;
        server_name  172.16.12.100;
        charset utf-8;
        location /app {

                                proxy_pass http://1.2.3.4:28080/app;
                                proxy_set_header Upgrade $http_upgrade;
                                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                                proxy_set_header Connection "upgrade";
                                                }
        location /example/ {
                                proxy_pass http://1.2.3.4:28080/example/;
                                proxy_set_header Upgrade $http_upgrade;
								proxy_set_header Connection $proxy_connection;
                                proxy_set_header X-Forwarded-Host $the_host;
                                proxy_set_header X-Forwarded-Proto $the_scheme;
                                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

        location /web-apps/ {
                                proxy_pass http://1.2.3.4:28080/web-apps/;
                                proxy_set_header Upgrade $http_upgrade;
								proxy_set_header Connection $proxy_connection;
                                proxy_set_header X-Forwarded-Host $the_host;
                                proxy_set_header X-Forwarded-Proto $the_scheme;
                                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

        location /8.1.1-26(换成自己的OnlyOffice版本)/ {
                                proxy_pass http://1.2.3.4:28080/8.1.1-26/;
                                proxy_set_header Upgrade $http_upgrade;
								proxy_set_header Connection $proxy_connection;
                                proxy_set_header X-Forwarded-Host $the_host;
                                proxy_set_header X-Forwarded-Proto $the_scheme;
                                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }


        location /cache/ {
                                proxy_pass http://1.2.3.4:28080/cache/;
                                proxy_set_header Upgrade $http_upgrade;
								proxy_set_header Connection $proxy_connection;
                                proxy_set_header X-Forwarded-Host $the_host;
                                proxy_set_header X-Forwarded-Proto $the_scheme;
                                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}


    #gzip  on;


下面是每个指令的作用:

全局设置
user nginx;
指定运行Nginx进程的用户为nginx。

worker_processes auto;
设置工作进程的数量为自动,Nginx会根据系统的CPU核心数自动调整。

error_log /var/log/nginx/error.log notice;
定义错误日志的路径和日志级别为notice。

pid /var/run/nginx.pid;
定义存放Nginx进程ID的文件路径。

events模块
worker_connections 1024;
每个工作进程可以打开的最大连接数。

http模块
include /etc/nginx/mime.types;
包含MIME类型定义文件。

default_type application/octet-stream;
如果Nginx无法确定文件的MIME类型,则使用此默认值。

log_format main …;
定义日志格式。

access_log /var/log/nginx/access.log main;
定义访问日志的路径和格式。

sendfile on;
允许sendfile方式传输文件,提高传输效率。

keepalive_timeout 65;
长连接超时时间设置为65秒。

map指令

1、map $http_host $this_host

这个map指令根据 $http_host变量的值来设置$this_host变量的值。

  • 如果$http_host是空的(“”),则$this_host被设置为$host的值。`
  • 对于其他所有情况(default),$this_host的值就是$http_host的值。这通常用于处理反向代理场景,当$http_host可能为空或来自不可信来源时,可以确保$this_host始终有一个有效的值。`

2、map http_x_forwarded_proto the_scheme

这个map指令根据$http_x_forwarded_proto变量的值来设置$the_scheme变量的值。

  • 如果$http_x_forwarded_proto是空的(“”),则$the_scheme被设置为$scheme的值。这通常表示原始请求是HTTP还是HTTPS。
  • 对于其他所有情况(default),$the_scheme的值就是$http_x_forwarded_proto的值。这常用于处理通过反向代理传递的X-Forwarded-Proto头,以获取原始请求的协议。

3、map http_x_forwarded_host the_host

这个map指令根据$http_x_forwarded_host变量的值来设置$the_host变量的值。

  • 如果$http_x_forwarded_host是空的(“”),则$the_host被设置为$this_host的值(这个值在第一个map指令中定义)。
  • 对于其他所有情况(default),$the_host的值就是$http_x_forwarded_host的值。与第二个map指令类似,这用于处理通过反向代理传递的X-Forwarded-Host头,以获取原始请求的主机名。

4、map $http_upgrade $proxy_connection

这个map指令根据$http_upgrade变量的值来设置$proxy_connection变量的值。

  • 如果$http_upgrade是空的(“”),则$proxy_connection被设置为close。
  • 对于其他所有情况(default),$proxy_connection的值就是upgrade。这通常用于处理WebSocket连接或其他需要升级的HTTP连接。当客户端请求升级连接时,$proxy_connection会被设置为upgrade,以允许Nginx维持与后端的连接。
    这些map指令是Nginx配置中非常有用的工具,特别是在处理反向代理和HTTP连接升级时。它们允许你根据请求头或其他变量动态地设置其他变量的值。

server模块
location /app {…}
定义了一个针对/app路径的代理设置,将请求转发到http://1.2.3.4:8082/app,并设置相关代理头部。

location /example/ {…}
定义了一个针对/example/路径的代理设置,将请求转发到http://1.2.3.4:8088/example/,并设置更详细的代理头部,包括X-Forwarded-Host和X-Forwarded-Proto,以便后端服务可以正确识别请求的原始信息。

……

以location /example/{…}为例:

这段Nginx配置中的location指令定义了一个特定的位置块,用于处理所有以/example/开头的URL请求。
在这个位置块中,定义了一系列与代理相关的指令,用于将请求转发到另一个服务器(在这个例子中是http://1.2.3.4:8088/example/)。

下面是对每个指令的详细解释:

proxy_pass http://1.2.3.4:8088/example/;

这条指令告诉Nginx将匹配到的请求转发到http://1.2.3.4:8088/example/。
注意这里的URL末尾的斜杠/很重要,它表示如果原始请求中有额外的路径部分,它们将被追加到proxy_pass指定的URL后面。

proxy_set_header Upgrade $http_upgrade;

这条指令用于设置转发给代理服务器的Upgrade请求头。它使用了先前定义的map指令中的$http_upgrade变量。如果原始请求中包含了Upgrade头,它的值将被传递给代理服务器,这通常用于支持WebSocket连接或其他需要升级的协议。

proxy_set_header X-Forwarded-Host $the_host;

这条指令用于设置X-Forwarded-Host请求头,其值来自$the_host变量。这个头通常用于表示原始请求的主机名,这在反向代理场景中很有用,因为代理服务器可能会看到不同的主机名。

proxy_set_header X-Forwarded-Proto $the_scheme;

这条指令设置X-Forwarded-Proto请求头,其值来自$the_scheme变量。这个头用于表示原始请求使用的协议(通常是http或https),这有助于后端服务器知道原始请求是否通过加密连接。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

这条指令设置X-Forwarded-For请求头,用于表示原始请求的客户端IP地址。$proxy_add_x_forwarded_for变量通常包含客户端IP以及任何之前代理的IP地址(如果存在的话),这有助于后端服务器跟踪请求的原始来源。

proxy_set_header Connection $proxy_connection;

这条指令用于设置转发给代理服务器的Connection请求头。它使用了先前定义的map指令中的$proxy_connection变量。这允许Nginx根据原始请求中的Upgrade头来决定是否应该保持与代理服务器的持久连接。

总结
这个Nginx配置主要用于设置全局参数和定义多个代理位置。它允许Nginx根据请求的URL路径将请求转发到不同的后端服务,并设置必要的代理头部,以便后端服务可以正确识别和处理请求。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐