Ubah data yang diproksi dengan nginx on the fly

9

Saya memiliki pengaturan nginx yang menerima permintaan dari host eksternal dan proksi mereka ke server internal.

Konfigurasi terlihat seperti ini:

server {

        listen 10.0.0.66:443;

        server_name my.example.com;

        root /websites/my.example.com

        ssl on;
        ssl_certificate /websites/ssl/my.example.com.crt;
        ssl_certificate /websites/ssl/my.example.com.key;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;

        location / {
                proxy_pass https://10.0.0.100:3000/;
        }
}

Untuk tujuan percobaan / pengujian, saya ingin dapat menjalankan apa yang dijawab oleh host internal melalui biner yang arbitrer dan merespons dengan respons biner tersebut.

Sebagai contoh , jika saya ingin mengecilkan html pada proxy saya akan menjalankan respon server melalui htmlcompressor dan kemudian mengirim output sebagai respon proxy untuk klien. Hasil akhirnya akan menjadi klien akhir mendapatkan minified html kembali.

Saya tahu ada segala macam addons dan contoh untuk nginx untuk mencapai ini untuk data yang disajikan secara lokal, tetapi bagaimana cara mengaturnya untuk proxy?

0x6A75616E
sumber
Hanya untuk mengklarifikasi. Anda ingin nginx meneruskan permintaan ke server proksi, menerima balasan kembali, mengompresnya, lalu meneruskannya ke pengguna? Anda ingin nginx memprosesnya di tengah server dan pengguna?
sjdaws
@sjdaws, tidak perlu mengompresnya, tetapi jalankan melalui program sembarang dan gunakan output sebagai apa yang dikirim ke klien. Jadi intinya ya, saya ingin memodifikasi output dari server ke klien.
0x6A75616E

Jawaban:

10

Jadi, Anda ingin nginxmem-proksi permintaan dari klien ke server backend, dan kemudian, sebelum mengembalikan balasan backend ke klien, mengirim balasan seperti itu melalui prosesor eksternal lain?

Saya tidak berpikir Anda dapat melakukan hal di atas dengan nginxmodul resmi apa pun yang disediakan oleh Igor Sysoev dan Nginx, Inc saat ini. Hal terdekat yang tersedia untuk mengubah isi respons adalah beberapa modul filter yang datang bersama dengan nginx, tetapi dimatikan secara default, termasuk add_before_body, add_after_bodydan sub_filterarahan:

http://nginx.org/en/docs/http/ngx_http_addition_module.html
http://nginx.org/en/docs/http/ngx_http_sub_module.html

Juga, mungkin gzip on;apa yang sebenarnya Anda inginkan?

http://nginx.org/en/docs/http/ngx_http_gzip_module.html

Atau, berpotensi, jika Anda tahu perldan bersedia untuk menjalankan modul yang sama sekali eksperimental, lihatlah embedding perlke dalam nginx, dengan modul nginx resmi yang dimatikan secara default dan (agak jelas) benar-benar eksperimental:

http://nginx.org/en/docs/http/ngx_http_perl_module.html

Pilihan lain adalah dengan menggunakan semacam pengaturan Fast-CGI yang akan mengarahkan permintaan, di mana, pada gilirannya, script Fast-CGI Anda akan melakukan permintaan ke backend, dan kemudian pemrosesan akhir, sebelum kembali balasan kembali ke nginx ke cache dan kembali ke pengguna.

Ada juga proxy_set_body(tetapi fastcgi_set_bodybelum ada ), untuk mengubah isi permintaan (mis. Dari apa yang telah disediakan klien), tetapi tampaknya tidak ada arahan atau variabel yang setara untuk mendapatkan isi tanggapan, untuk lulus untuk permintaan entah bagaimana selanjutnya ke post-prosesor. Bagaimanapun, modul filter mungkin adalah apa yang Anda inginkan untuk post-prosesor.

(Juga, Anda benar-benar menyadari bahwa pendekatan naif untuk mengirim forkdan mengirim balasan melalui eksekutif reguler akan menjadi sangat lambat, kan?)

Untuk meringkas , saya pikir gzip on;persis apa yang Anda cari; lain, asalkan Anda dapat memodifikasi webapp asli, saya pikir taruhan terbaik Anda mungkin adalah menginstal semacam post-prosesor di dalam webapp itu sendiri, yang akan tampak seperti solusi termudah berikutnya secara keseluruhan. Secara potensial, Anda bisa melihat bagaimana modul filter diimplementasikan, misalnya ngx_http_addition_filter_module.c yang disebutkan di atas, ditambah beberapa filter yang lebih relevan seperti ngx_http_gzip_filter_module.c, dan terapkan modul filter yang Anda buat sendiri. Atau rekrut Nginx, Inc. untuk menulis ini untuk Anda! Tapi, serius, gzip on;hanya berfungsi, dan kemungkinan akan memberi Anda hasil yang lebih baik tanpa masalah, kinerja atau stabilitas masalah, dan itu sudah dikompilasi secara default, Anda hanya perlu mengaktifkannya dinginx.conf.

cnst
sumber
Terima kasih untuk balasan Anda! Saya menyadari gzip aktif dan apa yang saya coba capai adalah level yang lebih tinggi daripada mengempiskan output. Saya memiliki proxy yang mengontrol akses ke layanan web internal tertentu dan saya ingin dapat menambahkan hal-hal seperti analisis google ke output, semacam bagaimana cloudflare melakukannya. Seperti yang Anda katakan, sepertinya fastcgi adalah pilihan, jadi saya akan memeriksanya. Terima kasih lagi!
0x6A75616E
Jika Anda hanya ingin menambahkan hal-hal atau menambahkan google analytics, maka add_after_bodyatau sub_filteradalah apa yang Anda butuhkan. Contoh di nginx.org/en/docs/http/ngx_http_sub_module.html menunjukkan skenario itu: mengganti "</head>" dengan "</head> <script…". Anda mungkin harus mengkompilasi ulang nginx untuk mengaktifkan modul-modul tersebut (periksa nginx -Vbagaimana nginx Anda dikompilasi), tetapi mereka sudah menjadi modul standar.
cnst
Lihat modul subs_filter juga.
franzlorenzon