Tutorial ini menunjukkan bagaimana Anda dapat mengatur nginx sebagai proxy terbalik di depan server web Apache2 di Ubuntu 16.04. nginx (diucapkan "engine x") adalah server HTTP gratis, open-source, berkinerja tinggi. nginx dikenal dengan stabilitasnya, rangkaian fitur yang kaya, konfigurasi sederhana, dan konsumsi sumber daya yang rendah.
1 Catatan Awal
Dalam tutorial ini, saya menggunakan hostname server1.example.com dengan alamat IP 192.168.1.100. Setelan ini mungkin berbeda untuk Anda, jadi Anda harus menggantinya jika perlu.
Saya berasumsi bahwa Anda memiliki Apache vhost (saya akan menggunakan vhost default Apache dalam tutorial ini) yang mendengarkan pada port 80 pada alamat IP 192.168.1.100 yang ingin Anda proksi melalui nginx. Saya akan menggunakan tutorial Ubuntu LAMP sebagai dasarnya. Harap diperhatikan bahwa tutorial ini hanya mencakup http, bukan https (SSL).
2 Konfigurasi Apache
Hal pertama yang harus kita lakukan adalah mengkonfigurasi Apache vhost kita untuk mendengarkan di localhost (127.0.0.1) pada port yang tidak digunakan selain 80 (misalnya 8000). Buka /etc/apache2/ports.conf...
nano /etc/apache2/ports.conf
... dan ubah baris NameVirtualHost dan Listen untuk port 80 agar menggunakan port 8000:
# Jika Anda hanya mengubah port atau menambahkan lebih banyak port di sini, kemungkinan besar Anda juga
# harus mengubah pernyataan VirtualHost di
# /etc/apache2/sites-enabled/000-default. conf
Dengarkan 8000
Dengarkan 443
Dengarkan 443
Selanjutnya buka file konfigurasi vhost (mis. /etc/apache2/sites-available/000-default.conf)...
nano /etc/apache2/sites-available/000-default.conf
... dan ubah baris
[...]
Kami akan mengkonfigurasi nginx sebagai proxy transparan, yaitu, itu akan meneruskan alamat IP pengguna asli di bidang yang disebut X-Forwarded-For ke backend Apache. Tentu saja, Apache backend harus mencatat alamat IP pengguna asli di log akses mereka alih-alih alamat IP nginx (127.0.0.1). Ada dua cara untuk mencapai ini:
1) Kita dapat memodifikasi baris LogFormat di /etc/apache2/apache2.conf dan mengganti %h dengan %{X-Forwarded-For}i:
nano /etc/apache2/apache2.conf
[...]#LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" " gabunganLogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" gabungan[...]
2) Di Debian/Ubuntu, kita dapat menginstal modul Apache libapache2-mod-rpaf yang menangani pencatatan alamat IP yang benar:
apt-get -y install libapache2-mod-rpaf
Setelah semua perubahan ini, mulai ulang Apache:
layanan apache2 restart
3 Konfigurasi nginx
Jika nginx belum terinstal, instal sebagai berikut:
apt-get -y install nginx
Buat tautan startup sistemnya dan pastikan sudah dimulai:
systemctl aktifkan nginx.service
service nginx restart
Seharusnya sekarang mendengarkan di port 80.
Beberapa parameter proxy standar ada di file /etc/nginx/proxy_params:
nano /etc/nginx/proxy_params
proxy_set_header Host $http_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;Karena kami akan menyertakan file itu nanti di bagian proxy dari nginx vhost kami untuk example.com, Anda mungkin ingin menambahkan arahan proxy lebih lanjut ke file itu jika Anda mau, mis. sebagai berikut:
proxy_set_header Host $http_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-Proxy_client $scheme_max; client_body_buffer_size 1m;proxy_intercept_errors aktif;proxy_buffering aktif;proxy_buffer_size 128k;proxy_buffers 256 16k;proxy_busy_buffers_size 256k;proxy_temp_file_write_size 256k;proxy_max_temp_file_size 0;proxy_read_timeout 300; Sekarang ubah vhost default untuk nginx - pastikan vhost menggunakan root dokumen yang sama dengan vhost Apache untuk example.com (mis. /var/www/html) sehingga nginx dapat mengirimkan file statis secara langsung tanpa meneruskan permintaan ke Apache:nano /etc/nginx/sites-available/defaultserver {
mendengarkan 80 default_server;
mendengarkan [::]:80 default_server;
root /var/www/html;
# Tambahkan index.php ke daftar jika Anda menggunakan PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
lokasi / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
}
}Ini adalah konfigurasi yang sangat sederhana yang akan mem-proxy semua permintaan ke Apache.
Muat ulang nginx agar perubahan diterapkan:
layanan nginx reloadSekarang Anda dapat mengetik nama host server atau IP 192.168.1.100 ke dalam browser, dan Anda akan melihat situs web default Apache, tetapi kali ini dikirimkan melalui nginx.
Seperti yang saya katakan sebelumnya, ini adalah konfigurasi yang sangat sederhana yang mem-proxy semua permintaan ke Apache. Tetapi karena nginx jauh lebih cepat mengirimkan file statis (seperti JavaScript, CSS, gambar, file PDF, file HTML statis, dll.) daripada Apache, sebaiknya biarkan nginx menyajikan file-file ini secara langsung. Ini dapat dilakukan dengan menambahkan lokasi baru untuk file-file ini, mis. sebagai berikut:
server { mendengarkan 80 default_server;
mendengarkan [::]:80 default_server;
root /var/www/html;
# Tambahkan indeks. php ke daftar jika Anda menggunakan PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} lokasi ~* \.(js|css|jpg|jpeg|gif|png|svg| ico|pdf|html|htm)$ { }}Muat ulang nginx:
layanan nginx reloadAnda bahkan dapat mengatur header HTTP Kedaluwarsa untuk file-file ini sehingga browser akan menyimpan file-file ini (lihat Membuat File Statis Cache Browser Di nginx untuk detail lebih lanjut):
server { mendengarkan 80 default_server;
mendengarkan [::]:80 default_server;
root /var/www/html;
# Tambahkan indeks. php ke daftar jika Anda menggunakan PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} lokasi ~* \.(js|css|jpg|jpeg|gif|png|svg| ico|pdf|html|htm)$ { berakhir 30 hari; }}Sekarang kita dapat melakukan penyiapan ini selangkah lebih maju dengan membiarkan nginx melayani permintaan sebanyak yang dapat dipenuhi dan hanya meneruskan permintaan yang tersisa ditambah file PHP ke Apache:
server { mendengarkan 80 default_server;
mendengarkan [::]:80 default_server;
root /var/www/html;
# Tambahkan indeks. php ke daftar jika Anda menggunakan PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} lokasi ~* \.(js|css|jpg|jpeg|gif|png|svg| ico|pdf|html|htm)$ { berakhir 30 hari; } lokasi @proxy { proxy_pass http://127.0.0.1:8000; sertakan /etc/nginx/proxy_params; } lokasi ~* \.php$ { proxy_pass http://127.0.0.1:8000; sertakan /etc/nginx/proxy_params; }}Muat ulang nginx:
layanan nginx reloadTentu saja, Anda dapat menyempurnakan pengaturan ini lebih jauh lagi, misalnya dengan menggunakan nginx proxy_cache (jika aplikasi Anda mengizinkannya - misalnya, Anda harus memastikan bahwa captcha atau keranjang belanja tidak di-cache, dan pengguna yang masuk selalu dapatkan salinan halaman baru) atau jika aplikasi Anda memiliki cache halaman penuh - nginx dapat mengakses cache halaman penuh secara langsung dalam kasus seperti itu (Anda dapat menemukan contoh dalam tutorial ini:Cara Mempercepat Drupal 7.7 Dengan Boost Dan nginx (Debian Squeeze)).
4 Tautan
- nginx:http://nginx.net/
- Apache:http://httpd.apache.org/
- Ubuntu:http://www.ubuntu.com/