Nginx proxy lulus untuk membalikkan proxy

Sep 11 2020

Saya cukup baru mengenal nginx dan terjebak dengan konfigurasi saat ini.

Saya juga memeriksa ssl - nginx tidak mengarahkan , nginx sebagai proxy untuk aplikasi web , nginx proxy_pass , menulis ulang proxy nginx dan posting lain terkait dengan pertanyaan saya .

Saya juga melihat ke beberapa postingan lain yang tidak membantu saya saat ini. Saya tidak membaca kira-kira 21500 posting seputar topik nginxdan proxy.

Google juga gagal mengarahkan saya ke solusinya.

Penyiapan saat ini adalah:

[CMS (Plone in LAN)]<--->[Reverse-Proxy (Apache / http://oldsite.foo)]

Ini adalah penyiapan situs lama. Pada dasarnya kita membutuhkan desain ulang CMS. Tapi itu telah berkembang dengan banyak ketergantungan dan modul yang ditulis sendiri oleh setidaknya dua pengembang (yang tidak pernah bertemu satu sama lain). Ini akan menjadi tugas selama satu tahun untuk menggantinya dengan benar. Ada juga beberapa hal aneh di konfigurasi Apache, jadi kami tidak dapat menghindari penggunaan Apache saat ini.

Sayangnya kami membutuhkan desain ulang optik secepat kami bisa.

Jadi kami datang dengan ide untuk menggunakan Diazo / XSLT di Nginx untuk mendesain ulang situs lama dan menunjukkan beberapa hasil kepada penilai kami.

Oleh karena itu saya mencoba pengaturan berikut:

[Plone]<--->[Apache]<--->[Proxy (XSLT in Nginx / https://newsite.foo)]

Ini xslt_for_oldsitefile konfigurasi saya (Kontrol-Cache hanya dinonaktifkan untuk debugging):

add_header Cache-Control no-cache;

server {
  server_name newsite.foo;
  server_tokens off;

  listen b.b.b.b:80;

  return 301 https://$server_name$request_uri;

  access_log /var/log/nginx/newsite.port80.access.log;
  error_log /var/log/nginx/newsite.port80.error.log;
}

server {
  server_name newsite.foo;
  server_tokens off;

  listen b.b.b.b:443 ssl;

  access_log /var/log/nginx/newsite.port443.access.log;
  error_log /var/log/nginx/newsite.port443.error.log;

  ssl_certificate /etc/ssl/certs/nginx.crt;
  ssl_certificate_key /etc/ssl/private/nginx.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers HIGH:!aNULL:!MD5:!ADH:!AECDH;
  ssl_session_cache shared:SSL:5m;

  proxy_http_version 1.1;

  #proxy_set_header X-Forwarded-Host $host:$server_port;
  #proxy_set_header X-Forwarded-Server $host; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#  proxy_set_header Connection "";
#  proxy_ignore_headers Expires;

#  proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-forwarded-host $host;

  sub_filter_types *;
  sub_filter_once off;
  sub_filter "http://oldsite.foo" "https://newsite.foo";

  location / {
    proxy_pass http://oldsite.foo/;
    proxy_redirect off;
    #proxy_redirect http://oldsite.foo/ https://newsite.foo/;
    proxy_set_header Host $host;
  }
}

Jika saya memulai browser untuk menyambungkan http://oldsite.foo lalu dimuat:

  • 1 dokumen HTML dari situs lama
  • 3 file CSS dari situs lama
  • 9 file JS dari situs lama
  • 10 file grafik dari situs lama

Tetapi jika saya menggunakan browser saya untuk mendapatkan https://newsite.foo lalu dimuat:

  • 1 dokumen HTML dari situs baru
  • hanya 5 file grafik dari situs lama (permintaan langsung dari browser saya)
  • segala sesuatu yang lain hilang

Meskipun dokumen HTML yang diterima dengan wget https://newsite.foo -o index.htmlmemiliki semua tautan yang dimodifikasi menjadi https://newsite.foo(diganti http://oldsite.foodengan benar https://newsite.foo), browser menampilkan semua tautan yang tidak dimodifikasi: http://oldsite.foobukan https://newsite.foo.

Saya mendapatkan header server berikut dengan curl -I https://newsite.foo:

HTTP/1.1 200 OK
Server: nginx
Date: Fri, 11 Sep 2020 10:28:15 GMT
Content-Type: text/html
Connection: keep-alive
Accept-Ranges: none
Accept-Ranges: bytes
X-Varnish: 1216306480
Age: 0
Via: 1.1 varnish
Set-Cookie: I18N_LANGUAGE="de"; Path=/
Via: 1.1 oldsite.foo
Vary: Accept-Encoding
Cache-Control: no-cache

Saya bermain-main dengan add_header, proxy_set_headerdan proxy_redirect. Saya juga mencoba

location ~* .* {
  proxy_pass http://oldsite.foo$request_uri;
  proxy_redirect off;
  proxy_set_header Host $host;
}

tetapi tidak ada perubahan saya yang mengubah perilaku nginx yang mengarahkan permintaan GET ke http://oldsite.foo dan menunjukkan jawaban seolah-olah itu berasal https://newsite.foo .

Saya tidak punya jawaban untuk pertanyaan ini:

  • Mengapa browser saya terus terhubung ke http://oldsite.foo? Ini harus terhubung kehttps://newsite.foo .
  • Mengapa tautan di HTML berbeda antara versi dari wgetdan browser saya?
  • Mengapa lebih dari separuh situs web tidak menjangkau peramban https://newsite.foo?
  • Bagaimana cara memperbaikinya?

Apakah ada orang di luar sana yang dapat mengarahkan saya ke arah yang benar?

Terima kasih sebelumnya. Setidaknya terima kasih telah membaca postingan saya.

Salam Hormat.

Jawaban

choogeoh Sep 15 2020 at 13:11

Sementara itu saya menemukan solusinya.

Apache mengirim data dalam bentuk gzip dan sub_filter tidak dapat menanganinya (lihat dokumentasi resmi: sub_filter ).

Memang saya mencoba menghindari ini dengan menggunakan proxy_set_header Accept-Encoding "";tetapi tidak berhasil. Alasannya, bagian ini harus diatur dalam konteks lokasi .

Karenanya konfigurasi yang benar untuk Ubuntu 20.04 LTS, Nginx 1.14.0 pada saat penulisan (2020-09-15) adalah:

...
server {
  server_name newsite.foo;
  server_tokens off;
  
  listen b.b.b.b:443 ssl;

  access_log /var/log/nginx/newsite.port443.access.log;
  error_log /var/log/nginx/newsite.port443.error.log;

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

  # Double check and modify this part BEFORE using in production:
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers HIGH:!aNULL:!MD5:!ADH:!AECDH;
  ssl_session_cache shared:SSL:5m;

location / {
  proxy_http_version 1.1;
  proxy_set_header Accept-Encoding "";  # MUST be written HERE in this context!
  proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr;
  proxy_pass http://oldsite.foo;
  proxy_redirect off;
  sub_filter_types text/html text/css text/javascript;  # If unsure you may use '*'
  sub_filter_once off;
  sub_filter http://oldsite.foo https://newsite.foo;
}
...

Terima kasih kepada adrianTNT yang menunjukkan bagian penting bagi saya (lihat detail yang hilang ).