1

我在标准 PHP/Apache 平台上有一个现有的 Web 应用程序。现在,我想要添加聊天功能,并且我希望它在 websocket 上是实时的,为此我在 nodejs 上研究了 socket.io。因此,除了运行大型 PHP 应用程序的 Apache 之外,我还会使用带有 socket.io 的 nodejs 运行聊天。

但我不太明白,我如何在 nodejs 聊天代码中识别我的用户?一方面,Apache 和 nodejs 将无法在同一个端口上运行,这意味着我将在端口上运行聊天8080,在这种情况下我会丢失用户的 cookie,这意味着我现在必须要求他们登录如果他们想使用聊天,再次在这个由 nodejs 驱动的端口上?看起来很可笑,但我不知道该怎么做。

当然,我不能将我的整个代码移植到 nodejs 上。所以理想情况下,我希望 Apache 和 nodejs 共存。或者我只是完全误解了聊天应该如何在网络应用程序中工作。

任何提示表示赞赏。

4

1 回答 1

0

您可以在端口 3001 上使用 PHP 运行 Apache,在端口 3002 上运行 Node 应用程序,并将 nginx 配置为反向代理以使它们都在端口 80 上可用,例如根/目录中的 PHP 应用程序和位于目录,/chat使用 nginx 配置如下:

server {
    listen 80;
    server_name example.com;
    location /chat {
        proxy_pass http://localhost:3002;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
    location / {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}

使用 SSL 会稍微复杂一些,但不会那么复杂:

server {
    listen 443;
    server_name example.com;
    add_header Strict-Transport-Security "max-age=3600";
    ssl on;
    ssl_certificate /.../chained2.pem;
    ssl_certificate_key /.../domain.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
    ssl_session_cache shared:SSL:50m;
    ssl_prefer_server_ciphers on;

    location /chat {
        proxy_pass http://localhost:3002;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }

    location / {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }

}

您的 PHP 和 Node 应用程序甚至可以在不同的服务器上运行 - 只需在 nginx 配置中使用它们的地址。

有关更多详细信息,请参阅此答案及其评论:

于 2016-12-24T22:13:18.243 回答