Saya telah menjalankan nginx dan menjalankan aplikasi Ruby / Sinatra dan semuanya baik-baik saja. Namun, sekarang saya mencoba menjalankan aplikasi kedua dari server yang sama dan saya melihat sesuatu yang aneh. Pertama, inilah nginx.conf saya:
pid /tmp/nginx.pid;
error_log /tmp/nginx.error.log;
events {
worker_connections 1024;
accept_mutex off;
}
http {
default_type application/octet-stream;
access_log /tmp/nginx.access.log combined;
sendfile on;
tcp_nopush on;
tcp_nodelay off;
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 500;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/xml text/css
text/comma-separated-values
text/javascript application/x-javascript
application/atom+xml;
upstream app {
server unix:/var/www/app/tmp/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 80;
client_max_body_size 4G;
server_name FAKE.COM;
keepalive_timeout 5;
root /var/www/app/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app;
break;
}
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /var/www/app/public;
}
}
}
68,0-1 B
Perhatikan bagaimana server_name
diatur agar FAKE.COM
server merespons semua host yang mengunjungi server itu melalui nama domain lain. Bagaimana saya bisa membuat server tertentu hanya menanggapi permintaan FAKE.COM
?
listen fake.com | something.com:80
perintah filter, tidakserver_name
.Jawaban:
Blok server pertama dalam konfigurasi nginx adalah default untuk semua permintaan yang masuk ke server yang tidak memiliki blok server spesifik.
Jadi di konfigurasi Anda, dengan asumsi domain asli Anda adalah REAL.COM, ketika pengguna mengetik itu, itu akan menyelesaikan ke server Anda, dan karena tidak ada blok server untuk pengaturan ini, blok server untuk FAKE.COM, menjadi yang pertama blok server (hanya blok server dalam kasus Anda), akan memproses permintaan itu.
Inilah sebabnya mengapa konfigurasi Nginx yang tepat memiliki blok server khusus untuk default sebelum mengikuti dengan yang lain untuk domain tertentu.
dll
** EDIT **
Tampaknya beberapa pengguna agak bingung dengan contoh ini dan menganggapnya terbatas pada satu file conf, dll.
Harap dicatat bahwa di atas adalah contoh sederhana untuk mengembangkan OP sesuai kebutuhan.
Saya pribadi menggunakan file conf vhost terpisah dengan ini (CentOS / RHEL):
/etc/nginx/conf.d/
akan berisi domain_1.conf, domain_2.conf ... domain_n.conf yang akan dimasukkan setelah blok server di file nginx.conf utama yang akan selalu menjadi yang pertama dan akan selalu menjadi default kecuali jika diganti dengan default_server direktif di tempat lain.Urutan abjad dari nama file dari file conf untuk server lain menjadi tidak relevan dalam kasus ini.
Selain itu, pengaturan ini memberikan banyak fleksibilitas karena dimungkinkan untuk menentukan beberapa default.
Dalam kasus khusus saya, saya meminta Apache mendengarkan pada Port 8080 hanya pada antarmuka internal dan saya mem-proxy PHP dan skrip Perl ke Apache.
Namun, saya menjalankan dua aplikasi terpisah yang keduanya mengembalikan tautan dengan ": 8080" di output html yang terpasang saat mereka mendeteksi bahwa Apache tidak berjalan pada Port standar 80 dan mencoba untuk "membantu" saya.
Ini menyebabkan masalah di mana tautan menjadi tidak valid karena Apache tidak dapat dijangkau dari antarmuka eksternal dan tautan harus mengarah ke Port 80.
Saya menyelesaikan ini dengan membuat server default untuk Port 8080 untuk mengalihkan permintaan tersebut.
Karena tidak ada blok server biasa yang mendengarkan di Port 8080, blok server default redirect secara transparan menangani permintaan tersebut berdasarkan posisinya di nginx.conf.
Saya sebenarnya memiliki empat blok server seperti itu dan ini adalah kasus penggunaan yang disederhanakan.
sumber
Anda harus memiliki server default untuk menangkap semua , Anda dapat kembali
404
atau lebih baik untuk tidak merespons sama sekali (akan menghemat beberapa bandwidth) dengan mengembalikan444
yang merupakan respons HTTP khusus nginx yang hanya menutup koneksi dan tidak mengembalikan apa-apasumber
server_name _;
saya tidak ada di versi sebelumnya untuk nginx, tapi itu bekerja. Sekarang untuk versi nginx yang lebih baru sepertinya Anda membutuhkan fileserver_name _;
. Terima kasih444
, dan saya akan menemukan solusi yang jauh lebih bersih daripada mengembalikan kode kesalahan.Saya tidak dapat menyelesaikan masalah saya dengan salah satu jawaban lainnya. Saya menyelesaikan masalah dengan memeriksa untuk melihat apakah tuan rumah cocok dan mengembalikan 403 jika tidak. (Saya memiliki beberapa situs web acak yang menunjuk ke konten server web saya. Saya menduga untuk membajak peringkat pencarian)
sumber
Untuk menjawab pertanyaan Anda - nginx memilih server pertama jika tidak ada yang cocok. Lihat dokumentasi :
Sekarang, jika Anda ingin memiliki server penampung semua default yang, katakanlah, merespons dengan 404 ke semua permintaan, berikut cara melakukannya:
Perhatikan bahwa Anda perlu menentukan sertifikat / kunci (yang dapat ditandatangani sendiri), jika tidak, semua koneksi SSL akan gagal karena nginx akan mencoba menerima koneksi menggunakan default_server ini dan tidak akan menemukan sertifikat / kunci.
sumber
server_name _;
bahkan tidak diperlukan.Ada beberapa cara untuk menentukan server default.
Cara pertama - Tentukan server default terlebih dahulu dalam daftar, jika Anda menyimpan konfigurasi server Anda dalam satu file konfigurasi, seperti yang ditunjukkan Dayo di atas.
Cara kedua (lebih baik) Lebih fleksibel - berikan
default_server
parameter untuklisten
instruksi, misalnya:Informasi lebih lanjut di sini: Nginx doc / Listen
Cara ini lebih berguna saat Anda menyimpan konfigurasi server dalam file terpisah dan tidak ingin menamai file tersebut menurut abjad.
sumber
Sedikit komentar untuk menjawab:
jika Anda memiliki beberapa host virtual pada beberapa IP dalam beberapa file konfigurasi di sites-available /, maka domain "default" untuk IP akan diambil dari file pertama berdasarkan urutan abjad.
Dan seperti yang dikatakan Pavel, ada argumen "default_server" untuk perintah "dengarkan" http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
sumber