我们的服务器环境almaLinux php 8.1 Workerman 依赖 pcntl 和 posix 扩展,确保已安装并启用:
php -m | grep -E 'pcntl|posix'
运行结果
pcntl
posix
让我们开始安装项目
composer create-project workerman/webman:~2.0
把项目安装好然后运行程序
php start.php start -d
然后报错了
Workerman[start.php] start in DAEMON mode
直接运行(非守护模式) 去掉 -d 参数直接启动,观察终端输出的错误:
Workerman[start.php] start in DEBUG mode
RuntimeException: stream_socket_server(): Unable to connect to tcp://0.0.0.0:8787 (Address already in use) in /var/www/html/workerman/webman/vendor/workerman/workerman/src/Worker.php:2470
Stack trace:
#0 [internal function]: Workerman\Worker::Workerman\{closure}()
#1 /var/www/html/workerman/webman/vendor/workerman/workerman/src/Worker.php(2472): stream_socket_server()
#2 /var/www/html/workerman/webman/vendor/workerman/workerman/src/Worker.php(585): Workerman\Worker::checkPortAvailable()
#3 /var/www/html/workerman/webman/vendor/workerman/webman-framework/src/support/App.php(147): Workerman\Worker::runAll()
#4 /var/www/html/workerman/webman/start.php(5): support\App::run()
#5 {main}
错误原因 tcp://0.0.0.0:8787 端口已被其他进程占用,导致 Webman/Workerman 无法监听该端口。因为昨天尝试过了webman/admin . 查找占用端口的进程
lsof -i :8787
# 或
netstat -tulnp | grep :8787
返回结果
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php 2531411 root 6u IPv4 11035990 0t0 TCP *:msgsrvr (LISTEN)
php 2531412 root 6u IPv4 11035990 0t0 TCP *:msgsrvr (LISTEN)
php 2531413 root 6u IPv4 11035990 0t0 TCP *:msgsrvr (LISTEN)
php 2531414 root 6u IPv4 11035990 0t0 TCP *:msgsrvr (LISTEN)
php 2531415 root 6u IPv4 11035990 0t0 TCP *:msgsrvr (LISTEN)
php 2531418 root 6u IPv4 11035990 0t0 TCP *:msgsrvr (LISTEN)
php 2531421 root 6u IPv4 11035990 0t0 TCP *:msgsrvr (LISTEN)
php 2531422 root 6u IPv4 11035990 0t0 TCP *:msgsrvr (LISTEN)
php 2531426 root 6u IPv4 11035990 0t0 TCP *:msgsrvr (LISTEN)
我们需要终止所有相关进程:
sudo kill $(sudo lsof -t -i :msgsrvr)
然后确认服务停止:
sudo lsof -i :msgsrvr
然后再启动程序
php start.php start
终于返回了正确结果
Workerman[start.php] restart
Workerman[start.php] is stopping ...
Workerman[start.php] stop success
-------------------------------------------- WORKERMAN ---------------------------------------------
Workerman/5.1.0 PHP/8.1.32 (Jit off) Linux/5.14.0-503.31.1.el9_5.x86_64
--------------------------------------------- WORKERS ----------------------------------------------
event-loop proto user worker listen count state
select tcp root webman http://0.0.0.0:8787 8 [OK]
select tcp root monitor none 1 [OK]
----------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.
但是通过域名访问,提示无法连接到服务器 然后我们需要确认 Webman 服务状态 确保 Webman 正在运行并监听正确的端口:
ps aux | grep webman
# 或
systemctl status webman # 如果使用systemd服务管理
然后我们看到结果正常
root 2595354 0.0 2.0 246916 36272 pts/0 S+ 08:47 0:00 WorkerMan: master process start_file=/var/www/html/workerman/webman/start.php
root 2595356 0.0 0.9 246916 17244 pts/0 S+ 08:47 0:00 WorkerMan: worker process webman http://0.0.0.0:8787
root 2595357 0.0 0.9 246916 17244 pts/0 S+ 08:47 0:00 WorkerMan: worker process webman http://0.0.0.0:8787
root 2595358 0.0 0.9 246916 17244 pts/0 S+ 08:47 0:00 WorkerMan: worker process webman http://0.0.0.0:8787
root 2595359 0.0 0.9 246916 17244 pts/0 S+ 08:47 0:00 WorkerMan: worker process webman http://0.0.0.0:8787
root 2595363 0.0 1.0 246916 17372 pts/0 S+ 08:47 0:00 WorkerMan: worker process webman http://0.0.0.0:8787
root 2595364 0.0 0.9 246916 17244 pts/0 S+ 08:47 0:00 WorkerMan: worker process webman http://0.0.0.0:8787
root 2595368 0.0 1.0 246916 17372 pts/0 S+ 08:47 0:00 WorkerMan: worker process webman http://0.0.0.0:8787
root 2595369 0.0 0.8 246916 14940 pts/0 S+ 08:47 0:00 WorkerMan: worker process webman http://0.0.0.0:8787
root 2632516 0.0 0.1 3360 1920 pts/2 S+ 08:55 0:00 grep --color=auto webman
所以有可能是nginx反向代理出了问题 修改 work.gyqtt.cn 的 Nginx 配置,将请求代理到 Webman 的 8787 端口:
server {
server_name work.gyqtt.cn;
listen 443 ssl;
# ... SSL 配置保持不变 ...
location / {
proxy_pass http://127.0.0.1:8787;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 移除原有的 PHP 处理块,除非需要同时处理其他 PHP 文件
}
然后我们需要重启nginx
sudo nginx -s reload
或者
systemctl restart nginx
然后通过域名访问 使用 Nginx 反向代理通过 HTTPS 访问,无需暴露 8787 端口。 https://work.gyqtt.cn 这里因为我们没有做任何修改进入网站会有提示 您的连接不是私密连接 攻击者可能会试图从 work.gyqtt.cn 窃取您的信息(例如:密码、消息或信用卡信息)。详细了解此警告 net::ERR_CERT_COMMON_NAME_INVALID
我们选择继续前往,然后就可以看到成功了
本文为谷永庆原创文章,转载无需和我联系,但请注明来自luffy博客http://gyqtt.cn
Recent Comments