Rumah >Operasi dan penyelenggaraan >Nginx >Bagaimana untuk mengkonfigurasi dan mengoptimumkan perkhidmatan fail statik Nginx
Direktori Akar dan Fail Indeks
Arahan akar menentukan direktori akar yang akan digunakan untuk mencari fail. Untuk mendapatkan laluan ke fail yang diminta, nginx menambahkan permintaan uri ke laluan yang ditentukan oleh arahan root. Arahan ini boleh diletakkan pada mana-mana peringkat dalam konteks http {} , pelayan {} atau lokasi {}. Dalam contoh berikut, arahan akar ditakrifkan untuk pelayan maya. Ia berfungsi untuk semua blok {} lokasi yang tidak mengandungi arahan akar untuk mentakrifkan semula akar secara eksplisit:
server { root /www/data; location / { } location /images/ { } location ~ \.(mp3|mp4) { root /www/media; } }
Di sini, uri nginx bermula dengan /images/ akan berada dalam Carian /www/ data/images sistem fail untuk fail yang sepadan dalam direktori /. Jika uri berakhir dengan sambungan .mp3 atau .mp4, nginx mencari fail dalam direktori /www/media/ kerana ia ditakrifkan dalam blok lokasi yang sepadan.
Jika permintaan berakhir dengan /, nginx menganggapnya sebagai permintaan untuk direktori dan cuba mencari fail indeks dalam direktori. Arahan indeks mentakrifkan nama fail indeks (lalai ialah index.html). Untuk meneruskan contoh, jika uri permintaan ialah /images/some/path/ , nginx mengembalikan fail /www/data/images/some/path/index.html jika ia wujud. Jika tidak, nginx mengembalikan ralat http 404 (tidak dijumpai) secara lalai. Untuk mengkonfigurasi nginx untuk mengembalikan senarai direktori yang dijana secara automatik, sertakan parameter on dalam arahan autoindex:
location /images/ { autoindex on; }
Anda boleh menyenaraikan berbilang nama fail dalam arahan indeks. nginx mencari fail dalam susunan yang ditentukan dan mengembalikan fail pertama yang ditemuinya.
location / { index index.$geo.html index.htm index.html; }
Pembolehubah $geo yang digunakan di sini ialah pembolehubah tersuai yang ditetapkan melalui arahan geo. Nilai pembolehubah bergantung pada alamat IP pelanggan.
Untuk mengembalikan fail indeks, nginx menyemak untuk melihat sama ada ia wujud dan kemudian melakukan ubah hala dalaman ke uri baharu yang diperoleh dengan menambahkan nama fail indeks pada uri asas. Ubah hala dalaman menghasilkan carian baharu untuk lokasi dan mungkin berakhir di lokasi lain, seperti yang ditunjukkan dalam contoh berikut:
location / { root /data; index index.html index.php; } location ~ \.php { fastcgi_pass localhost:8000; #... }
Di sini, jika uri dalam permintaan ialah /path/ dan /data/path/ index .html tidak wujud tetapi /data/path/index.php wujud, maka ubah hala dalaman ke /path/index.php akan dipetakan ke lokasi kedua. Akibatnya, permintaan itu diproksikan.
Cuba beberapa pilihan
Arahan try_files boleh digunakan untuk menyemak sama ada fail atau direktori yang ditetapkan akan mengubah hala secara dalaman dan mengembalikan jika tidak kod status yang ditentukan. Contohnya, untuk menyemak sama ada fail yang sepadan dengan uri permintaan wujud, gunakan arahan try_files dan pembolehubah $uri seperti berikut:
server { root /www/data; location /images/ { try_files $uri /images/default.gif; } }
Fail ditentukan sebagai uri, menggunakan konteks lokasi semasa atau pelayan maya Arahan akar atau alias yang ditetapkan dalam diproses. Dalam kes ini, jika fail yang sepadan dengan uri asal tidak wujud, nginx akan mengubah hala secara dalaman ke uri yang ditentukan oleh parameter terakhir dan mengembalikan /www/data/images/default.gif .
Parameter terakhir juga boleh menjadi kod status (bermula terus dengan tanda sama) atau nama lokasi. Dalam contoh berikut, jika tiada argumen kepada arahan try_files menyelesaikan kepada fail atau direktori sedia ada, ralat 404 dikembalikan.
location / { try_files $uri $uri/ $uri.html =404; }
Dalam contoh seterusnya, jika uri asal atau uri dengan garis miring mengekor yang dilampirkan tidak diselesaikan ke fail atau direktori sedia ada, permintaan akan diubah hala ke lokasi yang ditentukan dan dihantar ke pelayan proksi.
location / { try_files $uri $uri/ @backend; } location @backend { proxy_pass http://backend.example.com; }
Mengoptimumkan prestasi kandungan yang disajikan
Kelajuan pemuatan ialah faktor utama dalam menyampaikan sebarang kandungan. Pengoptimuman kecil pada konfigurasi nginx anda boleh meningkatkan produktiviti dan membantu mencapai prestasi optimum.
Dayakan fail hantar
Secara lalai, nginx mengendalikan pemindahan fail itu sendiri dan menyalin fail ke dalam penimbal sebelum menghantar. Mendayakan arahan sendfile menghapuskan langkah menyalin data ke penimbal dan membolehkan data disalin terus dari satu deskriptor fail ke yang lain. Sebagai alternatif, untuk mengelakkan sambungan pantas daripada menduduki sepenuhnya proses pekerja, anda boleh mengehadkan jumlah data yang dipindahkan dalam satu panggilan sendfile() (dalam kes ini 1 mb) menggunakan arahan sendfile_max_chunk:
location /mp3 { sendfile on; sendfile_max_chunk 1m; #... }
Dayakan tcp_nopush
Gunakan perintah tcp_nopush bersama-sama dengan arahan sendfile; Ini membolehkan nginx menghantar pengepala respons http dalam paket sejurus selepas sendfile() mendapat sebahagian daripada data.
location /mp3 { sendfile on; tcp_nopush on; #... }
Dayakan tcp_nodelay
Arahan tcp_nodelay membenarkan mengatasi algoritma nagle, yang pada asalnya direka untuk menyelesaikan masalah paket kecil dalam rangkaian perlahan. Algoritma ini menggabungkan banyak paket kecil ke dalam satu paket yang lebih besar dan menghantar paket dengan kelewatan 200 milisaat. Hari ini, apabila menyiarkan fail statik yang besar, data boleh dihantar serta-merta tanpa mengira saiz paket. Latensi juga mempengaruhi aplikasi dalam talian (ssh, permainan dalam talian, urus niaga dalam talian, dsb.). Secara lalai, arahan tcp_nodelay ditetapkan kepada hidup, yang bermaksud algoritma nagle dilumpuhkan. Arahan ini hanya digunakan untuk sambungan keepalive:
location /mp3 { tcp_nodelay on; keepalive_timeout 65; #... }
Optimumkan baris gilir tertunggak
其中一个重要因素是 nginx 可以多快地处理传入连接。一般规则是在建立连接时,将其放入侦听套接字的 "listen" (监听)队列中。在正常负载下,队列很小或根本没有队列。但是在高负载下,队列会急剧增长,导致性能不均匀,连接中断,延迟增加。
显示积压队列使用命令 netstat -lan 来显示当前监听队列。输出可能如下所示,它显示在端口 80上的监听队列中,有 10 个未接受的连接,这些连接针对配置的最多 128 个排队连接。这种情况很正常。
current listen queue sizes (qlen/incqlen/maxqlen) listen local address 0/0/128 *.12345 10/0/128 *.80 0/0/128 *.8080
相反,在以下命令中,未接受的连接数(192)超过了 128 的限制。当网站流量很大时,这种情况很常见。要获得最佳性能,需要在操作系统和 nginx 配置中增加可以排队等待 nginx 接受的最大连接数。
current listen queue sizes (qlen/incqlen/maxqlen) listen local address 0/0/128 *.12345 192/0/128 *.80 0/0/128 *.8080
调整操作系统
将 net.core.somaxconn 内核参数的值从其默认值(128)增加到足以容纳大量流量的值。在这个例子中,它增加到 4096。
freebsd 的命令为 sudo sysctl kern.ipc.somaxconn=4096
linux 的命令为 1. sudo sysctl -w net.core.somaxconn=4096 2. 将 net.core.somaxconn = 4096 加入到 /etc/sysctl.conf 文件中。
调整 nginx
如果将 somaxconn 内核参数设置为大于 512 的值,请将 backlog 参数增加在 nginx listen 指令以匹配修改:
server { listen 80 backlog=4096; # ... }
Atas ialah kandungan terperinci Bagaimana untuk mengkonfigurasi dan mengoptimumkan perkhidmatan fail statik Nginx. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!