Tạo dịch vụ https
Hỏi:
Workerman làm thế nào để tạo một dịch vụ https nhằm cho phép khách hàng kết nối qua https để giao tiếp?
Đáp:
Giao thức https thực chất là http+SSL, tức là thêm lớp SSL vào giao thức http. Workerman hỗ trợ giao thức http, đồng thời cũng hỗ trợ SSL (cần Workerman phiên bản >=3.3.7),
vì vậy chỉ cần mở SSL trên cơ sở giao thức http là có thể hỗ trợ giao thức https.
Có hai phương án chung để làm cho Workerman hỗ trợ https, một là Workerman trực tiếp mở SSL, một cách khác là sử dụng nginx làm proxy cho SSL. Chọn một trong hai phương án thì được, không thể thiết lập cả hai cùng một lúc.
Workerman mở SSL
Chuẩn bị:
-
Workerman phiên bản >=3.3.7
-
PHP đã cài đặt mở rộng openssl
-
Đã xin cấp chứng chỉ (tệp pem/crt và tệp key) đặt tại /etc/nginx/conf.d/ssl
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// Chứng chỉ tốt nhất là chứng chỉ đã xin cấp
$context = array(
'ssl' => array(
'local_cert' => '/etc/nginx/conf.d/ssl/server.pem', // Cũng có thể là tệp crt
'local_pk' => '/etc/nginx/conf.d/ssl/server.key',
'verify_peer' => false,
'allow_self_signed' => true, // Nếu là chứng chỉ tự ký cần mở tùy chọn này
)
);
// Thiết lập giao thức là http
$worker = new Worker('http://0.0.0.0:443', $context);
// Thiết lập transport mở ssl, biến thành http+SSL tức là https
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();
Bằng mã trên của Workerman, dịch vụ https đã được tạo, khách hàng có thể kết nối server Workerman qua giao thức https để thực hiện giao tiếp mã hóa an toàn.
Thử nghiệm:
Gõ địa chỉ vào thanh địa chỉ của trình duyệt https://tênmiền:443 để truy cập.
Lưu ý:
-
Cổng https phải được truy cập bằng giao thức https, không thể truy cập bằng giao thức http.
-
Chứng chỉ thường được gắn với tên miền, vì vậy khi thử nghiệm hãy sử dụng tên miền, không sử dụng địa chỉ ip.
-
Nếu không thể truy cập bằng https, hãy kiểm tra tường lửa của máy chủ.
Sử dụng nginx làm proxy cho ssl
Ngoài việc sử dụng SSL của Workerman, cũng có thể sử dụng nginx làm proxy cho SSL để thực hiện https.
Lưu ý
Nginx làm proxy cho SSL và Workerman thiết lập SSL chỉ chọn một, không thể mở cùng lúc.
Nguyên lý và quy trình giao tiếp là:
-
Khách hàng khởi tạo kết nối https đến nginx
-
Nginx chuyển đổi dữ liệu giao thức https thành giao thức http và chuyển tiếp đến cổng http của Workerman
-
Workerman nhận dữ liệu, thực hiện xử lý logic kinh doanh, trả về dữ liệu giao thức http cho nginx
-
Nginx lại chuyển đổi dữ liệu giao thức http thành https, chuyển tiếp cho khách hàng
Tham khảo cấu hình nginx
Điều kiện tiên quyết và chuẩn bị:
-
Giả sử Workerman lắng nghe cổng 8181 (giao thức http)
-
Đã xin cấp chứng chỉ (tệp pem/crt và tệp key) đặt tại /etc/nginx/conf.d/ssl
-
Dự định sử dụng nginx mở cổng 443 để cung cấp dịch vụ proxy wss ra ngoài (cổng có thể thay đổi theo nhu cầu)
Cấu hình nginx tương tự như sau:
upstream workerman {
server 127.0.0.1:8181;
keepalive 10240;
}
server {
listen 443;
server_name tênmiền.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 "";
}
}