问下大家nginx如何配置http,https,wss

我这边服务器上有一个服务node服务,监听8080端口,这服务是将视频流变成可以直接网页播放的帧,然后就需要在服务器上配置websocket,这样前端就能直接对接这服务,然后我用宝塔已经申请了ssl证书了,然后nginx里面配置了https,然后

if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }

其他端口都强制转到https,
现在是https能访问,我在nginx里面配置wss

location /wss {
      proxy_pass http://127.0.0.1:8080/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_read_timeout 600s;
    }

当我用wss://域名:8080时就提示连接失败,用ws://ip地址:8080时提示连接成功,能教我下如何配置websocket吗,ip地址的那个nginx我都没有配置wss直接就成功了?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 21

正确地址是wss:// 域名/wss ,前提是 https://域名能访问

1年前 评论
donggan (楼主) 1年前
ncccc1 (作者) 1年前

node 搭建的 websocket 服务是真正的服务地址,域名访问 和 配置 ssl 证书是 nginx 的工作,要实现域名 以及 wss 访问 websocket,就需要通过 nginx 代理到 websocket 服务,而不是以 ws://ip:8080 直连,nginx 的作用就是代理。

当我用 wss:// 域名:8080 时就提示连接失败,用 ws://ip 地址:8080 时提示连接成功,能教我下如何配置 websocket 吗,ip 地址的那个 nginx 我都没有配置 wss 直接就成功了?

你问的实在不想回答 :sweat:

1年前 评论
donggan (楼主) 1年前
php_yt (作者) 1年前

wss 访问的也是443端口,前端你直接使用wss:// 域名/wss链接就可以了
Laravel
这里监听到/wss 会反向代理到 127.0.0.1:8080

1年前 评论

file

访问: wss:// 域名/wss

1年前 评论

分享一个我线上跑的

upstream web {
    server 192.168.1.98:9501;
}
upstream websocket {
    server 192.168.1.98:9502;
}
server
{
    listen 80;
    listen 443 ssl http2;
    server_name blog.zongscan.com;

    ssl_certificate   /usr/local/nginx/conf/cert/11_blog.zongscan.com.pem;
    ssl_certificate_key  /usr/local/nginx/conf/cert/11_blog.zongscan.com.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    #80重定向443
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
    #只允许GET\POST方法访问,其他的method返回405
    if ($request_method !~ ^(GET|POST)$ ) {
        return 405;
    }

# 屏蔽单个ip访问
deny 23.100.232.233; 
deny 74.125.150.0/24;

    if ($http_user_agent ~* "ApacheBench|WebBench|Wget|Curl|HttpClient|Go-http-client|python|HTTrack"){ return 444; }
    if ($http_user_agent ~* "DataForSeoBot|SeznamBot|MegaIndex|GrapeshotCrawler|MJ12bot|BLEXBot|MauiBot|AhrefsBot|SemrushBot|Scrapy|YandexBot|DotBot|Barkrowler"){return 444;}

      #指向文件
      location = /favicon.ico{ root /opt/bg;}
      location = /robots.txt{ root /opt/bg;}

    #WebSocket服务
    location /ws {
        # WebSocket Header
        proxy_http_version 1.1;
        proxy_set_header Upgrade websocket;
        proxy_set_header Connection "Upgrade";
        # 将客户端的 Host 和 IP 信息一并转发到对应节点  
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        # 客户端与服务端无交互 60s 后自动断开连接,请根据实际业务场景设置
        proxy_read_timeout 60s ;
        # 执行代理访问真实服务器
        proxy_pass http://websocket;
    }

    #web 
    location / {
        ##跨域
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'uid,token,Keep-Alive,User-Agent,Cache-Control,Content-Type,Authorization';
        if ($request_method = 'OPTIONS') {
                        add_header 'Access-Control-Max-Age' 1728000;
                        add_header 'Content-Type' 'text/plain charset=UTF-8';
                        add_header 'Content-Length' 0;
                        return 204;
        }

        # 将客户端的 Host 和 IP 信息一并转发到对应节点  
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 执行代理访问真实服务器
        proxy_pass http://web;
    }

    access_log  /home/wwwlogs/hyperf.log main_log;
}

前端调用

var socket = new WebSocket('wss://'+window.location.host+'/ws');
1年前 评论
donggan (楼主) 1年前
zongscan (作者) 1年前
var   ws = new WebSocket("wss://test.com:10003/rtsp");
location /rtsp {
      proxy_pass http://127.0.0.1:8030/rtsp;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_read_timeout 600s;
    }

最后这样是成功的,在宝塔上面新建一个网站,因为没有其他域名就另外用一个端口,然后申请ssl正式,配置后就能连接成功,但是把这段配置到80端口,就报连接失败,也不知道为什么?

1年前 评论
php_yt 1年前
donggan (作者) (楼主) 1年前
php_yt 1年前
donggan (作者) (楼主) 1年前
raybon 1年前

贴你的全部配置出来

1年前 评论
gongmeng
# 至少需要一个 Hyperf 节点,多个配置多行
upstream work-order-ws {
    # Hyperf HTTP Server 的 IP 及 端口
    server workspace:9505;
}

upstream work-order-http {
    # Hyperf HTTP Server 的 IP 及 端口
    server workspace:9506;
}

server {
    listen 80;
    server_name socket.gd.ie0.com;
    return 301 https://socket.gd.ie0.test$request_uri;
}

server {
    # 监听端口
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/default.crt;
    ssl_certificate_key /etc/nginx/ssl/default.key;
    # 绑定的域名,填写您的域名
    server_name socket.gd.ie0.com;

    location / {
        # 将客户端的 Host 和 IP 信息一并转发到对应节点
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 转发Cookie,设置 SameSite
        proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict";

        # 执行代理访问真实服务器
        proxy_pass http://work-order-http;
    }

    location ^~/socket.io/ {
        # 执行代理访问真实服务器
        proxy_pass http://work-order-ws;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

这个是我用laradock配置的,可以给你这边提供下参考,具体把workspace换成你服务器对应的ip应该就可以了

1年前 评论

最近开发了聊天类的项目,这是此项目的 wss 配置,你可以参考一下,主要是 nginx https 服务反向代理 ws 的服务。

server {
    listen       443 ssl http2;
    server_name  chat-websocket.knowthat.cn;

    # ssl
    ssl_certificate_key /etc/letsencrypt/live/chat.knowthat.cn/privkey.pem;
    ssl_certificate     /etc/letsencrypt/live/chat.knowthat.cn/fullchain.pem;

    # 重点,转发 websocket 需要的设置
    proxy_set_header X-Real_IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X_Forward_For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';


    location / {
        # 注意,这里是 http 不是 ws
        proxy_pass http://127.0.0.1:9502/;
    }

    error_page   500 502 503 504  /50x.html;

    location = /50x.html {
        root   html;
    }
}
1年前 评论

按照这种配置,你的wss服务应该是 域名/wss

location /wss {
      proxy_pass http://127.0.0.1:8080/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_read_timeout 600s;
}
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!