PHP 带有 Workerman 的 websockets - nginx 配置
PHP websockets with Workerman - nginx configuration
我正在尝试在我的项目中使用 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;
}
}
我的 PHP 应该是 websocket 服务器的 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-fpm
和 webserver
在不同的 docker 容器上?
问题是 docker 容器使用内部命名空间进行通信,所以我必须将 localhost
更改为容器名称,在我的例子中是 php-fpm
,并且我必须打开 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"
我正在尝试在我的项目中使用 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;
}
}
我的 PHP 应该是 websocket 服务器的 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-fpm
和 webserver
在不同的 docker 容器上?
问题是 docker 容器使用内部命名空间进行通信,所以我必须将 localhost
更改为容器名称,在我的例子中是 php-fpm
,并且我必须打开 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"