nginx/apache प्रॉक्सी के माध्यम से क्लाइंट का वास्तविक ip कैसे प्राप्त करें?

nginx/apache को workerman प्रॉक्सी के रूप में उपयोग करते समय, nginx/apache वास्तव में workerman के क्लाइंट के रूप में कार्य करता है, इसलिए workerman पर प्राप्त क्लाइंट ip nginx/apache सर्वर का ip होता है, न कि वास्तविक क्लाइंट का ip। क्लाइंट का वास्तविक ip प्राप्त करने के लिए नीचे दिए गए तरीकों का उपयोग कर सकते हैं।

सिद्धांत:

nginx/apache वास्तविक क्लाइंट ip को http header के माध्यम से पास करता है, उदाहरण के लिए nginx कॉन्फ़िगरेशन में location में proxy_set_header X-Real-IP $remote_addr; सेटिंग जोड़कर। workerman इस header मान को पढ़कर इसे $connection ऑब्जेक्ट में सहेजता है, (GatewayWorker इसे $_SESSION वेरिएबल में सहेज सकता है), जब उपयोग की आवश्यकता हो, तो सीधे इस वेरिएबल को पढ़ सकते हैं।

नोट:

नीचे दिए गए कॉन्फ़िगरेशन http/https ws/wss प्रोटोकॉल के लिए उपयुक्त हैं। अन्य प्रोटोकॉल को क्लाइंट ip प्राप्त करने के लिए समान तरीके से काम करना होगा, जिसमें प्रॉक्सी सर्वर को डेटा पैकेट में वास्तविक क्लाइंट ip के लिए कुछ 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 हेडर का उपयोग करके वास्तविक क्लाइंट ip पास करता है
    proxy_set_header X-Real-IP $remote_addr;
  }

  # location / {} साइट के अन्य कॉन्फ़िगरेशन...
}

workerman nginx द्वारा सेट किए गए हेडर से क्लाइंट 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 कनेक्ट होने पर onWebSocketConnect का कॉलबैक
 * onWebSocketConnect कॉलबैक में X_REAL_IP मान को nginx के http हेडर के माध्यम से प्राप्त करें
 */
$worker->onWebSocketConnect = function(TcpConnection $connection, $request){
    /**
     * connection ऑब्जेक्ट में पहले realIP गुण नहीं है, यहाँ connection ऑब्जेक्ट में एक realIP गुण गतिशील रूप से जोड़ें
     * ध्यान रखें कि php ऑब्जेक्ट में गतिशील रूप से गुण जोड़े जा सकते हैं, आप अपना पसंद का गुण नाम भी उपयोग कर सकते हैं
     */
    //$connection->realIP = $_SERVER['HTTP_X_REAL_IP']; // workerman v4 उपयोग
    $connection->realIP = $request->header('x-real-ip'); // workerman v5 उपयोग
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
    // जब क्लाइंट का वास्तविक ip उपयोग किया जाए तो सीधे $connection->realIP का उपयोग करें
    $connection->send($connection->realIP);
};
Worker::runAll();

GatewayWorker nginx द्वारा सेट किए गए हेडर से क्लाइंट ip प्राप्त करता है

Events.php में निम्नलिखित कोड जोड़ें

class Events
{
   public static function onWebsocketConnect($client_id, $data)
   {    
        $_SESSION['realIP'] = $data['server']['HTTP_X_REAL_IP'];
   }
   // .... अन्य कोड को छोड़ दें....
}

कोड जोड़ने के बाद GatewayWorker को पुनः प्रारंभ करना आवश्यक है।

इस प्रकार आप Events.php में onMessage और onClose विधियों में $_SESSION['realIP'] के माध्यम से क्लाइंट का वास्तविक ip प्राप्त कर सकते हैं।

नोट: Events.php में onWorkerStart onConnect onWorkerStop सीधे $_SESSION['realIP'] का उपयोग नहीं कर सकते।