Tôi có thuê một VPS để chơi với một số dự án cá nhân. Để bắt đầu, tôi đang cố gắng thiết lập nó để lưu trữ API REST bằng Node.js, vì tôi chỉ mới sử dụng Spring Boot cho việc đó.
Tôi đã triển khai các giải pháp bằng cách điều chỉnh từ các hướng dẫn sau:
https://www.robinwieruch.de/node-express-server-rest-api (hầu hết mã API trông như thế này)
https://itnext.io/building-restful-api-with-node-js-express-js-and-postgresql-the-right-way-b2e718ad1c66 (nhưng tôi đang dần chuyển đổi để sử dụng các tiêu chuẩn từ đây)
Để triển khai thực tế, tôi đã thay đổi gói API với Babel và tôi đang triển khai nó với PM2.
https://www.nginx.com/blog/deploying-nginx-plus-as-an-api-gateway-part-1/ (không phải Plus mặc dù)
(Tất cả những liên kết có sẵn thông qua http://web.archive.org/ vì vậy họ sẽ không đi đâu cả sớm)
Tôi đã tạo một dự án Node.js khác bằng cách sử dụng trục để kiểm tra các yêu cầu REST. Chạy nó trong cùng một VPS hoạt động, nhưng tôi phải thay đổi mã API để liên kết với máy chủ cục bộ
. Trước đây, với địa chỉ liên kết không được chỉ định, nó được liên kết với IPv6 máy chủ cục bộ
(nếu tôi hiểu đúng) và vì miền của tôi không hoạt động với IPv6 nên tôi sẽ gắn bó với IPv4.
Về phía NGINX, tôi đã thực hiện nhiều thay đổi nhất vì hiện tại tôi chỉ có 1 API và tôi sẽ không sử dụng cân bằng tải. Ngoài ra, tôi đã thay đổi chính sách đặt tên. tôi sẽ sử dụng example.com/app_or_project_name/api_or_web_or_other_kind_of_interface/project_specific_routes
.
Đây là cách thiết lập NGINX của tôi trông như thế nào. Tôi đã ẩn danh nó và thay đổi để sử dụng cùng tên với ví dụ NGINX:
api_backends.conf
kho thượng lưu {
vùng api 64k;
máy chủ 127.0.0.1: some_port_number;
}
Đó là số cổng và máy chủ API REST.
api_conf.d/warehouse_api.conf
địa điểm /kho/api/ {
truy cập_log /var/log/nginx/warehouse_api.log chính;
auth_request /_validate_apikey;
proxy_pass http://kho;
trả lại 404;
}
api_gateway.conf
bao gồm api_backends.conf;
bao gồm api_keys.conf;
người phục vụ {
access_log /var/log/nginx/api_access.log chính;
nghe 443 ssl;
server_name my-domain.net;
ssl_certificate /etc/letsencrypt/live/my-domain.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/my-domain.net/privkey.pem;
ssl_session_cache được chia sẻ:SSL:10m;
ssl_session_timeout 5 phút;
ssl_ciphers CAO:!aNULL:!MD5;
ssl_protocols TLSv1.2 TLSv1.3;
bao gồm api_conf.d/*.conf;
bật proxy_intercept_errors;
bao gồm api_json_errors.conf;
ứng dụng default_type/json;
vị trí = /_validate_apikey {
nội bộ;
nếu ($http_apikey = "") {
trả lại 401;
}
nếu ($api_client_name = "") {
trả lại 403;
}
trả lại 204;
}
}
tôi có thể thiết lập proxy_intercept_errors
đến tắt
một khi nó hoạt động. Tôi sẽ phải thực hiện một số thử nghiệm để xem những gì thay đổi trong các câu trả lời.
api_json_errors.conf
Tương tự như ví dụ.
mặc định.conf
người phục vụ {
server_name www.my-domain.net;
địa điểm / {
gốc /usr/share/nginx/html;
chỉ mục index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
vị trí = /50x.html {
gốc /usr/share/nginx/html;
}
nghe 443 ssl;
ssl_certificate /etc/letsencrypt/live/my-domain.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/my-domain.net/privkey.pem;
bao gồm /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
người phục vụ {
nếu ($host = www.my-domain.net) {
trả lại 301 https://$host$request_uri;
}
nếu ($host = my-domain.net) {
trả lại 301 https://$host$request_uri;
}
nghe 80;
server_name my-domain.net www.my-domain.net;
trả lại 404;
}
Tôi đã phải thực hiện một số thay đổi ở đây vì có sự kết hợp giữa địa chỉ và cổng bị trùng lặp người phục vụ
cấu hình.
nginx.conf
người dùng nginx;
worker_processes tự động;
error_log /var/log/nginx/error.log thông tin;
pid /var/run/nginx.pid;
load_module /etc/nginx/modules/ngx_http_js_module.so;
sự kiện {
công_nhân kết_nối 1024 ;
}
http {
bao gồm /etc/nginx/mime.types;
ứng dụng default_type/octet-stream;
log_format chính '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log chính;
gửi tệp trên;
keepalive_timeout 65;
bao gồm /etc/nginx/api_gateway.conf;
bao gồm /etc/nginx/conf.d/*.conf;
}
Khi tôi chạy dự án thử nghiệm tương tự bên ngoài VPS, tôi nhận được kết quả như sau:
{
thông báo: 'Yêu cầu không thành công với mã trạng thái 404',
tên: 'Lỗi',
mô tả: không xác định,
số: không xác định,
tên tệp: không xác định,
số dòng: không xác định,
số cột: không xác định,
cây rơm: '...',
cấu hình: {
url: 'https:
phương pháp: 'lấy',
tiêu đề: {
Chấp nhận: 'application/json, text/plain, *
Một điều tôi đã tìm ra là lỗi 404 được trả về bởi kho_api.conf
bởi vì, nếu tôi thay đổi trả lại 404;
sang một mã khác, đó là mã tôi sẽ nhận được.
Tôi đã kích hoạt tính năng gỡ lỗi trong NGINX nhưng tôi không thể hiểu đầu ra, ngay cả sau khi tìm kiếm một chút:
22/07/2021 11:54:17 [gỡ lỗi] nginx_pid
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid
Tôi đã thử một vài cách tiếp cận khác nhau để tìm kiếm về tất cả những điều này nhưng không thể tìm thấy bất kỳ đầu mối nào.
Vì vậy, những gì đang xảy ra, những gì sai và làm thế nào để tôi khắc phục nó?
Cảm ơn trước.
Cập nhật 2021-08-04
Theo câu trả lời của @ jose-fernando-lopez-fernandez, tôi đã thay đổi api_conf.d/warehouse_api.conf
theo sau:
địa điểm /kho/api/ {
truy cập_log /var/log/nginx/warehouse_api.log chính;
auth_request /_validate_apikey;
địa điểm /kho/api/ {
proxy_pass http://kho;
}
trả lại 404;
}
để giữ cho nó phù hợp với các ví dụ mà tôi đang theo dõi. Tôi đã kiểm tra lại và thay vào đó gặp lỗi 401. Tôi đã kiểm tra và tôi đã vượt qua Mã API
không chính xác.
Tôi đã sửa nó, kiểm tra lại và nhận được 404 một lần nữa. Nhưng bây giờ tôi đang nhận được nhiều đầu ra hơn từ gỡ lỗi nginx
.
Tôi đã ẩn danh nó. tôi đã thay thế Mã API
bởi một cái khác tôi đã tạo và sẽ không được sử dụng cho bất cứ điều gì.
Tôi cũng đã thay thế posix_memalign
, thêm dọn dẹp http
, miễn phí
, chuỗi nhà văn trong
và malloc
bởi các chuỗi có cùng độ dài với các byte ngẫu nhiên.Tôi không biết có nên ẩn danh hay không. Nếu cần thiết cho giải pháp của câu hỏi này, vui lòng hỏi và tôi sẽ thêm lại chúng trên cơ sở cần biết.
Đây đi:
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
"NHẬN/kho/api/tin nhắn HTTP/1.0
Máy chủ: nhà kho
Kết nối: đóng
Chấp nhận: ứng dụng/json, văn bản/đơn giản, */*
Kiểm soát truy cập-Cho phép-Xuất xứ: *
apikey: o6ZlKSX24MCY/uPwCRl80WAS
Tác nhân người dùng: axios/0.21.1
"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid
Nó có vẻ kỳ lạ với tôi rằng nó dường như đang xem xét Kho
như một tên máy chủ. Mặt khác, NGINX xác định một số địa chỉ có tên đó nên có thể liên quan đến địa chỉ đó.