国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

透過nginx/apache代理如何獲取客戶端真實(shí)ip ?

使用nginx/apache作為workerman代理,nginx/apache實(shí)際上充當(dāng)了workerman的客戶端,所以在workerman上獲取的客戶端ip為nginx/apache服務(wù)器的ip,并非實(shí)際的客戶端ip。如何獲取客戶端真實(shí)ip可以參考下面的方法。

原理:

nginx/apache將客戶端真實(shí)ip通過http header傳遞進(jìn)來,例如nginx配置中l(wèi)ocation里的加上proxy_set_header X-Real-IP $remote_addr;設(shè)置。workerman通過讀取這個(gè)header值,將此值保存到$connection對象里,(GatewayWorker可以保存到$_SESSION變量里),使用的時(shí)候直接讀取變量即可。

注意:

以下配置適用于http/https ws/wss協(xié)議。其它協(xié)議要獲取客戶端ip方法類似,需要代理服務(wù)器在數(shù)據(jù)包插入一段ip數(shù)據(jù)透傳真實(shí)客戶端ip。

nginx配置類似如下

server {
  listen 443;

  ssl on;
  ssl_certificate /etc/ssl/server.pem;
  ssl_certificate_key /etc/ssl/server.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;

  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頭透傳真實(shí)客戶端ip
    proxy_set_header X-Real-IP $remote_addr;
  }

  # location / {} 站點(diǎn)的其它配置...
}

workerman從nginx設(shè)置的header里讀取客戶端ip

<?php

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('websocket://0.0.0.0:7272');

/**
 * 客戶端websocket握手時(shí)的回調(diào)onWebSocketConnect
 * 在onWebSocketConnect回調(diào)中獲得nginx通過http頭中的X_REAL_IP值
 */
$worker->onWebSocketConnect = function(TcpConnection $connection, $request){
    /**
     * connection對象本沒有realIP屬性,這里給connection對象動(dòng)態(tài)添加個(gè)realIP屬性
     * 記住php對象是可以動(dòng)態(tài)添加屬性的,你也可以用自己喜歡的屬性名
     */
    //$connection->realIP = $_SERVER['HTTP_X_REAL_IP']; // workerman v4 用法
    $connection->realIP = $request->header('x-real-ip'); // workerman v5 用法
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
    // 當(dāng)使用客戶端真實(shí)ip時(shí),直接使用$connection->realIP即可
    $connection->send($connection->realIP);
};
Worker::runAll();

GatewayWorker從nginx設(shè)置的header里獲取客戶端ip

在Events.php加上下面的代碼

class Events
{
   public static function onWebsocketConnect($client_id, $data)
   {    
        $_SESSION['realIP'] = $data['server']['HTTP_X_REAL_IP'];
   }
   // .... 省略其它代碼....
}

代碼加完后需要重啟GatewayWorker。

這樣就可以在Events.php中的onMessageonClose方法中通過$_SESSION['realIP']得到客戶端的真實(shí)ip了。

注意:Events.php中onWorkerStart onConnect onWorkerStop 無法直接使用$_SESSION['realIP']。

編輯于2025-04-09 20:30:03 完善本頁 +發(fā)起討論
贊助商