【问题标题】:PHP websockets with Workerman - nginx configuration带有 Workerman 的 PHP websockets - nginx 配置
【发布时间】:2020-07-07 12:53:52
【问题描述】:

我正在尝试在我的项目中使用 Workerman,但 nginx 配置存在问题。我在我的本地机器上使用 docker,socket.my-app.local 在我的本地主机文件中被翻译成127.0.0.1。 我已经按照 nginx 反向代理的说明进行了设置,如下所示:

server {
    listen 80;
    listen [::]:80;

    server_name socket.my-app.local;

    location /socket.io/ {
        proxy_pass http://localhost:2020/socket.io/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header X-Real-IP $remote_addr;
    }

    location / {
        proxy_pass http://localhost:2020;
    }
}

应该是 websocket 服务器的我的 PHP worker 配置如下:

require_once __DIR__ . '/../vendor/autoload.php';

use Workerman\Worker;

// Create a Websocket server
$ws_worker = new Worker("websocket://0.0.0.0:2020");

// 4 processes
$ws_worker->count = 4;

// Emitted when new connection come
$ws_worker->onConnect = function($connection) {
    echo "New connection\n";
};

// Emitted when data received
$ws_worker->onMessage = function($connection, $data) {
    // Send hello $data
    $connection->send('hello ' . $data);
};

// Emitted when connection closed
$ws_worker->onClose = function($connection) {
    echo "Connection closed\n";
};

// Run worker
Worker::runAll();

和我正在测试的 html 文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Workerman Sockets Test</title>
</head>
<body>
<h3>Hello</h3>
<script type="text/javascript">

    var socket = new WebSocket("ws://socket.my-app.local:2020/socket.io");

    socket.onopen = function() {
        alert("Connection established.");
    };

    socket.onclose = function(event) {
        if (event.wasClean) {
            alert('The connection is closed.');
        } else {
            alert('Connection failure'); // for example, the server process is "killed"
        }
        alert('Code: ' + event.code + ' reason: ' + event.reason);
    };

    socket.onmessage = function(event) {
        alert("Received data: " + event.data);
    };

    socket.onerror = function(error) {
        alert("Error: " + error.message);
    };
</script>
</body>
</html>

我无法连接到ws服务器,我不知道如何测试,此时它出错了。

会不会是因为 php-fpmwebserver 位于不同的 docker 容器上?

【问题讨论】:

    标签: php nginx websocket socket.io nginx-reverse-proxy


    【解决方案1】:

    问题是 docker 容器使用内部命名空间进行通信,所以我必须将 localhost 更改为容器名称,在我的情况下为 php-fpm,并且我必须在 webserver 容器上打开 websocket 端口,并监听它网络服务器上的端口,以便代理这些请求。

    server {
        listen 80;
        listen 2020;
        listen [::]:80;
        listen [::]:2020;
    
        server_name socket.my-app.local;
    
        location /socket.io/ {
            proxy_pass http://php-fpm:2020;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header X-Real-IP $remote_addr;
        }
    
        location / {
            
        }
    }
    

    在我的 docker-compose 中

    services
      webserver:
        ...
        ports:
          - "80:80"
          - "2020:2020"
          - "2021:2021"
    

    【讨论】:

      猜你喜欢
      • 2021-09-17
      • 2013-04-06
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多