Rumah > Artikel > Operasi dan penyelenggaraan > Apakah konsep asas Nginx
Nginx pada asalnya dicipta sebagai pelayan web untuk menyelesaikan masalah C10k. Sebagai pelayan web, ia boleh menyampaikan data anda pada kelajuan yang sangat pantas. Tetapi Nginx adalah lebih daripada sekadar pelayan web, anda juga boleh menggunakannya sebagai proksi terbalik untuk disepadukan dengan mudah dengan pelayan huluan yang lebih perlahan seperti Unicorn atau Puma. Anda boleh mengedarkan trafik dengan sewajarnya (pengimbang beban), media strim, mengubah saiz imej secara dinamik, kandungan cache dan banyak lagi. Seni bina nginx asas terdiri daripada proses induk dan proses pekerjanya. Tuan membaca fail konfigurasi dan mengekalkan proses pekerja, dan pekerja sebenarnya memproses permintaan itu.
Untuk memulakan nginx, masukkan sahaja:
[sudo] nginx
Apabila instance nginx anda sedang berjalan, anda boleh menghantar isyarat yang sesuai dengan Untuk mengurus ia:
[sudo] nginx -s signal
Isyarat tersedia:
berhenti – penutupan pantas
berhenti – thread pekerja untuk menyelesaikan pemprosesan)
muat semula –
,
fail konfigurasi terdiri daripada bahagian berikut:
Arahan&ndash, mengandungi nama dan parameter, berakhir dengan koma bertitik/etc/nginx/nginx.conf
gzip on;
Konteks– blok mata, anda boleh mengisytiharkan arahan &ndash serupa dengan skop dalam bahasa pengaturcaraan /usr/local/etc/nginx/nginx.conf
worker_processes 2; # 全局上下文指令http { # http 上下文 gzip on; # http 上下文中的指令 server { # server 上下文 listen 80; # server 上下文中的指令 } }
jenis arahan /usr/local/nginx/conf/nginx.conf
mempunyai nilai unik setiap konteks. Selain itu, ia hanya boleh ditakrifkan sekali dalam konteks semasa. Mengatasi nilai ibu bapa dalam konteks kanak-kanak hanya sah dalam konteks anak semasa.
gzip on; gzip off; # 非法,不能在同一个上下文中指定同一普通指令2次server { location /downloads { gzip off; } location /assets { # gzip is on here } }
Menambah berbilang arahan dalam konteks yang sama akan menambah berbilang nilai bukannya liputan penuh. Menentukan arahan dalam konteks kanak-kanak akan mengatasi nilai dalam konteks induk.
error_log /var/log/nginx/error.log; error_log /var/log/nginx/error_notive.log notice; error_log /var/log/nginx/error_debug.log debug; server { location /downloads { # 下面的配置会覆盖父级上下文中的指令 error_log /var/log/nginx/error_downloads.log; } }
Tindakan ialah arahan untuk mengubah sesuatu. Bergantung pada keperluan modul, tingkah laku yang diwarisi mungkin berbeza-beza. Sebagai contoh, arahan tulis semula akan dilaksanakan selagi ia sepadan:
server { rewrite ^ /foobar; location /foobar { rewrite ^ /foo; rewrite ^ /bar; } }
Jika pengguna ingin cuba mendapatkan /sample:
Tulisan semula pelayan akan dilaksanakan, daripada /sample tulis semula ke /foobar
lokasi /foobar akan dilaksanakan oleh padanan tulis semula pertama
lokasi, menulis semula dari /foobar to /foo
Pelaksanaan penulisan semula kedualokasi, menulis semula dari /foo ke /bar
arahan pemulangan menyediakan gelagat yang berbeza:
server { location / { return 200; return 404; } }
Di dalam Nginx, anda boleh menentukan berbilang pelayan maya, setiap pelayan maya diterangkan dengan konteks pelayan{}.
server { listen *:80 default_server; server_name netguru.co; return 200 "Hello from netguru.co"; } server { listen *:80; server_name foo.co; return 200 "Hello from foo.co"; } server { listen *:81; server_name bar.co; return 200 "Hello from bar.co"; }
Kemudian, nilai arahan nama_server akan mengesan pengepala Hos (yang menyimpan nama domain hos).
mempunyai default_server Ditandai Hos IP-Port
Hos IP-Port yang ditakrifkan pertama
Jika tiada padanan, tolak sambungan.
Contohnya:
Request to foo.co:80 => "Hello from foo.co"Request to www.foo.co:80 => "Hello from netguru.co"Request to bar.co:80 => "Hello from netguru.co"Request to bar.co:81 => "Hello from bar.co"Request to foo.co:81 => "Hello from bar.co"
Arahan
server_name netguru.co www.netguru.co; # exact matchserver_name *.netguru.co; # wildcard matchingserver_name netguru.*; # wildcard matchingserver_name ~^[0-9]*\.netguru\.co$; # regexp matchingApabila terdapat kekaburan, nginx akan menggunakan yang berikut:
server_name
Memadankan ungkapan biasa dahulu (mengikut konfigurasi failkan Pesanan dalam)
Nginx akan menyimpan tiga jadual cincang untuk menyimpan nama tertentu, kad bebas bermula dengan asterisk dan kad bebas yang berakhir dengan asterisk. Jika keputusan tiada dalam mana-mana jadual, ujian ungkapan biasa akan dilakukan secara berurutan.
server_name .netguru.co;
ialah singkatan daripada
server_name netguru.co www.netguru.co *.netguru.co;
在很多情况下,能够找到 listen 指令,接受IP:端口值
listen 127.0.0.1:80; listen 127.0.0.1; # by default port :80 is usedlisten *:81; listen 81; # by default all ips are usedlisten [::]:80; # IPv6 addresseslisten [::1]; # IPv6 addresses
然而,还可以指定 UNIX-domain 套接字。
listen unix:/var/run/nginx.sock;
你甚至可以使用主机名
listen localhost:80; listen netguru.co:80;
但请慎用,由于主机可能无法启动 nginx,导致无法绑定在特定的 TCP Socket。
最后,如果指令不存在,则使用 *:80
。
有了这些知识 – 我们应该能够创建并理解运行 nginx 所需的最低配置。
# /etc/nginx/nginx.confevents {} # events context needs to be defined to consider config validhttp { server { listen 80; server_name netguru.co www.netguru.co *.netguru.co; return 200 "Hello"; } }
root, location, 和 try_files 指令
root 指令
root 指令设置请求的根目录,允许 nginx 将传入请求映射到文件系统。
server { listen 80; server_name netguru.co; root /var/www/netguru.co; }
根据给定的请求,指定 nginx 服务器允许的内容
netguru.co:80/index.html # returns /var/www/netguru.co/index.htmlnetguru.co:80/foo/index.html # returns /var/www/netguru.co/foo/index.html
location
指令
location指令根据请求的 URI 来设置配置。location [modifier] path
location /foo/ { # ...}
如果没有指定修饰符,则路径被视为前缀,其后可以跟随任何东西。
以上例子将匹配
/foo /fooo /foo123 /foo/bar/index.html ...
此外,在给定的上下文中可以使用多个 location 指令。
server { listen 80; server_name netguru.co; root /var/www/netguru.co; location / { return 200 "root"; } location /foo/ { return 200 "foo"; } } netguru.co:80 / # => "root"netguru.co:80 /foo # => "foo"netguru.co:80 /foo123 # => "foo"netguru.co:80 /bar # => "root"
Nginx还有一些修饰符可以用于连接location。因为每个修饰符都有自己的优先级,所以它们会影响 location 模块在使用时的行为。
= - Exact match ^~ - Preferential match ~ && ~* - Regex match no modifier - Prefix match
Nginx 会先检查精确匹配。如果找不到,我们会找优先级最高的。如果之前的匹配尝试失败,正则表达式会按照出现的顺序逐个进行测试。至少,最后一个前缀匹配将被使用。
location /match { return 200 'Prefix match: matches everything that starting with /match'; } location ~* /match[0-9] { return 200 'Case insensitive regex match'; } location ~ /MATCH[0-9] { return 200 'Case sensitive regex match'; } location ^~ /match0 { return 200 'Preferential match'; } location = /match { return 200 'Exact match'; } /match/ # => 'Exact match'/match0 # => 'Preferential match'/match2 # => 'Case insensitive regex match'/MATCH1 # => 'Case sensitive regex match'/match-abc # => 'Prefix match: matches everything that starting with /match'
try_files
指令
尝试不同的路径,找到一个路径就返回。
try_files $uri index.html =404;
所以对于 /foo.html
请求,它将尝试按以下顺序返回文件:
$uri ( /foo.html )
index.html
如果什么都没找到则返回 404
有趣的是,如果我们在服务器上下文中定义 try_files,然后定义匹配的所有请求的 location —— try_files 将不会执行。
这是因为在服务器上下文中定义的 try_files 是它的 pseudo-location,这是最不可能的位置。因此,location/的定义将比pseudo-location更为明确。
server { try_files $uri /index.html =404; location / { } }
因此,你应该避免在 server 上下文中出现 try_files:
server { location / { try_files $uri /index.html =404; } }
Atas ialah kandungan terperinci Apakah konsep asas Nginx. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!