Panduan Pasukan Lucee MY

nginx atau Apache di Hadapan Lucee/Tomcat

nginx atau Apache di hadapan Lucee: sambung ke Tomcat guna proxy_pass atau AJP, saji fail statik terus, dan tetapkan kepala X-Forwarded-* dengan betul.

nginx atau Apache di Hadapan Lucee/Tomcat
0
Kandungan

nginx atau Apache di Hadapan Lucee/Tomcat

Meletakkan nginx atau Apache di hadapan Lucee bermaksud pelayan web itu menerima permintaan HTTP daripada pelayar, menyajikan fail statik sendiri, dan menghantar hanya permintaan CFML ke Tomcat yang menjalankan Lucee. Pelayan hadapan inilah yang memegang sijil SSL, menambah kepala keselamatan, dan menyalurkan maklumat hos serta skema sebenar kepada aplikasi melalui kepala X-Forwarded-*. Tanpa lapisan ini, aplikasi CFML anda akan tersilap mengira IP pelawat, nama hos dan protokol, manakala Tomcat terdedah terus kepada internet.

Kenapa Perlu Pelayan Hadapan

Lucee berjalan di atas Tomcat, enjin servlet Java yang lazimnya mendengar pada port 8888. Port itu tidak direka untuk didedahkan terus kepada internet. Pelayan hadapan memberi empat perkara utama: penamatan SSL, penyajian fail statik yang jauh lebih pantas, penambahan kepala keselamatan seperti Content-Security-Policy, dan satu pintu masuk yang boleh anda kawal, log dan hadkan.

Dokumentasi rasmi Lucee menganggap pelayan web di hadapan sebagai cara biasa untuk pengeluaran. Pemasang Lucee pada Windows dan Linux mengesan IIS atau Apache yang sedia berjalan dan menyambungkannya secara automatik melalui mod_cfml dan penyambung Boncode. Untuk langkah pemasangan penuh, baca cara memasang Lucee.

Dua Cara Sambungan: HTTP proxy_pass atau AJP

Ada dua protokol untuk menghubungkan pelayan hadapan ke Tomcat. Pertama, HTTP biasa: pelayan hadapan bertindak sebagai proksi terbalik dan menghantar permintaan CFML ke port HTTP Tomcat. Kedua, AJP iaitu Apache JServ Protocol versi 1.3: protokol binari yang lebih padat antara pelayan web dan bekas servlet, lazimnya pada port 8009.

Perbezaan praktikal yang penting ialah AJP membawa maklumat skim, sama ada permintaan asal melalui HTTPS atau tidak, secara terbina dalam. HTTP proksi pula memerlukan anda menambah kepala X-Forwarded-Proto secara manual. Dokumentasi Lucee menyebut kelebihan mod_proxy_ajp ini secara jelas, tetapi turut mengingatkan bahawa modul AJP kadangkala sukar dipasang kerana tidak selalu tersedia dalam repositori sistem pengendalian.

nginx dengan proxy_pass ke Tomcat

nginx tidak mempunyai modul AJP terbina dalam, jadi laluan biasa untuk nginx ialah proksi HTTP. Konfigurasi minimum kelihatan seperti ini:

server {
    listen 80;
    server_name contoh.my;

    # fail statik disajikan terus oleh nginx
    location / {
        root /var/www/contoh/public_html;
        try_files $uri @lucee;
    }

    # permintaan CFML dihantar ke Tomcat
    location @lucee {
        proxy_pass http://127.0.0.1:8888;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Dua baris proxy_set_header Host dan X-Real-IP ialah corak rasmi yang ditunjukkan dalam dokumentasi modul ngx_http_proxy_module nginx. Satu perangkap besar di sini: secara lalai nginx tidak menghantar kepala Host asal kepada pelayan belakang, sebaliknya menetapkannya kepada nama hos pelayan belakang. Jika anda tidak menetapkan proxy_set_header Host $host, aplikasi Lucee akan melihat nama hos yang salah dan menjana pautan ke alamat dalaman.

Apache dengan mod_proxy dan mod_proxy_ajp

Untuk Apache, laluan HTTP ialah mod_proxy. Dokumentasi Lucee memberi corak ProxyPassMatch yang hanya menghantar fail CFML ke Tomcat dan membiarkan Apache menyajikan yang lain:

<IfModule mod_proxy.c>
    <Proxy *>
        Require ip 127.0.0.1
    </Proxy>
    ProxyPreserveHost On
    ProxyPassMatch ^/(.+\.cf[cm])(/.*)?$ http://127.0.0.1:8888/$1$2
    ProxyPassMatch ^/(.+\.cfml)(/.*)?$ http://127.0.0.1:8888/$1$2
    ProxyPassReverse / http://127.0.0.1:8888/
</IfModule>

Jika anda mahu kelebihan AJP iaitu pengesanan HTTPS terbina dalam, tukar sasaran kepada protokol ajp dan port 8009 seperti yang ditunjukkan dalam dokumentasi mod_proxy_ajp Apache:

ProxyPassMatch ^/(.+\.cf[cm])(/.*)?$ ajp://127.0.0.1:8009/$1$2
ProxyPassReverse / ajp://127.0.0.1:8009/

Nota keselamatan daripada dokumentasi Apache: sejak Tomcat 8.5.51 dan 9.0.31, penyambung AJP memerlukan rahsia secara lalai, dan parameter secret itu boleh ditambah pada hujung ProxyPass dalam Apache 2.4.42 dan kemudian. AJP tanpa rahsia yang terdedah kepada internet ialah risiko keselamatan yang diketahui dan pernah dieksploitasi.

Menyajikan Fail Statik Terus

Salah satu sebab terbesar meletakkan pelayan hadapan ialah prestasi. Fail imej, CSS dan JavaScript tidak perlu melalui JVM. nginx menyajikannya terus dari cakera dengan overhead yang jauh lebih rendah, manakala Apache melakukan perkara sama apabila ProxyPassMatch hanya memadankan sambungan CFML. Hasilnya, beban Tomcat turun dan masa tindak balas fail statik naik mendadak.

Corak try_files dalam contoh nginx menyemak dahulu sama ada fail wujud dalam webroot, dan hanya menghantar ke Lucee jika tidak. Ini juga bermakna anda mesti memastikan fail sensitif seperti .cfc atau folder WEB-INF tidak boleh diakses terus, kerana pelayan hadapan kini menjadi lapisan yang mendedahkan fail statik. Rujuk panduan keselamatan web untuk amalan penapisan fail.

Pelayan hadapan juga tempat semula jadi untuk menetapkan kepala cache bagi fail statik, contohnya tempoh tamat untuk imej dan aset supaya pelayar tidak memuat semula fail yang tidak berubah. Lucee boleh melakukan ini, tetapi membiarkan nginx mengendalikannya menjauhkan permintaan statik daripada JVM sama sekali, dan itu penjimatan yang nyata apabila laman anda banyak bergantung pada aset.

Kepala X-Forwarded-* dan Kenapa Ia Penting

Apabila permintaan melalui proksi, Tomcat melihat IP pelayan hadapan sebagai alamat pelawat, dan tidak tahu sama ada permintaan asal melalui HTTPS. Kepala X-Forwarded-* membetulkan perkara ini. X-Forwarded-For membawa senarai alamat IP asal pelawat, X-Forwarded-Proto membawa skim http atau https yang dilihat pelayar, dan X-Forwarded-Host membawa hos asal yang diminta.

Tanpa kepala ini, fungsi cgi.server_name, cgi.https dan cgi.remote_addr dalam CFML anda akan menunjukkan nilai pelayan belakang, bukan nilai sebenar pelawat. Ini merosakkan penjanaan URL mutlak, ubah hala, kuki selamat dan log akses. Kesannya senyap tetapi meluas, jadi kepala ini mesti ditetapkan dan aplikasi mesti mempercayainya hanya daripada proksi anda, bukan daripada sebarang pelawat yang boleh menyuntik kepala palsu.

Perangkap Biasa dan Cara Elak

Perangkap paling kerap ialah kepala Host yang hilang atau salah, yang menyebabkan aplikasi menjana pautan ke nama hos dalaman. Perangkap kedua ialah laluan salah: jika ProxyPassMatch atau location tidak sepadan dengan struktur folder, permintaan CFML jatuh ke pelayan hadapan dan kembali sebagai 404, atau lebih teruk, mendedahkan kod sumber. Perangkap ketiga ialah lupa menetapkan X-Forwarded-Proto, sehingga aplikasi menganggap semua trafik HTTP dan mengeluarkan kuki tanpa atribut Secure.

Bagi yang menggunakan mod_cfml, banyak konfigurasi ini diurus secara automatik, jadi anda tidak perlu mengulanginya untuk setiap laman. Butiran penuh ada dalam artikel melayani banyak domain dengan mod_cfml. Jika anda menjalankan Lucee dalam bekas, corak proksi ini juga terpakai, seperti yang dibincangkan dalam deploy Lucee dengan Docker.

WebSocket dan Masa Tamat

Aplikasi CFML yang menggunakan WebSocket atau permintaan yang lama perlu penalaan tambahan. Proksi HTTP perlu menaikkan masa tamat baca dan mengekalkan sambungan naik, jika tidak sambungan panjang akan diputuskan di tengah jalan. nginx menyediakan arahan proxy_read_timeout untuk tujuan ini, manakala Apache menggunakan ProxyTimeout. Tanpa ini, ciri masa nyata akan gagal secara berselang, satu gejala yang sukar dikesan kerana ia hanya muncul pada beban rendah atau sambungan yang perlahan.

Penamatan SSL dan HTTP/2

Pelayan hadapan ialah tempat semula jadi untuk menamatkan TLS. Anda meletakkan sijil pada nginx atau Apache, dan trafik antara pelayan hadapan dengan Tomcat kekal dalaman melalui sambungan setempat yang tidak perlu disulitkan semula. Ini memudahkan pembaharuan sijil kerana anda hanya mengurusnya di satu tempat, dan membolehkan HTTP/2 dihidupkan pada pelayan hadapan untuk memuatkan aset dengan lebih pantas.

Apabila TLS ditamatkan di hadapan, aplikasi Lucee tidak akan melihat HTTPS melainkan skim itu disalurkan semula, sama ada melalui AJP yang membawanya secara terbina dalam atau melalui kepala X-Forwarded-Proto yang anda tetapkan. Sebab itu pengesanan skim dan penamatan SSL tidak boleh dianggap dua perkara berasingan, dan lupa menghubungkan keduanya ialah punca klasik kuki selamat dan ubah hala yang rosak.

Jadual Perbandingan Sambungan

KaedahProtokolPengesanan HTTPSNota jujur
mod_proxy (Apache)HTTPPerlu X-Forwarded-ProtoPaling mudah, modul biasa
mod_proxy_ajp (Apache)AJP13Terbina dalamKadang sukar dipasang
mod_jk (Apache)AJP13Terbina dalamPerlu kompilasi sendiri
proxy_pass (nginx)HTTPPerlu X-Forwarded-ProtoTiada AJP terbina dalam
mod_cfmlIkut pelayanAutomatikKonfigurasi laman automatik

Soalan Lazim (FAQ)

Adakah nginx atau Apache lebih baik di hadapan Lucee?

Kedua-duanya berfungsi dengan baik. nginx lebih ringan untuk fail statik dan konfigurasi proksi mudah, manakala Apache mempunyai laluan AJP yang matang melalui mod_proxy_ajp dan mod_jk. Pilih yang anda sudah selesa urus dan selenggara.

Bagaimana cara menyambung nginx ke Lucee melalui AJP?

nginx tidak mempunyai modul AJP terbina dalam, jadi anda menyambung melalui HTTP proxy_pass. Jika AJP wajib untuk keperluan anda, guna Apache dengan mod_proxy_ajp, atau nilaikan modul AJP pihak ketiga untuk nginx dengan teliti sebelum memakainya dalam pengeluaran.

Kenapa aplikasi saya nampak IP pelayan dan bukannya IP pelawat?

Kerana kepala X-Forwarded-For tidak ditetapkan atau aplikasi tidak mempercayainya. Tetapkan proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for pada nginx dan pastikan aplikasi membaca IP hanya daripada kepala yang datang daripada proksi anda.

Bagaimana cara memastikan Lucee tahu permintaan melalui HTTPS?

Guna mod_proxy_ajp yang membawa skim secara terbina dalam, atau tambah X-Forwarded-Proto $scheme pada proksi HTTP dan pastikan aplikasi mempercayai kepala itu hanya daripada proksi anda.

Bolehkah saya menjalankan Lucee tanpa pelayan hadapan?

Boleh untuk pembangunan tempatan, tetapi untuk pengeluaran anda mahukan penamatan SSL, penyajian fail statik dan kepala keselamatan yang disediakan pelayan hadapan. Mendedahkan Tomcat terus ke internet tidak digalakkan.

Sumber

0 komen

Log masuk untuk menjawab atau memberi komen.

Log masuk