Nginx学习总结(9):docker-compose项目配置http反向代理,websocket反向代理

1. 需求:

  1. 使用docker-compose容器编排三个项目:
    项目1:网站前端,主要功能是展示页面,如果仅仅是静态网页,可以放在nginx的html目录即可,但是有一个功能:平台需要获取客户端请求的URL,然后根据不同的域名前缀,响应不同的首页;
    技术路线:spring boot项目,服务端口是8080;
    容器名称是:webclient;
    单独访问项目:http://webclient:8080
    项目2:后端接口,主要功能是向前端网页提供接口,从登录开始,到登出接口,功能都是由这个项目提供,这是个典型的前后端分离项目;
    技术路线:spring boot项目,服务端口是8080;
    容器名称是:webapis;
    单独访问项目:
    登录接口:http://webapis:8080/api-u/login
    其他接口:http://webapis:8080/api-×/×××
    项目3:websocket工程,主要提供websocket服务,提供一个简单的网页,在网页里面提供websocket支持;
    技术路线:spring boot项目,服务端口是8080;
    容器名称是:websocket;
    单独访问项目:http://websocket:8080,websocket服务:ws://×××/×××/×××
  2. 这三个项目单独访问都没有问题,现在需要在容器中添加一个nginx,针对用户的请求,跳转到80端口,后端自动落到webclient容器;针对网页中接口请求,后端自动落到webapis容器;针对websocket的请求,后端落到websocket服务器上;
  3. 所有的请求都要走80端口,为了使请求准确落到不同容器,在请求URL增加标识:
    例如:
    默认请求,后端自动落到webclient容器;因为要解析不同的域名,不能修改后端收到的URL;
    URL中包含/api/的请求,后端自动落到webapis容器;真正在后端的请求URL中不能携带/api/;
    URL中包含/ws/的请求,后端自动落到websocket服务器上;真正在后端的请求URL中不能携带/ws/;

2. nginx.conf配置

  1. 文件配置

    	server {
    
        listen      80;						# 监听80端口
        server_name localhost;				# 名字就写localhost
        location  ~/ {						# 默认请求处理方法
            proxy_set_header Host $host;	# 添加Host,设置变量是 $host,后端的请求中将不会修改成http://webclient:8080,而是会将前端的请求url直接返回给后端;
            proxy_pass  http://webclient:8080;
        }
    
        location ^~/api/ {					# url中包含api处理方法					
            proxy_pass http://webapis:8080/;	# 如果去掉最后的 / ,返回给后端的请求中就会自动携带api/
        }
    
        location ^~/ws/ {					# url中包含ws处理方法
            #添加websocket代理
            proxy_pass http://websocket:8080/;	# 如果去掉最后的 / ,返回给后端的请求中就会自动携带ws/
            proxy_http_version 1.1;				# 必须配置1.1,官网上说的,使用http/1.1;
            proxy_set_header Upgrade $http_upgrade;	# 为了让Nginx代理服务器可以将来自客户端的Upgrade请求发送到后端服务器,要求Upgrade和Connection的头信息必须被显式的设置
            proxy_set_header Connection "Upgrade";	# 关于Connection,有两种方式,一种是直接写死,“upgrade”,强制连接升级;一种是对代理服务器的请求中“Connection”标头字段的值取决于客户端请求标头中“Upgrade”字段的值,相当于由客户端决定;
        }
    
    }
    
  2. Nginx配置Websocket方式
    参考文档:
    https://www.sohu.com/a/328641687_470018
    http://nginx.org/en/docs/http/websocket.html

  3. Nginx如何支持WebSocket
    WebSocket 和HTTP虽然是不同协议,但是两者“握手”方式兼容。通过HTTP升级机制,使用HTTP的Upgrade和Connection协议头的方式可以将连接从HTTP升级为WebSocket:
    在这里插入图片描述

  4. Http升级为WebSocket
    因为WebSocket协议是一个hop-by-hop协议(此类头部字段只对单次转发有效。会因为转发给缓存/代理服务器而失效),为了让Nginx代理服务器可以将来自客户端的Upgrade请求发送到后端服务器,要求Upgrade和Connection的头信息必须被显式的设置。可以通过下文将要讲解的修改Nginx的配置文件方式解决此问题。

    1. map是根据客户端请求中 $http_upgrade 的值来构造改变 $connection_upgrade 的值,即根据变量 $http_upgrade 的值和{} 里规则创建新的变量 $connection_upgrade并赋值。
    2. HTTP的Upgrade协议头机制用于将连接从HTTP连接升级到WebSocket连接,Upgrade机制使用了Upgrade协议头和Connection协议头;为了让Nginx可以将来自客户端的Upgrade请求发送到后端服务器,Upgrade和Connection的头信息必须被显式的设置。

    官网的例子:http://nginx.org/en/docs/http/websocket.html
    在这里插入图片描述

3. 为什么HTTP Upgrade的时候,需要Connection: upgrade

可以参考文章:https://www.yuque.com/devweb/front/ztg8ur

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Docker Compose 中安装配置 Nginx 来实现 HTTPS 和反向代理,你可以按照以下步骤进行操作: 1. 首先,在你的项目目录下创建一个名为 `docker-compose.yml` 的文件,并添加以下内容: ```yaml version: '3' services: nginx: image: nginx ports: - 80:80 - 443:443 volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./certs:/etc/nginx/certs ``` 这将创建一个名为 `nginx` 的服务,并将容器的 80 和 443 端口映射到主机的相应端口。同时,我们将挂载一个自定义的 `nginx.conf` 配置文件和一个名为 `certs` 的文件夹用于存放 SSL/TLS 证书。 2. 在项目目录下创建一个名为 `nginx.conf` 的配置文件,并添加以下内容作为示例: ```nginx events {} http { server { listen 80; server_name example.com; location / { proxy_pass http://backend:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/certs/cert.pem; ssl_certificate_key /etc/nginx/certs/key.pem; location / { proxy_pass http://backend:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } } ``` 这是一个简单的 Nginx 配置文件示例,其中设置了一个 HTTP反向代理和一个 HTTPS 的反向代理。你需要将 `example.com` 替换为你的域名,并将 SSL/TLS 证书文件 `cert.pem` 和 `key.pem` 放入 `certs` 文件夹中。 3. 在你的项目目录下创建一个名为 `certs` 的文件夹,并将正确的 SSL/TLS 证书文件放入其中。 4. 现在,你可以运行 `docker-compose up -d` 命令启动容器。 这样,Nginx 将通过反向代理将所有对于 `example.com` 的请求转发到名为 `backend` 的服务的 8000 端口上。同时,通过 HTTPS 访问时,Nginx 使用了提供的 SSL/TLS 证书来进行加密通信。 请注意,上述步骤只是一个示例,你可能需要根据你的实际需求进行修改和调整。希望这能帮到你!如果有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值