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?
nginx
reverse-proxy
0x6A75616E
sumber
sumber
Jawaban:
Jadi, Anda ingin
nginx
mem-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
nginx
modul 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, termasukadd_before_body
,add_after_body
dansub_filter
arahan: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
perl
dan bersedia untuk menjalankan modul yang sama sekali eksperimental, lihatlah embeddingperl
ke dalamnginx
, 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
(tetapifastcgi_set_body
belum 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
fork
dan 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
.sumber
add_after_body
atausub_filter
adalah 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 (periksanginx -V
bagaimana nginx Anda dikompilasi), tetapi mereka sudah menjadi modul standar.Saya pikir jika Anda ingin menjalankan kode arbitrer untuk meningkatkan output nginx, ... Anda dapat menulis skrip lua.
Cari "nginx lua".
(Contoh: http://www.londonlua.org/scripting_nginx_with_lua/slides.html?full#hello-lua )
sumber