OpenNJet là một dự án mã nguồn mở, được hỗ trợ bởi Quỹ OpenAtom, cung cấp một engine ứng dụng web và proxy hiệu suất cao, nhẹ. Nó hoạt động như một lớp dữ liệu cho mạng lưới dịch vụ đám mây nguyên thủy, tích hợp các tính năng như tải cấu hình động, kiểm tra sức khỏe chủ động, tính sẵn sàng cao cho cụm và API khai báo. Với khung trợ lý CoPilot, OpenNJet cho phép khả năng mở rộng cao bằng cách tách biệt mặt điều khiển và mặt dữ liệu, giúp các doanh nghiệp chuyển đổi sang công nghệ đám mây nguyên thủy một cách liền mạch và giảm chi phí vận hành IT.
Các khả năng chính của OpenNJet bao gồm:
- Cung cấp dịch vụ thời gian chạy cho các ứng dụng đám mây nguyên thủy, với khả năng nhận biết môi trường, kiểm soát an ninh và tối ưu hóa hiệu suất.
- Hỗ trợ nhiều dạng sản phẩm khác nhau thông qua cơ chế tải động, bao gồm cổng API, trình trung gian tin nhắn, bộ điều khiển lối vào/lối ra, sidecar, cân bằng tải và WAF.
- Tích hợp các chức năng tiên tiến cho giao tiếp hướng Đông-Tây trong mạng lưới dịch vụ, bao gồm chuyển hướng lưu lượng trong suốt, ngắt mạch, đo từ xa, tiêm lỗi, theo dõi liên kết và triển khai xanh/xanh.
Tại sao chọn OpenNJet?
- Cấu hình Động Không Mất Hiệu Suất: Khắc phục nhược điểm cố hữu của Nginx bằng cách cho phép thay đổi cấu hình theo thời gian thực mà không cần khởi động lại máy chủ, đảm bảo không gián đoạn dịch vụ và phản hồi nhanh chóng với những thay đổi về nhu cầu lưu lượng.
- Khung CoPilot Linh Hoạt: Được thiết kế để xử lý dữ liệu hiệu suất cao với các giao diện quản lý dễ mở rộng. Nó hỗ trợ xuất chỉ số, kiểm tra sức khỏe, giao diện quản lý và đồng bộ hóa cấu hình, cho phép giám sát, cấu hình và quản lý hệ thống một cách linh hoạt và động, đồng thời duy trì sự ổn định và độ tin cậy của mặt dữ liệu.
- Hỗ trợ HTTP/3: Tận dụng giao thức truyền tải QUIC mới để mang lại trải nghiệm web nhanh hơn, đáng tin cậy hơn và an toàn hơn, giảm thời gian chờ đợi của người dùng và tăng cường bảo mật mạng.
- Hỗ trợ Mã hóa Quốc gia (GuoMi): Tích hợp các thuật toán SM2, SM3 và SM4, chủ yếu cho các trường hợp sử dụng máy chủ và proxy ngược, cung cấp khả năng bảo vệ dữ liệu mạnh mẽ và đáp ứng các yêu cầu tuân thủ.
- Ứng dụng Cấp Doanh nghiệp: Cung cấp đồng bộ hóa trạng thái cụm, kiểm soát hạn ngạch, tính sẵn sàng cao và tài liệu vận hành tích hợp. Điều này hỗ trợ các thực hành DevOps như triển khai tự động, tích hợp liên tục và phân phối liên tục, nâng cao tính bảo mật, tính khả dụng và hiệu quả quản lý cho các ứng dụng hiện đại, đặc biệt là khi xử lý dữ liệu nhạy cảm và các cụm quy mô lớn.
Cài đặt OpenNJet
Hướng dẫn này minh họa việc cài đặt trên Ubuntu 20.04 LTS. OpenNJet cung cấp các gói nhị phân và kho phần mềm cho các bản phân phối khác nhau như CentOS, Ubuntu và CloudOS. Các gói nhị phân có thể được tải xuống từ kho lưu trữ chính trên Gitee. Việc cài đặt qua kho phần mềm sẽ tự động nhận các bản cập nhật sau này.
1. Cài đặt Gói nhị phân DEB
Tải xuống gói cài đặt phù hợp với phiên bản hệ thống của bạn. Ví dụ, đối với Ubuntu 20.04, hãy tải xuống phiên bản OpenNJet 2.0.1:
wget https://gitee.com/njet-rd/njet/releases/download/v3.2.1/njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb
Sử dụng dpkg để cài đặt gói đã tải xuống (ví dụ: njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb):
dpkg -i njet_3.2.1-1~ubuntu.18.04~bionic_amd64.deb
Sau khi cài đặt bằng gói nhị phân, tất cả các tệp liên quan đến OpenNJet sẽ được đặt trong thư mục /usr/local/njet và tệp dịch vụ sẽ được thêm vào thư mục /usr/lib/systemd/system.
2. Tệp Cấu hình OpenNJet
Điều hướng đến thư mục cấu hình và sao lưu tệp cấu hình mặc định:
cd /usr/local/njet/conf/
cp njet.conf njet.conf.bak
cat njet.conf
Nội dung cấu hình mặc định:
worker_processes auto;
cluster_name njet;
node_name node1;
error_log logs/error.log error;
helper ctrl /usr/local/njet/modules/njt_helper_ctrl_module.so /usr/local/njet/conf/njet_ctrl.conf;
helper broker /usr/local/njet/modules/njt_helper_broker_module.so;
helper access_data /usr/local/njet/modules/njt_helper_access_data_module.so /usr/local/njet/conf/goaccess.conf;
load_module /usr/local/njet/modules/njt_http_split_clients_2_module.so;
load_module /usr/local/njet/modules/njt_agent_dynlog_module.so;
load_module /usr/local/njet/modules/njt_http_dyn_bwlist_module.so;
load_module /usr/local/njet/modules/njt_dyn_ssl_module.so;
load_module /usr/local/njet/modules/njt_http_vtsc_module.so;
load_module /usr/local/njet/modules/njt_http_location_module.so;
load_module /usr/local/njet/modules/njt_http_access_log_zone_module.so;
#load_module /usr/local/njet/modules/njt_http_lua_module.so;
events {
worker_connections 1024;
}
http {
dyn_kv_conf conf/iot-work.conf;
include mime.types;
access_log off;
access_log_write_zone on;
vhost_traffic_status_zone;
access_log_zone log_zone 100m;
#access_log_zone_ignore_ip 127.0.0.1;
access_log_zone_valid 3;
#lua_package_path "$prefix/lualib/lib/?.lua;/usr/local/njet/modules/?.lua;$prefix/apps/?.lua;;";
#lua_package_cpath "$prefix/lualib/clib/?.so;;";
server {
listen 8080;
location / {
root html;
}
}
}
Khởi động dịch vụ OpenNJet:
systemctl start njet
curl 127.0.0.1:8080
Nếu bạn thấy thông báo "Thank you for using njet.", OpenNJet đã được cài đặt thành công. Bạn có thể kiểm tra các tệp nhật ký lỗi bằng lệnh:
cat /usr/local/njet/logs/error.log
3. Kiểm tra Phân phối Tải
Để kiểm tra khả năng phân phối tải, hãy sửa đổi tệp cấu hình njet.conf như sau:
worker_processes auto;
cluster_name njet;
node_name node1;
error_log logs/error.log error;
helper ctrl /usr/local/njet/modules/njt_helper_ctrl_module.so /usr/local/njet/conf/njet_ctrl.conf;
helper broker /usr/local/njet/modules/njt_helper_broker_module.so;
helper access_data /usr/local/njet/modules/njt_helper_access_data_module.so /usr/local/njet/conf/goaccess.conf;
load_module /usr/local/njet/modules/njt_http_split_clients_2_module.so;
load_module /usr/local/njet/modules/njt_agent_dynlog_module.so;
load_module /usr/local/njet/modules/njt_http_dyn_bwlist_module.so;
load_module /usr/local/njet/modules/njt_dyn_ssl_module.so;
load_module /usr/local/njet/modules/njt_http_vtsc_module.so;
load_module /usr/local/njet/modules/njt_http_location_module.so;
load_module /usr/local/njet/modules/njt_http_access_log_zone_module.so;
#load_module /usr/local/njet/modules/njt_http_lua_module.so;
events {
worker_connections 1024;
}
http {
dyn_kv_conf conf/iot-work.conf;
include mime.types;
access_log off;
access_log_write_zone on;
vhost_traffic_status_zone;
access_log_zone log_zone 100m;
#access_log_zone_ignore_ip 127.0.0.1;
access_log_zone_valid 3;
#lua_package_path "$prefix/lualib/lib/?.lua;/usr/local/njet/modules/?.lua;$prefix/apps/?.lua;;";
#lua_package_cpath "$prefix/lualib/clib/?.so;;";
server {
listen 8080;
location / {
root html;
}
}
split_clients_2 $backend {
50% backend2;
* backend1;
}
upstream backend1 {
server 127.0.0.1:18080;
}
upstream backend2 {
server 127.0.0.1:18081;
}
server {
listen 18888;
location / {
proxy_pass http://${backend};
}
}
server {
listen 18080;
location / {
return 200 "welcome to 18080 http server\n";
}
}
server {
listen 18081;
location / {
return 200 "welcome to 18081 http server\n";
}
}
}
Sau khi áp dụng cấu hình này và khởi động lại Nginx, các yêu cầu gửi đến cổng 18888 sẽ được phân phối đến các máy chủ khác nhau.
Cập nhật Động Chính sách Truy cập Trang web (ví dụ: Danh sách đen/trắng IP)
OpenNJet hỗ trợ cấu hình động cho danh sách đen và trắng mà không cần bất kỳ chỉ thị đặc biệt nào. Các chỉ thị allow và deny hoạt động tương tự như cấu hình tĩnh.
allow: Chỉ định địa chỉ IP, dải CIDR hoặcallđược phép truy cập. Có thể được đặt ở các cấp độhttp,serverhoặclocation.deny: Chỉ định địa chỉ IP, dải CIDR hoặcallbị từ chối truy cập. Có thể được đặt ở các cấp độhttp,serverhoặclocation.
Bạn có thể quản lý các cấu hình này một cách động bằng các phương pháp sau:
1. Sử dụng curl
Bạn có thể tương tác với các API kết quả để gửi các yêu cầu cấu hình. Ví dụ, để lấy danh sách cấu hình đen trắng động:
curl -X GET http://IP:8081/api/v1/config/http_dyn_bwlist -H 'accept: application/json'
Mặc dù curl hữu ích, các phương pháp sau đây có thể thân thiện hơn với người vận hành.
2. Sử dụng Swagger để Cấu hình Động
Truy cập giao diện Swagger tại http://IP_Address:8081/doc/swagger/ để khám phá các điểm cuối cấu hình động. Tập trung vào các API liên quan đến danh sách đen/trắng động:
- GET
/v1/config/: Trả về danh sách các mô-đun cấu hình động được phép. - PUT
/v1/config/http_dyn_bwlist: Thiết lập cấu hình cho mô-đun danh sách đen/trắng động. - GET
/v1/config/http_dyn_bwlist: Truy xuất cấu hình mô-đun danh sách đen/trắng động hiện tại.
2.1. Cấu hình Động
Thử nghiệm với yêu cầu PUT để đặt quy tắc:
{
"servers": [
{
"listens": [
"0.0.0.0:18888"
],
"serverNames": [
""
],
"locations": [
{
"location": "/",
"accessIpv4": [
{
"rule": "deny",
"addr": "8.154.20.78",
"mask": "255.255.255.255"
}
],
"locations": [
{
"location": "/",
"accessIpv4": [
{
"rule": "deny",
"addr": "8.154.20.78",
"mask": "255.255.255.255"
}
]
}
]
}
]
}
]
}
Lưu ý quan trọng: Chỉ định chính xác địa chỉ IP trong trường listens. Nếu không, bạn có thể nhận được lỗi như "servers[8.154.20.78:18888,] can not find server.".
Sau khi áp dụng cấu hình này, các yêu cầu từ 8.154.20.78 đến cổng 18888 sẽ bị từ chối (lỗi 403).
Để cho phép truy cập, hãy thay đổi "rule": "deny" thành "rule": "allow":
{
"servers": [
{
"listens": [
"0.0.0.0:18888"
],
"serverNames": [
""
],
"locations": [
{
"location": "/",
"accessIpv4": [
{
"rule": "allow",
"addr": "8.154.20.78",
"mask": "255.255.255.255"
}
],
"locations": [
{
"location": "/",
"accessIpv4": [
{
"rule": "allow",
"addr": "8.154.20.78",
"mask": "255.255.255.255"
}
]
}
]
}
]
}
]
}
Với cấu hình này, yêu cầu sẽ thành công mà không cần sửa đổi tệp njet.conf. Điều này cho thấy sự tiện lợi của việc cấu hình động.
Sự khác biệt giữa OpenNJet và Nginx
OpenNJet xây dựng dựa trên kiến trúc Nginx, giới thiệu các cải tiến như lưu trữ động có thể duy trì và khả năng tải lại cấu hình động. Điều này giải quyết một vấn đề quan trọng trong việc quản lý cấu hình và mở rộng các trường hợp sử dụng của OpenNJet. Hơn nữa, để đáp ứng nhu cầu về khả năng quan sát trong các ứng dụng đám mây nguyên thủy, OpenNJet sử dụng khung CoPilot để tách biệt việc xử lý kinh doanh, quản lý cấu hình và thu thập chỉ số. Sự tách biệt này ngăn chặn tác động hiệu suất từ các hoạt động đo từ xa.
Là một engine ứng dụng đám mây nguyên thủy, OpenNJet hỗ trợ các thông số kỹ thuật API phổ biến như Ingress và Sidecar. Thông qua kiến trúc cấu hình động và khung CoPilot, OpenNJet có thể nhanh chóng hỗ trợ các tiêu chuẩn quy định mới bằng cách cập nhật các mô-đun CoPilot độc lập.
Trải nghiệm sử dụng OpenNJet cho thấy tiềm năng ứng dụng to lớn. Chúng tôi mong muốn khám phá các trường hợp sử dụng có giá trị hơn và khai thác tối đa khả năng của OpenNJet.