HTTPS/SSL and Linux kernel
Open Swoole TLS và HTTPS
1. Cách Tạo chứng chỉ SSL với mkcert
Bạn có thể sử dụng mkcert để tạo chứng chỉ SSL và thiết lập CA tại môi trường phát triển cục bộ của bạn.
mkcert -install # Created a new local CA 💥 # The local CA is now installed in the system trust store! ⚡️ # The local CA is now installed in the Firefox trust store (requires browser restart)! 🦊 mkcert example.com "*.example.com" example.test localhost 127.0.0.1 ::1 #Created a new certificate valid for the following names 📜 # - "example.com" # - "*.example.com" # - "example.test" # - "localhost" # - "127.0.0.1" # - "::1" # The certificate is at "./example.com+5.pem" and the key at "./example.com+5-key.pem" ✅
2. Cách bật HTTPS tại Open Swoole Server?
Bạn có thể bật SSL cho máy chủ HTTP hoặc máy chủ HTTP2, máy chủ WebSocket với các cài đặt sau:
<?php $server->set([ 'ssl_cert_file' => __DIR__ . '/config/example.com+5.pem', 'ssl_key_file' => __DIR__ . '/config/example.com+5-key.pem' ]);
Bạn có thể tìm thấy các cấu hình SSL khác tại Open Swoole Server Configuration.
Bạn phải vượt qua SWOOLE_SSL khi xác định máy chủ Open Swoole để bật SSL:
$server = new Swoole\Server("0.0.0.0", 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);
Open Swoole Linux Kernel Tunning
1. Cài đặt Linux ulimit
# /etc/security/limits.conf * soft nofile 262140 * hard nofile 262140 root soft nofile 262140 root hard nofile 262140 * soft core unlimited * hard core unlimited root soft core unlimited root hard core unlimited
2.Cài đặt Linux sysctl
# /etc/sysctl.conf # socket buffer net.ipv4.tcp_mem = 379008 505344 758016 net.ipv4.tcp_wmem = 4096 16384 4194304 net.ipv4.tcp_rmem = 4096 87380 4194304 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 # ipv4 net.ipv4.tcp_syncookies=1 net.ipv4.tcp_max_syn_backlog=81920 net.ipv4.tcp_synack_retries=3 net.ipv4.tcp_syn_retries=3 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.ip_local_port_range = 20000 65000 net.ipv4.tcp_max_tw_buckets = 200000 net.ipv4.route.max_size = 5242880
Làm thế nào để duy trì một kết nối TCP đang hoạt động lâu dài?
Với OpenSwoole, bạn có thể thiết lập máy chủ TCP hoặc máy chủ HTTP và sử dụng các tùy chọn cấu hình sau để duy trì kết nối TCP đang hoạt động lâu dài:
- open_tcp_keepalive: Sau khi được đặt thành true, bạn có thể sử dụng tcp_keepidle, tcp_keepcount, tcp_keepinterval.
- heartbeat_check_interval: Bạn có thể bật tính năng này, được xác định trong vài giây cho phép bạn giữ các kết nối mở lâu hơn, bạn cũng có thể đặt heartbeat_idle_time.
Gọi đến hàm không xác định Co \ run ()
Tất cả các quy trình trong OpenSwoole cần được bao bọc bên trong một ngữ cảnh chương trình đăng ký, ngữ cảnh này được tạo tự động cho bạn khi bạn sử dụng Máy chủ HTTP chẳng hạn.
Tuy nhiên, nếu bạn nhận được lỗi thông báo Lỗi chưa xác định: Uncaught Error: Call to undefined function Co\run()
or Uncaught Error: Call to undefined function go()
bạn phải đảm bảo rằng bạn đang sử dụng phiên bản v4.4.0 trở lên hoặc bạn đã include the namespace Swoole\Coroutine
.
Bạn cũng có thể sử dụng Swoole\Coroutine::create(callable $function, …$args): int|false là một thay thế cho go ().
Tôi có thể chia sẻ kết nối Redis hoặc MySQL không?
Không, không thể chia sẻ một kết nối (Redis hoặc MySQL) giữa nhiều coroutines. Không thể đọc hoặc ghi cùng một lúc bằng một kết nối.
Bạn không thể chia sẻ kết nối nhưng bạn có thể giữ chúng mở hoặc chạy qua một nhóm kết nối. Một nhóm kết nối cho phép bạn lưu trữ nhiều kết nối có thể được sử dụng bởi nhiều coroutines và khôi phục lại khi chúng đã được sử dụng và không còn cần thiết nữa, bạn có thể đọc thêm về các nhóm kết nối tại đây.
My connection has been closed errors
Khi sử dụng OpenSwoole, đặc biệt là Máy chủ HTTP, bạn có thể gặp các thông báo sau trong bảng điều khiển:
NOTICE swFactoryProcess_finish (ERRNO 1004): send 165 byte failed, because connection[fd=123] is closed NOTICE swFactoryProcess_finish (ERROR 1005): connection[fd=123] does not exists
Khi nhìn thấy những thông báo này, chúng chỉ là thông báo và không có gì phải lo lắng. Những thông báo này được hiển thị do một trong những điều sau:
- Trình duyệt làm mới trang một cách điên cuồng (nhấp nháy trước khi tải).
- ab Bị hủy ở một nửa bài kiểm tra áp suất khi điểm chuẩn.
- wrk Kiểm tra áp suất dựa trên thời gian (các yêu cầu chưa hoàn thành sẽ bị hủy khi hết thời gian).
Lỗi kết nối bị hủy ( Discarded Connection Errors )
WARNING swWorker_discard_data (ERRNO 1007): [2] received the wrong data[21 bytes] from socket#75 WARNING Worker_discard_data (ERRNO 1007): [2] ignore data[5 bytes] received from session#2
Đây là điều bạn nên xem xét, các lỗi ở trên có nghĩa là bạn có một số lượng lớn kết nối bị ngắt kết nối và có thể cần phải kiểm tra cấu hình của mình với tùy chọn discard_timeout_request cho server.
Kết nối bị từ chối (Connection Refused)
Nếu bạn nhận được lỗi bị từ chối kết nối trên trình duyệt hoặc ứng dụng khách của mình, điều đó có thể có nghĩa là bạn đang không truy cập đúng địa chỉ IP hoặc cổng mà máy chủ OpenSwoole của bạn đang chạy.
- Đảm bảo rằng bạn đã đặt đúng IP và cổng khi chạy máy chủ OpenSwoole, hãy kiểm tra điều này bằng ps aux.
- Kiểm tra xem cổng có thực sự đang nghe hay không bằng netstat -lp.
- Kiểm tra xem quá trình giao tiếp mạng có bình thường không với tcpdump traceroute.
- Đảm bảo rằng bạn không có thiết lập quy tắc tường lửa nào đang chặn quyền truy cập.
Không có tài nguyên (Resource temporarily unavailable)
Lỗi này thường đề cập đến mô-đun Swoole \ Client.
Khi gặp lỗi sau:
swoole_client::recv(): recv() failed. Error: Resource temporarily unavailable [11]
Nó chỉ ra rằng máy chủ không trả lại dữ liệu trong thời gian được chỉ định và kết nối đã hết thời gian chờ.
- Bạn có thể xem quá trình giao tiếp mạng thông qua tcpdump để kiểm tra xem máy chủ đã gửi dữ liệu chưa.
- Kết quả của $serv-> send () phải là true.
- Bạn có thể cần tăng thời gian chờ máy chủ của mình.
Request hết thời gian và buộc phải chấm dứt (Worker exit timeout, forced to terminate)
Nếu bạn gặp những điều sau:
WARNING swWorker_reactor_try_to_exit (ERRNO 9012): worker exit timeout, forced to terminate
Chỉ ra rằng quy trình công nhân đã không thoát trong thời gian đã thỏa thuận (max_wait_time
seconds) và OpenSwoole buộc phải chấm dứt quy trình làm việc.
Bạn nên tăng thời gian chờ hoặc đảm bảo khối lượng công việc của bạn có thể giữ trong khoảng thời gian cấu hình max_wait_time. Tuy nhiên, đây chỉ có thể là sự cố khi tắt hoặc khởi động lại máy chủ.
Không thể gọi lại (Unable to find callback function for signal Broken pipe)
WARNING swSignalfd_onSignal (ERRNO 707): Unable to find callback function for signal Broken pipe: 13
Cho biết rằng dữ liệu được gửi đến một kết nối đã ngắt kết nối, thường là do giá trị trả về của lần gửi không được kiểm tra và việc trả lại không thành công và tiếp tục gửi.
Object của class Swoole\Curl\Handler không thể chuyển thành int
Khi sử dụng SWOOLE_HOOK_CURL, bạn có thể gặp các lỗi sau:
PHP Notice: Object of class Swoole\Curl\Handler could not be converted to int PHP Warning: curl_multi_add_handle() expects parameter 2 to be resource, object given
Khi CURL được gọi, nó không còn là kiểu tài nguyên nữa mà là kiểu đối tượng nên việc chuyển đổi thành int (Số) sẽ không được hỗ trợ.
Giải pháp tốt nhất để giải quyết vấn đề này là sử dụng SWOOLE_HOOK_NATIVE_CURL thay vì sử dụng CURL.
Bạn cũng có thể sử dụng SDK của Guzzle để thay thế trình xử lý.
Guzzle 7.0+ outputting result directly to console
Khi sử dụng đồng thời kết nối coroutines và Guzzle 7.0 +, sau khi bắt đầu yêu cầu, kết quả sẽ được xuất trực tiếp đến thiết bị đầu cuối.
Vui lòng cập nhật lên ít nhất v4.5.8 vì điều này đã được khắc phục.
No buffer space available
Lỗi này có thể được bỏ qua. Lỗi này là do tùy chọn socket_buffer_size quá lớn, không được các hệ thống chấp nhận và không ảnh hưởng đến hoạt động của chương trình.
Maximum GET request là 8192
Yêu cầu GET chỉ có một tiêu đề Http. OpenSwoole sử dụng bộ nhớ đệm kích thước cố định 8K và không thể sửa đổi. Nếu yêu cầu không phải là yêu cầu Http chính xác, sẽ xảy ra lỗi. Lỗi sau sẽ được đưa ra:
WARN swReactorThread_onReceive_http_request: http header is too long.
Kích thước file upload quá lớn (POST file upload size)
Kích thước tối đa bị giới hạn bởi package_max_length, mặc định là 2M, bạn có thể gọi Server-> set để chuyển vào một giá trị mới để sửa đổi kích thước. OpenSwoole chạy trong bộ nhớ, vì vậy nếu nó được đặt quá lớn, nó có thể gây ra một số lượng lớn các yêu cầu đồng thời làm cạn kiệt tài nguyên của máy chủ.
Có lẽ tốt nhất là bạn nên phân đoạn tải lên thay thế khi xử lý các tệp lớn đang được tải lên.
Kiểm tra cấu hình OpenSwoole đã cài đặt của bạn
OpenSwoole được cài đặt thông qua một phần mở rộng PHP PECL và yêu cầu bạn định cấu hình và biên dịch trước khi sử dụng OpenSwoole trong ứng dụng của mình.
Do phương pháp cài đặt bất kỳ tiện ích mở rộng PHP nào, bạn có thể muốn kiểm tra cách bạn đã định cấu hình OpenSwoole vào một ngày sau đó, để thực hiện việc này, bạn có thể sử dụng php –ri openswoole sẽ hiển thị các thông tin tương tự như:
openswoole Open Swoole => enabled Author => Open Swoole Group & Contributors <hello@swoole.co.uk> Version => 4.7.3-dev Built => Nov 7 2021 14:44:34 coroutine => enabled with boost asm context kqueue => enabled rwlock => enabled sockets => enabled openssl => OpenSSL 3.0.0 7 sep 2021 dtls => enabled http2 => enabled json => enabled curl-native => enabled pcre => enabled c-ares => 1.17.2 zlib => 1.2.11 brotli => E16777225/D16777225 mysqlnd => enabled async_redis => enabled Directive => Local Value => Master Value swoole.enable_coroutine => On => On swoole.enable_library => On => On swoole.enable_preemptive_scheduler => Off => Off swoole.display_errors => On => On swoole.use_shortname => On => On swoole.unixsock_buffer_size => 262144 => 262144
Sau đó, nếu cần cấu hình lại OpenSwoole với các cài đặt khác, bạn có thể sử dụng ví dụ:
pecl install --configureoptions 'enable-sockets="no" enable-openssl="yes" enable-http2="yes" enable-mysqlnd="yes" enable-swoole-json="no" enable-swoole-curl="yes"' openswoole
Xem thêm về cách cài đặt tại đây.
PHP Fatal error: Uncaught Error: Call to undefined function Co\run()
Bạn có thể bật bí danh tên tắt OpenSwoole bằng cách sửa đổi php.ini hoặc openswoole.ini và thêm dòng sau:
swoole.use_shortname=On
ERROR Swoole short name have to disable
Bạn có thể tắt bí danh tên viết tắt của OpenSwoole bằng cách sửa đổi php.ini hoặc openswoole.ini và thêm dòng sau:
swoole.use_shortname=Off
Kết bài
Bài viết liên quan:
Giới thiệu về php swoole.
Cài đặt và cấu hình php swoole.
Hi vọng với bài viết này, bạn có thể giải quyết cá vấn lỗi cơ bản cho dự án của mình . Nếu bạn thấy bài viết hay và có ý nghĩa hãy like và chia sẻ bài viết này để mọi người cùng nhau học tập nhé. Cảm ơn các bạn đã ghé thăm codetutam.com