Sử dụng nginx để viết lại các url bên trong các phản hồi đi


8

Chúng tôi có một khách hàng với một trang web chạy trên Apache. Gần đây, trang web đã thấy tải tăng lên và như một khoảng cách dừng, chúng tôi muốn chuyển tất cả nội dung tĩnh trên trang web sang một tên miền không nấu, ví dụ http://static.thedomain.com.

Ứng dụng này không được hiểu rõ. Vì vậy, để cung cấp cho các nhà phát triển thời gian để sửa đổi mã để trỏ các liên kết của họ đến máy chủ nội dung tĩnh ( http://static.thedomain.com) Tôi đã nghĩ đến việc ủy ​​quyền trang web thông qua nginx và viết lại các phản hồi gửi đi để các liên kết /images/...được viết lại thành http://static.thedomain.com/images/....

Vì vậy, ví dụ, trong phản hồi từ Apache tới nginx, có một loạt các Tiêu đề + HTML. Trong HTML được trả về từ Apache, chúng ta có <img>các thẻ giống như:

<img src="/images/someimage.png" />

Tôi muốn chuyển đổi nó thành:

<img src="http://static.thedomain.com/images/someimage.png" />

Vì vậy, trình duyệt khi nhận được trang HTML sau đó yêu cầu hình ảnh trực tiếp từ máy chủ nội dung tĩnh.

Điều này có thể với nginx (hoặc HAProxy) không?

Tôi đã có một cái nhìn lướt qua các tài liệu nhưng không có gì nhảy ra khỏi tôi ngoại trừ việc viết lại các url trong nước.

Câu trả lời:


5

Có một http://wiki.nginx.org/HttpSubModule - "Mô-đun này có thể tìm kiếm và thay thế văn bản trong phản hồi nginx."

sao chép quá khứ từ tài liệu:

Cú pháp:

sub_filter string replacement

Thí dụ:

location / {
  sub_filter      </head>
  '</head><script language="javascript" src="$script"></script>';
  sub_filter_once on;
}

Có bất cứ điều gì như thế này cho haproxy?
bradvido

@bradvido Tôi chưa tìm thấy tính năng như vậy trong haproxy.
Oleg Neumyvakin

3

Tốt nhất là sử dụng tính năng proxy và tìm nạp nội dung từ vị trí thích hợp, trái với việc viết lại URL và gửi chuyển hướng trở lại trình duyệt.

Một ví dụ điển hình về nội dung ủy quyền trông như:

#
#  This configuration file handles our main site - it attempts to
# serve content directly when it is static, and otherwise pass to
# an instance of Apache running upon 127.0.0.1:8080.
#
server {
    listen :80;

    server_name  www.debian-administration.org debian-administration.org;
        access_log  /var/log/nginx/d-a.proxied.log;

        #
        # Serve directly:  /images/ + /css/ + /js/
        #
    location ^~ /(images|css|js) {
        root   /home/www/www.debian-administration.org/htdocs/;
        access_log  /var/log/nginx/d-a.direct.log ;
    }

    #
    # Serve directly: *.js, *.css, *.rdf,, *.xml, *.ico, & etc
    #
    location ~* \.(js|css|rdf|xml|ico|txt|gif|jpg|png|jpeg)$ {
        root   /home/www/www.debian-administration.org/htdocs/;
        access_log  /var/log/nginx/d-a.direct.log ;
    }


        #
        # Proxy all remaining content to Apache
        #
        location / {

            proxy_pass         http://127.0.0.1:8080/;
            proxy_redirect     off;

            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            client_max_body_size       10m;
            client_body_buffer_size    128k;

            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
}

Trong cấu hình này, thay vì chuyển hướng các yêu cầu đến static.domain.comvà mong muốn trình duyệt thực hiện một yêu cầu khác, nginx chỉ đơn giản phục vụ tệp từ đường dẫn cục bộ có liên quan. Nếu yêu cầu là động thì proxy sẽ khởi động và tìm nạp phản hồi từ máy chủ Apache (cục bộ hoặc từ xa) mà người dùng cuối không biết.

Tôi hy vọng điều đó sẽ giúp


Cảm ơn đã dành thời gian trả lời này. Tôi sẽ thiết lập một giàn thử nghiệm và xem nó hoạt động như thế nào. Điều quan trọng ở đây là chuyển tất cả nội dung tĩnh ra khỏi máy chủ Apache. Vì vậy, tôi đoán rằng tôi có thể chạy nginx trên máy chủ CDN và đã proxy_passđặt thành máy chủ Apache, vd proxy_pass http://172.16.3.1:80? tức là chúng tôi chuyển địa chỉ IP công cộng của trang web sang máy chủ nginx / CDN.
Kev

Đúng là đúng. Và không có probs - tôi cũng đang ngậm ngùi nginx và yêu nó.
Tak

Không quên câu trả lời của bạn :) Vẫn chưa có cơ hội để thử điều này.
Kev
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.