Apache отбрасывает заголовок ETag при использовании Nginx в ProxyPass - PullRequest
0 голосов
/ 21 февраля 2019

Добрый день всем.Я только заметил довольно странное поведение при использовании ProxyPass из Apache в Nginx, позвольте мне продемонстрировать и спросить, сталкивался ли кто-нибудь с чем-то похожим ..

Минимальная настройка выглядит следующим образом:

Apache:

LogLevel trace6

SSLProxyEngine On
SSLProxyCheckPeerName Off
SSLProxyCheckPeerCN Off

<LocationMatch "\.js$">
    ProxyPassMatch https://static-assets.dev.com:4430
    ProxyPassReverse https://static-assets.dev.com:4430
</LocationMatch>

Nginx:

server {
    listen *:4430 default_server ssl;

    ssl_certificate     /etc/nginx/ssl/ssl.crt;
    ssl_certificate_key /etc/nginx/ssl/ssl.key;

    server_name static-assets.dev.com;

    root /assets;

    etag on;
    gzip off;

    server_tokens off;

    add_header X-Hi-From-Nginx $sent_http_etag;

    location / {
        try_files $uri $uri/ =404;
    }
}

Затем в журнале Apache я вижу это:

[Thu Feb 21 14:49:18.762737 2019] [proxy_http:trace3] [pid 895:tid 139989845219072] mod_proxy_http.c(1424): [client 172.17.0.1:40486] Status from backend: 200
[Thu Feb 21 14:49:18.762744 2019] [proxy_http:trace4] [pid 895:tid 139989845219072] mod_proxy_http.c(1099): [client 172.17.0.1:40486] Headers received from backend:
[Thu Feb 21 14:49:18.762749 2019] [proxy_http:trace4] [pid 895:tid 139989845219072] mod_proxy_http.c(1101): [client 172.17.0.1:40486] Server: nginx
[Thu Feb 21 14:49:18.762752 2019] [proxy_http:trace4] [pid 895:tid 139989845219072] mod_proxy_http.c(1101): [client 172.17.0.1:40486] Date: Thu, 21 Feb 2019 06:49:18 GMT
[Thu Feb 21 14:49:18.762759 2019] [proxy_http:trace4] [pid 895:tid 139989845219072] mod_proxy_http.c(1101): [client 172.17.0.1:40486] Content-Type: application/javascript
[Thu Feb 21 14:49:18.762762 2019] [proxy_http:trace4] [pid 895:tid 139989845219072] mod_proxy_http.c(1101): [client 172.17.0.1:40486] Content-Length: 1130146
[Thu Feb 21 14:49:18.762765 2019] [proxy_http:trace4] [pid 895:tid 139989845219072] mod_proxy_http.c(1101): [client 172.17.0.1:40486] Last-Modified: Mon, 18 Feb 2019 05:11:04 GMT
[Thu Feb 21 14:49:18.762768 2019] [proxy_http:trace4] [pid 895:tid 139989845219072] mod_proxy_http.c(1101): [client 172.17.0.1:40486] Connection: keep-alive
[Thu Feb 21 14:49:18.762771 2019] [proxy_http:trace4] [pid 895:tid 139989845219072] mod_proxy_http.c(1101): [client 172.17.0.1:40486] ETag: "5c6a3e68-113ea2"
[Thu Feb 21 14:49:18.762773 2019] [proxy_http:trace4] [pid 895:tid 139989845219072] mod_proxy_http.c(1101): [client 172.17.0.1:40486] X-Hi-From-Nginx: "5c6a3e68-113ea2"
[Thu Feb 21 14:49:18.762776 2019] [proxy_http:trace4] [pid 895:tid 139989845219072] mod_proxy_http.c(1101): [client 172.17.0.1:40486] Accept-Ranges: bytes
[Thu Feb 21 14:49:18.762783 2019] [proxy_http:trace3] [pid 895:tid 139989845219072] mod_proxy_http.c(1695): [client 172.17.0.1:40486] start body send

[Thu Feb 21 14:49:18.762837 2019] [http:trace3] [pid 895:tid 139989845219072] http_filters.c(1129): [client 172.17.0.1:40486] Response sent with status 200, headers:
[Thu Feb 21 14:49:18.762841 2019] [http:trace5] [pid 895:tid 139989845219072] http_filters.c(1136): [client 172.17.0.1:40486]   Date: Thu, 21 Feb 2019 06:49:18 GMT
[Thu Feb 21 14:49:18.762844 2019] [http:trace5] [pid 895:tid 139989845219072] http_filters.c(1139): [client 172.17.0.1:40486]   Server: nginx
[Thu Feb 21 14:49:18.762847 2019] [http:trace4] [pid 895:tid 139989845219072] http_filters.c(958): [client 172.17.0.1:40486]   Content-Type: application/javascript
[Thu Feb 21 14:49:18.762849 2019] [http:trace4] [pid 895:tid 139989845219072] http_filters.c(958): [client 172.17.0.1:40486]   Content-Length: 1130146
[Thu Feb 21 14:49:18.762852 2019] [http:trace4] [pid 895:tid 139989845219072] http_filters.c(958): [client 172.17.0.1:40486]   Last-Modified: Mon, 18 Feb 2019 05:11:04 GMT
[Thu Feb 21 14:49:18.762854 2019] [http:trace4] [pid 895:tid 139989845219072] http_filters.c(958): [client 172.17.0.1:40486]   X-Hi-From-Nginx: \\"5c6a3e68-113ea2\\"
[Thu Feb 21 14:49:18.762857 2019] [http:trace4] [pid 895:tid 139989845219072] http_filters.c(958): [client 172.17.0.1:40486]   Accept-Ranges: bytes
[Thu Feb 21 14:49:18.762859 2019] [http:trace4] [pid 895:tid 139989845219072] http_filters.c(958): [client 172.17.0.1:40486]   Vary: Accept-Encoding

Так что в основном он отбрасывает заголовок ETag, однако мой пользовательский X-Hi-FromЗаголовок -Nginx с тем же значением передается без проблем.Я читал, что Nginx может иметь некоторые проблемы с ETag, когда gzip включен, однако отключение ничего не улучшает.И на самом деле ясно, что проблема на стороне Apache, поскольку Nginx отправляет все заголовки, как и ожидалось.

Вот программное обеспечение, которое я использую (через Docker):

root@7ac07b106612:/bootstrap# nginx -v
nginx version: nginx/1.10.3 (Ubuntu)
root@7ac07b106612:/bootstrap# apache2ctl -v
Server version: Apache/2.4.18 (Ubuntu)
Server built:   2018-06-07T19:43:03

Обновление на следующий день ..

Мне действительно удалось установить еще один пользовательский заголовок, используя выражение следующим образом:

Header always set X-Apache-ETag "expr=%{resp:x-nginx-etag}"
Header always set ETag "expr=%{resp:x-nginx-etag}"

Однако он устанавливает только заголовок "X-Apache-ETag", в то время как ETag все еще отбрасывается.Это начинает выглядеть как какая-то ошибка ..

> GET /dist/js/vendor.js HTTP/1.1
> Host: dev.com
> User-Agent: curl/7.53.0
> Accept: */*
> Accept-encoding: br
>
{ [5 bytes data]
< HTTP/1.1 200 OK
< Date: Fri, 22 Feb 2019 04:55:10 GMT
< Server: nginx
< X-Apache-ETag: "5c6f3469-4ad21"
< Content-Type: application/javascript
< Content-Length: 306465
< Last-Modified: Thu, 21 Feb 2019 23:29:45 GMT
< X-Nginx-Etag: "5c6f3469-4ad21"
< Accept-Ranges: bytes
< Vary: Accept-Encoding

Обновление № 2.Немного подробнее ... Я увидел надпись "http_filters.c" рядом с "Ответ отправлен со статусом 200, заголовки:", поэтому я начал поиск источника этого файла в Google.И здесь - вот что я нашел:

/*
 * Now remove any ETag response header field if earlier processing
 * says so (such as a 'FileETag None' directive).
 */
if (apr_table_get(r->notes, "no-etag") != NULL) {
    apr_table_unset(r->headers_out, "ETag");
}

Не уверен, почему это условие срабатывает, поскольку у меня нет ни одного "FileETag None" в моих конфигах.И даже если я добавлю «FileETag MTime Size», это не поможет.

1 Ответ

0 голосов
/ 22 февраля 2019

Обновление # 3 ..

Я полагал, что это было вызвано загруженным модулем "include".Он имеет определенную директиву SSIETag , которая по умолчанию имеет значение "Выкл." - на основе описания, которое приводит к примечаниям "no-etag" и к исчезновению заголовка в конечном итоге.

Установка«Вкл» в контексте не очень помогает, однако отключение модуля «включить» полностью помогает, так что это виновник.

...