率先要记住的是,Nginx的搭配文件是逐层继承的,外层定义的搭配项将会作为里层的默认搭配,因而,良好将通用的搭配项放在最顶层。当然,这种继承而来的默认搭配能够在里层被重现。
常用的搭配有三层,在搭配文件中以块的形式出现。HTTP块->server块->location块。
另外,有两种特异的location块,事件(event)块和root块,HTTP块和事件块均在root块中。这两种块只包括了少量的配相消息,更多的则在其他的三种块中。
这些块各司其职。server块描写了一种在apache中称为虚构服务器的构造,location块重要是针对URI。
Virtual Host
搭配文件可能会揭示若干个server块,Nginx将会依据其中的server_name项相称HOST头字段,以定夺批准哪个server块,并依据root项定义根目录。这两项构筑了Virtual Host的基础,下面是一个例子
server { listen 80; server_name domain.com *.domain.com; rewrite ^ http://om$request_uri permanent; } server { listen 80; server_name om; index index.html; root /home/domain.com}
例子中定义了两个virtual host。当服务器接到的HOST头字段是domain.com或除非www以外的它的子域名时,第一个server块将起作用。之因而www子域名会被第二个server快左右,是因为Nginx总是抉择最准确的相称。
这个个性使得我们能够创立一个默认的virtual host处理那些未曾全面相称的域名。所幸这并不混杂,我们只必需给listen项增加一个default_server符号就能够了。这使得所有不带HOST头字段可能HOST头字段未曾能够相称其他virtual host的哀求被领导到这个默认的virtual host。等闲穿越IP直接拜会可能穿越一个随机的域名指向你的IP哀求会引发上面的收获。下面例子中的server_name项值为'_',代表什么也不是,什么也不做。它只是一个无意义的HOST头,来确保未曾哀求能够和它相称,它帮助你容易的不定义一个server_name。
server { listen 80 default_server; server_name _; index index.html; root 89.35msn.com/var/www/default}
Location
万一你之前利用xi.xihuanplaza.com的是apache,那么接下来的内容你定然要当心。Nginx未曾批准混杂的rewrite,我们能够穿越location块来告终同样的收获。
有一点定然要打听,这些location,除非named location,穿越相称URI,最后只有一个location块见效。这即便为什么我评比将搭配项尽可能的放在外层的block中。一个在location / 中定义的root项不会波及到location /images,除非它定义在server块中。我可信你曾经打听如何在更外层定义搭配项以避免重复搭配。
另一个必需当心的地方是,Nginx利用最准确的location相称。关于location的翔实搭配法定,这里有翔实的解释location directive wiki entry,你该领先阅读这些内容。
PHP
location块能够捉拿PHP哀求。
server { listen 80; server_name forum.domain.com; index index.php; root /home/domain.com/forum; location ~* /.php$ { if (!-f $request_filename) { return 404; } fastcgi_pass 127.0.0.1:9000; }}
上例中我利用了一些不合规范的写法。Nginx不评比在location块中嵌套块,但这里是较少的能够例外之一。前面提到过,Nginx关怀location而不是文件,因而它相称URI只关怀是否以.php作为结尾,而不关怀它是不是一个文件。因而,一个/forum/avatars/user2.jpg/index.php哀求被location块送给PHP运行,万一PHP未曾被准确的搭配,那么万一/forum/avatars/user2.jpg/index.php不存在,PHP将会运行/forum/avatars/user2.jpg,这是极不平安的。这不是Nginx的bug,而是存心为之,未来我们也不会修复它。
这种平安问题能够在PHP搭配中被修正:搭配php.ini文件cgi.fix_pathinfo=0
最后,.php文件被穿越fastcgi被送至在端口9000上运行的PHP历程。
锦上添花
上面的设置曾经能够工作,但琢磨到SEO(搜查引擎优化),目前的流行批准搜查引擎友好的URL,等闲这将引入少量的rewrite,但Nginx让我们能够用一行语句告终,让后台脚本更加轻率编写。
server { listen 80; server_name forum.domain.com; index index.php; root /home/domain.com/forum; try_files $uri $uri/ /index.php; location ~* /.php$ { if (!-f $request_filename) { return 404; } fastcgi_pass 127.0.0.1:9000; }}
能看出差异吗?确乎很小。try_files搭配项的含义是:先哀求全面URI,这意味着静态网页哀求将会在这一步归来并告终。接下来哀求全面URI加斜线来查询一个目录。万一前两步均未曾找到收获,哀求将会被送至/index.php,它引起一个location块捉拿,穿越fastcgi_pass处理。PHP将会在$_SERVER['PATH_INFO']中登记全面的URI。过程容易,美观,而且草带会意。
最后一段不想也无须翻了
Further Reading
Theofficial nginx wikiis an invaluable resource, a good way to expand your knowledge about Nginx is to read the directives and variables in theCore module. Also see thefull config exampleto get an idea of a more complex configuration filecgi.fix_pathinfo=0se
Related posts:
- File Uploading With PHP & NginxBook Review: Nginx HTTP Server12,000 Requests per second with Nginx, PHP and Memcached