Nginx反向代理配置(以OnlyOffice插件为例)

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

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

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

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

部署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 {
        location /app {

                                proxy_pass http://1.2.3.4:8082/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:8088/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:8088/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 /7.1.1-23(换成自己的OnlyOffice版本)/ {
                                proxy_pass http://1.2.3.4:8088/7.1.1-23/;
                                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:8088/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;

    include /etc/nginx/conf.d/*.conf;
}

下面是每个指令的作用:

全局设置

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始终有一个有效的值。
  1. 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头,以获取原始请求的协议。

  1. 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头,以获取原始请求的主机名。

  1. 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/)。

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

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

  2. proxy_set_header Upgrade $http_upgrade;

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

  3. proxy_set_header Connection $proxy_connection;

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

  4. proxy_set_header X-Forwarded-Host $the_host;

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

  5. proxy_set_header X-Forwarded-Proto $the_scheme;

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

  6. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

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

总结

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

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这里是一个简单的Nginx反向代理配置示例: ```nginx server { listen 80; server_name example.com; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ``` 这个配置将会把所有的来自 example.com 的请求都转发到本地的 3000 端口上去。其中,`proxy_pass` 指定了要转发的目标地址,`proxy_set_header` 则是设置了一些 HTTP 头信息,比如 Host 和 X-Real-IP 等。 当然,实际的配置可能会更加复杂,需要根据具体的需求进行调整。 ### 回答2: nginx是一款高性能的反向代理服务器软件。反向代理是指代理服务器接收来自客户端的请求,然后将请求转发给内部的服务器,最后将服务器返回的响应返回给客户端。通过nginx反向代理配置,我们可以实现负载均衡、高可用、缓存等功能。 在nginx配置反向代理一般需要以下步骤: 1. 在nginx配置文件中找到http块,添加一个新的server块,指定监听的端口和域名或IP地址。 2. 在server块中配置location指令,用于匹配客户端请求的URL地址。可以使用正则表达式进行更灵活的匹配。 3. 在location块中使用proxy_pass指令,指定转发请求的目标服务器地址和端口。例如:proxy_pass http://localhost:8080。 4. 可以通过proxy_set_header指令设置转发请求时所需的头部信息,如Host、User-Agent等。 5. 配置其他反向代理相关的指令,如proxy_connect_timeout、proxy_read_timeout等参数,用于控制与目标服务器的连接和读取超时时间。 6. 重启nginx服务,使配置生效。 配置完毕后,nginx会根据配置反向代理规则,将客户端的请求转发给目标服务器处理。目标服务器将处理结果返回给nginx,然后nginx将结果返回给客户端。 需要注意的是,配置反向代理时要确保目标服务器已经启动,并且可以正常响应请求。同时,配置的域名或IP地址需要与客户端的请求匹配,否则转发将无法生效。 通过nginx反向代理配置,我们可以实现多种功能,如实现负载均衡、部署静态缓存、提供SSL加密、进行HTTP请求过滤等。这使得nginx成为了非常强大和灵活的反向代理服务器软件。 ### 回答3: Nginx是一个高性能的Web服务器和反向代理服务器。反向代理是一种服务器配置模式,它允许Nginx接收客户端请求并将其转发到后端服务器,然后将响应返回给客户端。以下是Nginx反向代理配置步骤: 1. 安装和启动Nginx服务器:首先,需要在服务器上安装Nginx,并启动它。可以使用包管理器来执行这些操作。 2. 配置反向代理:编辑Nginx配置文件(通常位于/etc/nginx/nginx.conf),添加反向代理配置。可以使用以下示例作为基本配置: ``` server { listen 80; server_name your_domain.com; location / { proxy_pass http://backend_server_ip:backend_server_port; } } ``` 在上面的配置中,将"your_domain.com"替换为你的域名,"backend_server_ip"替换为后端服务器的IP地址,"backend_server_port"替换为后端服务器的端口号。此配置将把所有来自客户端的请求转发到后端服务器。 3. 重新加载Nginx配置:在完成配置之后,使用以下命令重新加载Nginx配置,使更改生效: ```bash sudo nginx -s reload ``` 4. 测试:使用Web浏览器或其他HTTP客户端工具发送请求到你的域名并验证是否成功被转发到后端服务器。 需要注意的是,上述配置仅涵盖了基本的反向代理配置。根据需要,还可以添加其他配置项,例如请求的缓存、负载均衡等。 总之,Nginx反向代理配置非常灵活和强大,并且可以帮助我们将客户端请求转发到后端服务器,从而提高网站或应用程序的性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值