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 header ব্যবহার করে সত্যিকারের ক্লায়েন্ট ip পাঠায়
    proxy_set_header X-Real-IP $remote_addr;
  }

  # location / {} ওয়েবসাইটের অন্যান্য কনফিগারেশন...
}

workerman nginx সেট করা 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 সংযোগের সময় callback onWebSocketConnect
 * onWebSocketConnect callback এ nginx মাধ্যমে http header এর X_REAL_IP মান পাওয়া যায়
 */
$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 সেট করা header থেকে ক্লায়েন্ট 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'] ব্যবহার করতে পারে না।