สร้างบริการ https
คำถาม:
Workerman จะสร้างบริการ https ได้อย่างไร เพื่อให้คลient สามารถเชื่อมต่อสื่อสารผ่าน https ได้
คำตอบ:
โปรโตคอล https เป็นการรวมกันของ http+SSL ซึ่งก็คือการเพิ่มชั้น SSL ลงในโปรโตคอล http Workerman รองรับโปรโตคอล http และยังรองรับ SSL (ต้องใช้เวอร์ชัน Workerman >=3.3.7),ดังนั้นเพียงแค่เปิดใช้งาน SSL บนพื้นฐานของโปรโตคอล http ก็สามารถรองรับโปรโตคอล https ได้แล้ว
การทำให้ Workerman สนับสนุน https มีสองแนวทางทั่วไป คือ การเปิดใช้งาน SSL โดยตรงจาก Workerman หรือใช้งาน nginx เป็นพร็อกซี่สำหรับ SSL ซึ่งสามารถเลือกรูปแบบใดรูปแบบหนึ่งได้เท่านั้น ไม่สามารถตั้งค่าได้พร้อมกัน
การเปิดใช้งาน SSL ใน Workerman
การเตรียมการ:
-
เวอร์ชัน Workerman >=3.3.7
-
PHP ต้องติดตั้งส่วนขยาย openssl
-
ได้ขอรับใบรับรอง (ไฟล์ pem/crt และไฟล์ key) และเก็บไว้ใน /etc/nginx/conf.d/ssl
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// ควรจะเป็นใบรับรองที่ขอ
$context = array(
'ssl' => array(
'local_cert' => '/etc/nginx/conf.d/ssl/server.pem', // อาจจะเป็นไฟล์ crt ได้
'local_pk' => '/etc/nginx/conf.d/ssl/server.key',
'verify_peer' => false,
'allow_self_signed' => true, // หากเป็นใบรับรองที่ลงนามด้วยตนเองต้องเปิดใช้งานตัวเลือกนี้
)
);
// ที่นี่ตั้งค่าเป็นโปรโตคอล http
$worker = new Worker('http://0.0.0.0:443', $context);
// ตั้งค่า transport เปิดใช้งาน ssl เปลี่ยนเป็น http+SSL คือ https
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();
จากโค้ดข้างต้นที่ใช้ Workerman จะสร้างบริการ https ขึ้นมาได้ คลient สามารถเชื่อมต่อกับ Workerman ผ่านโปรโตคอล https เพื่อการสื่อสารที่เข้ารหัสอย่างปลอดภัยได้
การทดสอบ:
กรอกที่อยู่ในแถบที่อยู่ของเบราว์เซอร์เป็น https://โดเมน:443 เพื่อเข้าชม。
หมายเหตุ:
-
พอร์ต https ต้องเข้าถึงด้วยโปรโตคอล https เท่านั้น ไม่สามารถเข้าถึงด้วยโปรโตคอล http ได้
-
ใบรับรองมักจะเชื่อมโยงกับโดเมน ดังนั้นในระหว่างการทดสอบโปรดใช้โดเมนไม่ใช่ ip
-
หากไม่สามารถเข้าถึง https ได้ให้ตรวจสอบไฟร์วอลล์ของเซิร์ฟเวอร์
การใช้ nginx เป็นพร็อกซี่ SSL
นอกจากการใช้ SSL จาก Workerman เองแล้ว ยังสามารถใช้ nginx เป็นพร็อกซี่ SSL เพื่อทำให้รองรับ https ได้
หมายเหตุ
ใช้ nginx เป็นพร็อกซี่ SSL หรือกำหนด SSL โดย Workerman เท่านั้น เลือกรูปแบบใดรูปแบบหนึ่งไม่ได้
หลักการและกระบวนการสื่อสารเป็นดังนี้:
-
คลient เริ่มการเชื่อมต่อ https ไปที่ nginx
-
nginx จะแปลงข้อมูลโปรโตคอล https เป็นโปรโตคอล http และส่งต่อไปยังพอร์ต http ของ Workerman
-
Workerman จะได้รับข้อมูลและทำการประมวลผลทางธุรกิจ จากนั้นส่งข้อมูลโปรโตคอล http กลับไปยัง nginx
-
nginx จะแปลงข้อมูลโปรโตคอล http กลับเป็น https และส่งต่อให้กับคลient
ตัวอย่างการตั้งค่า nginx
ข้อกำหนดเบื้องต้นและการเตรียมการ:
-
สมมติว่า Workerman ฟังอยู่ที่พอร์ต 8181 (โปรโตคอล http)
-
ได้ขอรับใบรับรอง (ไฟล์ pem/crt และไฟล์ key) และเก็บไว้ใน /etc/nginx/conf.d/ssl
-
ตั้งใจที่จะใช้ nginx เปิดพอร์ต 443 เพื่อให้บริการพร็อกซี่ wss (สามารถเปลี่ยนพอร์ตตามต้องการ)
การตั้งค่า nginx มีลักษณะโดยประมาณดังนี้:
upstream workerman {
server 127.0.0.1:8181;
keepalive 10240;
}
server {
listen 443;
server_name ชื่อโดเมน.com;
access_log off;
ssl on;
ssl_certificate /etc/nginx/conf.d/ssl/server.pem;
ssl_certificate_key /etc/nginx/conf.d/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 /
{
proxy_pass http://workerman;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Connection "";
}
}