Nginx 推送动态内容给CGI, FastCGI, 和其它web服务器,比如Apache。返回内容再由Nginx传送给客户端。
本文将带你了解熟悉Nginx的配置
Directives, Blocks, and Contexts
所有的Nginx配置文件都在/etc/nginx/ 目录下。主要的配置文件是/etc/nginx/nginx.conf。
在Nginx内的配置选项称为指示
以组编排的指令被称作为 blocks 或 context。这两个术语是同等的。
‘#’开头的行会被注释,不会被Nginx解析。
如果行内包含指令的话必须以 ‘;’ 结尾,否则Nginx将不能加载配置,并报错。
下面是一个缩略版本的nginx.conf
文件以4个指令开头:user, worker_process, error_log, 和 pid。
这些指令都在block或context外面,所以他们被认为在 main context上。
Event和 http blocks是额外指令的区域,他们也同样存在于main context
/etc/nginx/nginx.conf
12345678910111213 user nginx;worker_processes 1;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;events {. . .}http {. . .}
http Block
http Block 包含处理web流量的指令。这些指令通常被定义为统一的.
下面是Nginx文档给出的可用的http block 列表:
/etc/nginx/nginx.conf
12345678910111213141516171819 http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;#tcp_nopush on;keepalive_timeout 65;#gzip on;include /etc/nginx/conf.d/*.conf;}
Server Blocks
上面的http block包含 include指令,告诉Nginx网站配置文件放置的地方。
如果你从官方仓库安装Nginx,会有这么一行 /etc/nginx/conf.d/*.conf; 像上面说的http block的那个一样
每个用Nginx部署的网站应该在这目录 /etc/nginx/conf.d/ 有自己的配置文件;命名一般为 example.com.conf
如果想disable它的话,可以改名为example.com.conf.disabled.
如果你从Debian或Ubuntu仓库安装的话,会有这么一行/etc/nginx/sites-enabled/*;
../sites-enabled/文件夹里包含 从 /etc/nginx/sites-available/ 链接过来的配置文件。
如果要disable网站的话,一般是删掉在sites-enabled 上的链接。
一般你都能在 /etc/nginx/conf.d/default.conf 或 etc/nginx/sites-enabled/default找到一个配置的例子供你参考。
不管你从哪个渠道安装,对一个网站,服务器配置文件总会包含一个或多个block,比如:
/etc/nginx/conf.d/example.com.conf
12345678 server {listen 80 default_server;listen [::]:80 default_server;server_name example.com www.example.com;root /var/www/example.com;index index.html;try_files $uri /index.html;}
监听端口
listen指令 告诉Nginx监听的 hostname/IP 和 TCP端口。
default_server参数是说 这个虚拟的host会回答在80端口上的请求,这个端口将不会回答其它的虚拟host。
第二个statement监听的是IP v6,其它没有什么差别。
Name-Based Virtual Hosting
基于name的虚拟主机
server_name指令允许在一个IP地址上存在多个域名。服务器根据收到的请求header决定域名。
你应该按每个域名来创建一个配置文件,或者每个网站一个配置。这里有些案例:
同时处理example.com 和 www.example.com请求:
/etc/nginx/conf.d/example.com.conf
1 server_name example.com www.example.com;
server_name 指令也可以用 通配符 *.example.com 和 .example.com,两个都会指使服务器处理example.com下的所有子域名:
/etc/nginx/conf.d/example.com.conf
12 server_name *.example.com;server_name .example.com;
处理所有example.开头的域名:
/etc/nginx/conf.d/example.com.conf
1 server_name example.*;
Nginx允许你指定一个无效的域名。Nginx使用HTTP header里的name 来作为域名回答请求,不管domain name是否有效。
如果你用你是用内网的话,使用非域名 hostname是非常有效的。这包括在/etc/hosts配的域名。
Location Blocks
location 设置让Nginx返回服务期内的资源请求。和server_name指令一样,告诉Nginx怎么处理域名的请求。
location指令覆盖指定的文件和文件夹,比如http://example.com/blog/:
/etc/nginx/sites-available/example.com
12345 location / { }location /images/ { }location /blog/ { }location /planet/ { }location /planet/blog/ { }
上面的location是一字不差地匹配,它匹配主机segment之后的HTTP请求的任何部分:
Request: http://example.com/
Returns:假设server_name 是example.com, location / 指令会决定这个请求怎么处理
Nginx总是履行最匹配的请求:
Request: http://example.com/planet/blog/ 或 http://example.com/planet/blog/about/
Returns: 这个会履行 location /planet/blog/ ,因为 它最匹配这个location,即使/planet/ 同样匹配这个请求。
具体的location匹配可以参考下如下例子:
顺序 no优先级:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
Location Root 和 Index
location设置是另一个具有自己的参数block的变量。
一旦Nginx确定了哪个location指令最匹配给定请求,对这个请求的响应就由相关的location指令block的内容确定。
一个例子:
/etc/nginx/sites-available/example.com
1234 location / {root html;index index.html index.htm;}
在这个例子中,root 是 在默认Nginx安装路径下的 html 目录。绝对路径是 /etc/nginx/html/.
Request: http://example.com/blog/includes/style.css
Returns: Nginx会尝试寻找放置于/etc/nginx/html/blog/includes/style.css 内的文件
注意,如果需要的话root 你的直接设为绝对路径
index这个参数告诉Nginx如果没有设置路由的话,将返回哪个文件。比如:
Request: http://example.com
Returns: Nginx将尝试返回/etc/nginx/html/index.html 这个文件。
如果index指令设置了多个值得话,Nginx将会按顺序来返回第一个存在的文件。比如如果index.html不存在相关目录的话,然后index.htm将会被返回。如果都不存在则会报404.
这有个更复杂的案例,展示了一组响应域example.com的服务器的location:
/etc/nginx/sites-available/example.com
123456789101112 location / {root /srv/www/example.com/public_html;index index.html index.htm;}location ~ \.pl$ {gzip off;include /etc/nginx/fastcgi_params;fastcgi_pass unix:/var/run/fcgiwrap.socket;fastcgi_index index.pl;fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public_html$fastcgi_script_name;}
在此示例中,所有以.pl扩展名结尾的资源请求都由第二个location block处理,第二个location block为这些请求指定一个fastcgi处理程序。
否则,Nginx使用第一个location 指令。 资源位于文件系统上的/srv/www/example.com/public_html/。 如果请求中未指定文件名,
Nginx将查找并提供index.html或index.htm文件。 如果找不到索引文件,则服务器将返回404错误。
我们分析下下面几个请求:
Request: http://example.com/
Returns:/srv/www/example.com/public_html/index.html(如果存在)。 如果该文件不存在,它将返回/srv/www/example.com/public_html/index.htm。 如果都不存在,Nginx将返回404错误。
Request: http://example.com/blog/
Returns: /srv/www/example.com/public_html/blog/index.html(如果存在)。 如果该文件不存在,它将返回/srv/www/example.com/public_html/blog/index.htm。 如果都不存在,Nginx将返回404错误。
Request: http://example.com/tasks.pl
Returns: Nginx将使用FastCGI处理程序执行位于/srv/www/example.com/public_html/tasks.pl的文件并返回结果。tasks.pl and return the result.
Request: http://example.com/username/roster.pl
Returns: Nginx将使用FastCGI处理程序执行位于/srv/www/example.com/public_html/username/roster.pl的文件并返回结果。
有问题可以留言,并关注我。谢谢大家。