您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
workerman系列之nginx配置反向代理于workerman時候實現workerman獲得真實客戶端ip
发布时间:2022-01-14 00:07:59编辑:雪饮阅读()
那麽事情是這樣的,就是反向代理的話,比如同一個服務器内部委托反向代理者能接收到的客戶端ip實際上是被委托反向代理者的ip地址,那麽同一個服務器内部則ip地址不就是相同的,但是實際上我們需要的是真實的客戶端訪問者的ip地址,則具體實現如:
nginx某個站點配置實例(基於寶塔環境某個站點配置):
server
{
listen 80;
server_name www.cece1.com www.cece220807.com;
index index.html index.htm default.php default.htm default.html index.php;
root /www/wwwroot/www.cece1.com;
#nginx1.8配置ssl部分
listen 443 ssl;
ssl_certificate /www/wwwroot/workerman/ssl.crt;
ssl_certificate_key /www/wwwroot/workerman/ssl.key;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;
ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
#ssl配置完成
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#SSL-END
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#PHP-INFO-START PHP引用配置,可以注释或修改
include enable-php-56.conf;
#PHP-INFO-END
#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/www.cece1.com.conf;
#REWRITE-END
location / {
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Credentials: true;
add_header Access-Control-Allow-Headers 'DNT,token,app-token,Authorization,Accept,
Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,
If-Modified-Since,Cache-Control,Content-Type,Range';
if ($request_method = 'OPTIONS') {
return 204;
}
}
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
set $allow_origin "www.cece1.com";
add_header Access-Control-Allow-Headers Content-Type,api_key,Authorization;
add_header Access-Control-Allow-Origin *;
#proxy_pass http://www.cece1.com/;
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
#反向代理workerman
location /wss
{
proxy_pass http://127.0.0.1:8282;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
# 这部分是利用http头透传真实客户端ip
proxy_set_header X-Real-IP $remote_addr;
}
access_log /www/wwwlogs/www.cece1.com.log;
error_log /www/wwwlogs/www.cece1.com.error.log;
}
那麽接下來就是反向代理委托者的具體實現:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8282');
// 客户端练上来时,即完成TCP三次握手后的回调
$worker->onConnect = function(TcpConnection $connection) {
/**
* 客户端websocket握手时的回调onWebSocketConnect
* 在onWebSocketConnect回调中获得nginx通过http头中的X_REAL_IP值
*/
$connection->onWebSocketConnect = function(TcpConnection $connection){
/**
* connection对象本没有realIP属性,这里给connection对象动态添加个realIP属性
* 记住php对象是可以动态添加属性的,你也可以用自己喜欢的属性名
*/
$connection->realIP = $_SERVER['HTTP_X_REAL_IP'];
};
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
// 当使用客户端真实ip时,直接使用$connection->realIP即可
$connection->send($connection->realIP);
};
Worker::runAll();
那麽接下來儅反向代理委托者若是運行了(php index.php start),這裏假定反向代理委托者脚本名叫index.php,則websocket訪問者如:
var ws= new WebSocket("wss://www.cece1.com/wss");
ws.onopen=function(){
ws.send("hi!");
};
該訪問者其實是可以接收到自己的ip地址的,這裏沒有寫訪問者的onMessage方法,但是也可以從network的ws項中觀察到的。
关键字词:workerman,nginx,ip,獲得,反向代理
相关文章
- workerman系列之tp5(thinkphp5)日志结合workerman使用
- workerman常见问题-php的几种回调写法-类的静态方法作
- workerman常见问题-php的几种回调写法-类方法作为回调
- workerman常见问题-php的几种回调写法-普通函数回调
- workerman作爲客戶端系列之socket5即s5代理搭建基於ce
- workerman作爲客戶端系列之http代理搭建
- workerman作爲客戶端-作爲ws或wss客戶端-做為ws客戶端
- workerman創建https服務(普通請求轉https請求,基於寶塔
- workerman創建https服務
- workerman創建wss服務(基於apache基於phpstudy環境)