wss পরিষেবা তৈরি করুন
প্রশ্ন:
Workerman কিভাবে একটি wss পরিষেবা তৈরি করে, যাতে ক্লায়েন্ট wss প্রোটোকল ব্যবহার করে সংযোগ করতে পারে, যেমন ওয়েচ্যাট মিনি প্রোগ্রামে সার্ভার সংযুক্ত করা।
উত্তর:
wss প্রোটোকল প্রকৃতপক্ষে websocket+SSL, মানে হল websocke প্রোটোকলে SSL স্তর যুক্ত করা, যেটা https এর মতো (http+SSL)।
তাহলে শুধু websocket প্রোটোকলের উপর SSL চালু করতে হবে যাতে wss প্রোটোকল সমর্থিত হতে পারে।
পদ্ধতি এক, nginx/apache এর মাধ্যমে SSL প্রক্সি ব্যবহার করে (সুউপারিশকৃত)
সুউপারিশের কারণ
- 443 পোর্ট পুনরায় ব্যবহার করা যায়, ক্লায়েন্ট সংযোগের সময় পোর্ট উল্লেখ করার প্রয়োজন নেই
- একত্রিতভাবে SSL সার্টিফিকেট পরিচালনা করা যায়, ওয়েবসাইট কনফিগারেশন পুনরায় ব্যবহার করা যায়
- লোড ব্যালেন্সিং করা যায়
- স্বয়ংক্রিয় লগ মনিটরিং আছে
- ভাল সমর্থন রয়েছে
যোগাযোগের তত্ত্ব এবং প্রক্রিয়া
1। ক্লায়েন্ট wss সংযোগ ngin/apache এ শুরু করে
2। nginx/apache wss প্রোটোকলের তথ্যকে ws প্রোটোকল তথ্যতে রূপান্তর করে এবং Workerman এর websocket প্রোটোকল পোর্টে পুনঃপ্রেরণ করে
3। Workerman তথ্য গ্রহণ করার পরে ব্যবসায়িক যুক্তি প্রক্রিয়া করে
4। যখন Workerman ক্লায়েন্টকে বার্তা পাঠায়, তখন এটি বিপরীত প্রক্রিয়া, তথ্য nginx/apache এর মাধ্যমে wss প্রোটোকলে রূপান্তর করে এবং ক্লায়েন্টের কাছে পাঠানো হয়
nginx কনফিগারেশন রেফারেন্স
শর্ত ও প্রস্তুতি:
1। nginx ইনস্টল করা হয়েছে, সংস্করণ 1.3 এর নীচে নয়
2। ধরুন Workerman 8282 পোর্টে শোনায় (websocket প্রোটোকল)
3। সার্টিফিকেট (pem/crt ফাইল এবং key ফাইল) আবেদন করা হয়েছে এবং এটি /etc/nginx/conf.d/ssl এ রাখার জন্য ধরুন
4। nginx 443 পোর্ট ব্যবহার করে বাহ্যিক wss প্রক্সি পরিষেবা চালু করতে চাইছে (পোর্ট প্রয়োজন অনুযায়ী পরিবর্তন করা যেতে পারে)
5। nginx সাধারণত অন্য পরিষেবাগুলির সাথে ওয়েবসাইট সার্ভার হিসেবে চলতে থাকে, মূল সাইটের ব্যবহারে প্রভাব ফেলতে না দেওয়ার জন্য, এখানে উল্লেখিত ঠিকানা ডোমেইন.com/wss wss এর প্রক্সি এন্ট্রি হিসেবে ব্যবহার করা হচ্ছে। ক্লায়েন্টের সংযোগ ঠিকানা হল wss://ডোমেইন.com/wss
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";
proxy_set_header X-Real-IP $remote_addr;
}
# location / {} অন্যান্য সাইট কনফিগারেশন...
}
পরীক্ষা
// সার্টিফিকেটটি ডোমেইন যাচাই করে, দয়া করে ডোমেইনে সংযোগ করুন। এখানে পোর্ট উল্লেখ করা হয়নি
ws = new WebSocket("wss://ডোমেইন.com/wss");
ws.onopen = function() {
alert("সংযোগ সফল");
ws.send('tom');
alert("সার্ভারে একটি স্ট্রিং পাঠানো হচ্ছে: tom");
};
ws.onmessage = function(e) {
alert("সার্ভার থেকে বার্তা প্রাপ্ত: " + e.data);
};
apache এর মাধ্যমে wss প্রক্সি ব্যবহার
apache-কে wss প্রক্সি হিসেবে Workerman এর কাছে ডেটা প্রেরণের জন্য ব্যবহার করা যেতে পারে।
প্রস্তুতি কাজ:
1। GatewayWorker 8282 পোর্টে শোনায় (websocket প্রোটোকল)
2। ssl সার্টিফিকেট আবেদিত হয়েছে, ধরুন এটি /server/httpd/cert/ এর নিচে রয়েছে
3। apache 443 পোর্টকে নির্দিষ্ট পোর্ট 8282 এ প্রেরণ করছে
4। httpd-ssl.conf লোড করা হয়েছে
5। openssl ইনস্টল করা হয়েছে
proxy_wstunnel_module মোডুল সক্রিয় করুন
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
SSL এবং প্রক্সি কনফিগারেশন
#extra/httpd-ssl.conf
DocumentRoot "/ওয়েবসাইট/ডিরেক্টরি"
ServerName ডোমেইন
# প্রক্সি কনফিগারেশন
SSLProxyEngine on
ProxyRequests Off
ProxyPass /wss ws://127.0.0.1:8282/wss
ProxyPassReverse /wss ws://127.0.0.1:8282/wss
# নিরাপদ প্রোটোকল সাপোর্ট যোগ করুন, অরক্ষিত প্রোটোকল অপসারণ করুন
SSLProtocol all -SSLv2 -SSLv3
# সংকেত পদ্ধতি পরিবর্তন করুন
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
# সার্টিফিকেট পাবলিক কী কনফিগারেশন
SSLCertificateFile /server/httpd/cert/your.pem
# সার্টিফিকেট প্রাইভেট কী কনফিগারেশন
SSLCertificateKeyFile /server/httpd/cert/your.key
# সার্টিফিকেট চেইন কনফিগারেশন,
SSLCertificateChainFile /server/httpd/cert/chain.pem
পরীক্ষা
// সার্টিফিকেটটি ডোমেইন যাচাই করে, দয়া করে ডোমেইনে সংযোগ করুন। এখানে পোর্ট নেই
ws = new WebSocket("wss://ডোমেইন.com/wss");
ws.onopen = function() {
alert("সংযোগ সফল");
ws.send('tom');
alert("সার্ভারে একটি স্ট্রিং পাঠানো হচ্ছে: tom");
};
ws.onmessage = function(e) {
alert("সার্ভার থেকে বার্তা প্রাপ্ত: " + e.data);
};
পদ্ধতি দুই, সরাসরি Workerman এর মাধ্যমে SSL চালু করা (অবশ্যই সুপারিশকৃত নয়)
কৃতজ্ঞতা
nginx/apache প্রক্সি SSL এবং Workerman সেটিং SSL একত্রে ব্যবহার করা যাবে না, কেবল একটি নির্বাচন করতে হবে।
প্রস্তুতি কাজ:
1। Workerman সংস্করণ >=3.3.7
2। PHP এ openssl সম্প্রসারণ ইনস্টল করা হয়েছে
3। সার্টিফিকেট (pem/crt ফাইল এবং key ফাইল) আবেদিত হয়েছে এবং যে কোন ডিস্ক ডিরেক্টরিতে রাখা হয়েছে।
কোড:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// সার্টিফিকেটটি সম্ভবত আবেদিত সার্টিফিকেট হওয়া উচিত
$context = array(
// আরও ssl বিকল্প দয়া করে ম্যানুয়াল দেখুন http://php.net/manual/zh/context.ssl.php
'ssl' => array(
// দয়া করে এক্স্যাক্ট পথ ব্যবহার করুন
'local_cert' => 'ডিস্কের পথ/server.pem', //crt ফাইলও হতে পারে
'local_pk' => 'ডিস্কের পথ/server.key',
'verify_peer' => false,
'allow_self_signed' => true, // যদি এটি স্বাক্ষরিত সার্টিফিকেট হয় তবে এই বিকল্পটি চালু করুন
)
);
// এখানে websocket প্রোটোকল সেট করা হয়েছে (পোর্ট যেকোনও, তবে এটি অন্য প্রোগ্রামে দখল করা হতে পারে না)
$worker = new Worker('websocket://0.0.0.0:8282', $context);
// transport এর মাধ্যমে ssl চালু করুন, websocket+ssl অর্থাৎ wss
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();
উপরের কোডের মাধ্যমে, Workerman wss প্রোটোকল শুনছে, ক্লায়েন্ট wss প্রোটোকল ব্যবহার করে Workerman এর সাথে নিরাপদ তাত্ক্ষণিক যোগাযোগ প্রতিষ্ঠা করতে পারে।
পরীক্ষা
chrome ব্রাউজার খুলুন, F12 চাপুন ডিবাগ কনসোল খোলতে, Console বিভাগে লিখুন (অথবা নীচের কোডটি একটি html পৃষ্ঠায় js হিসেবে চালান)
// সার্টিফিকেটটি ডোমেইন যাচাই করে, দয়া করে ডোমেইনে সংযোগ করুন, এখানে পোর্ট নম্বর রয়েছে
ws = new WebSocket("wss://ডোমেইন.com:8282");
ws.onopen = function() {
alert("সংযোগ সফল");
ws.send('tom');
alert("সার্ভারে একটি স্ট্রিং পাঠানো হচ্ছে: tom");
};
ws.onmessage = function(e) {
alert("সার্ভার থেকে বার্তা প্রাপ্ত: " + e.data);
};
সাধারণ ত্রুটি
SSL routines:SSL23_GET_CLIENT_HELLO:http request
কারণ হল ক্লায়েন্ট ws://ডোমেইন.com এর মাধ্যমে অ্যাক্সেস করছে, সঠিক অ্যাক্সেসের ঠিকানা হওয়া উচিত wss://ডোমেইন.com, অর্থাৎ wss প্রোটোকল দিয়ে অ্যাক্সেস করা।
এই সমস্যা দেখা দিলে অনেক ক্ষেত্রে দেখা যায় যে পোর্টটি প্রথমে ws ছিল, হঠাৎ wss হয়ে যাওয়ার কারণে কিছু ক্লায়েন্ট পৃষ্ঠা রিফ্রেশ হয়নি, এখনও ws এর মাধ্যমে অ্যাক্সেস করছে, এটি ত্রুটি সৃষ্টি করে।
এই ত্রুটিটি অগ্রাহ্য করা যেতে পারে, স্বাভাবিক wss সংযোগকে প্রভাবিত করে না।
কৃতজ্ঞতা:
1। যদি 443 পোর্ট ব্যবহার করতে হয় তবে প্রথম পদ্ধতি nginx/apache প্রক্সি পদ্ধতির মাধ্যমে wss বাস্তবায়ন করুন।
2। wss পোর্টটি শুধুমাত্র wss প্রোটোকল দ্বারা অ্যাক্সেস করা যাবে, ws এর মাধ্যমে wss পোর্ট অ্যাক্সেস করা যাবে না।
3। সার্টিফিকেট সাধারণত ডোমেইনের সাথে সংযুক্ত থাকে, তাই পরীক্ষার সময় ক্লায়েন্টকে দয়া করে ডোমেইনে সংযোগ করতে বলুন, আইপির মাধ্যমে সংযোগ না করতে।
4। যদি অ্যাক্সেসের সমস্যা হয় তবে দয়া করে সার্ভারের ফায়ারওয়াল পরীক্ষা করুন।
5। এই পদ্ধতির জন্য PHP সংস্করণ >=5.6 প্রয়োজন, কারণ ওয়েচ্যাট মিনিপ্রোগ্রাম tls1.2 এর প্রয়োজন, এবং PHP5.6 এর নিচের সংস্করণ tls1.2 সমর্থন করে না।
সম্পর্কিত নিবন্ধ:
প্রক্সির মাধ্যমে ক্লায়েন্টের আসল আইপি পাওয়া
workerman এর ssl কনটেক্সট বিকল্প রেফারেন্স