NGINX chuyển đổi CHÍNH thành các yêu cầu GET


10

Do một số quyết định thiết kế tồi tệ, chúng tôi có một ứng dụng không thể đáp ứng các yêu cầu HTTP Head (Trả về 'Phương thức không được phép'). Sửa đổi phần mềm để trả lại các yêu cầu CHÍNH một cách chính xác sẽ rất khó, không phải là không thể nhưng làm thêm. Ứng dụng nằm phía sau proxy NGINX, tôi đã tự hỏi liệu có cách nào để NGINX chuyển đổi các yêu cầu CHÍNH mà nó nhận được từ các máy khách thành các yêu cầu GET thành back-end, sau đó loại bỏ phản hồi trừ các tiêu đề và gửi lại cho khách hàng như thể các máy chủ ứng dụng của chúng tôi có thể đáp ứng các yêu cầu CHÍNH.

Cấu hình hiện tại (khá chuẩn)

upstream ourupstream{
    server unix:/var/apps/sockets/ourapp.socket.thread1
    server unix:/var/apps/sockets/ourapp.socket.thread2
    server unix:/var/apps/sockets/ourapp.socket.thread3
    [like 20 of these]
}

server {
    listen       1.2.3.4:80;
    server_name  ourapp;

    access_log  /var/apps/logs/ourapp.nginx.plog    proxy;
    error_log   /var/apps/logs/ourapp.nginx.elog    info;

    gzip on;

    gzip_types  text/plain text/html;

    proxy_intercept_errors on;
    proxy_connect_timeout 10;
    proxy_send_timeout 10;
    proxy_read_timeout 10;
    proxy_next_upstream error timeout;
    client_max_body_size 2m;

    error_page 404 /static/404.html;
    error_page 500 501 502 503 504 =500 /static/500.html;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://ourupstream/;
    }

    location /static/ {
        root /var/apps/global/;
    }
}

Làm thế nào bạn chuyển yêu cầu đến phụ trợ? proxy_pass? fastcgi_pass? Bạn có thể dán cấu hình hiện tại của bạn? Phiên bản nginx nào bạn đang chạy?
kolbyjack

@kolbyjack proxy_pass sử dụng ổ cắm unix, NGINX 1.1.12 và 1.0.11 trong dev, 1.0.11 trong sản xuất (Sắp chuyển sản xuất sang 1.1.12)
Smudge

Câu trả lời:


5

Vì bạn đang sử dụng proxy_pass, tôi nghĩ bạn sẽ phải sử dụng một số lạm dụng error_page (và vì bạn đã sử dụng error_pages, nên bạn cũng cần bật các trang lỗi đệ quy). Tôi nghĩ rằng điều này sẽ làm việc cho bạn:

upstream ourupstream{
    server unix:/var/apps/sockets/ourapp.socket.thread1
    server unix:/var/apps/sockets/ourapp.socket.thread2
    server unix:/var/apps/sockets/ourapp.socket.thread3
    [like 20 of these]
}

server {
    listen       1.2.3.4:80;
    server_name  ourapp;

    access_log  /var/apps/logs/ourapp.nginx.plog    proxy;
    error_log   /var/apps/logs/ourapp.nginx.elog    info;

    gzip on;

    gzip_types  text/plain text/html;

    proxy_intercept_errors on;
    proxy_connect_timeout 10;
    proxy_send_timeout 10;
    proxy_read_timeout 10;
    proxy_next_upstream error timeout;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    client_max_body_size 2m;

    error_page 404 /static/404.html;
    error_page 500 501 502 503 504 =500 /static/500.html;

    location @force_get {
        recursive_error_pages on;
        proxy_method GET;
        proxy_pass http://ourupstream;
    }

    location / {
        error_page 550 = @force_get;
        if ($request_method = HEAD) { return 550; }
        proxy_pass http://ourupstream;
    }

    location /static/ {
        root /var/apps/global/;
    }
}

Điều này dường như vẫn trả lại cơ thể cho khách hàng, ngay cả khi yêu cầu với đầu. Có cách nào để lột / bỏ qua nội dung cơ thể?
Smudge

Tôi đã hy vọng nó sẽ nhớ rằng yêu cầu ban đầu là TRƯỚC và thả xác. Tôi không thể nghĩ ra một cách khác để làm điều đó xảy ra, xin lỗi.
kolbyjack

Ồ tốt, dù sao cũng đủ gần với những gì chúng ta cần
Smudge
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.