1.常见操作
`nginx -s signal`
signal的值可以是:
- stop 快速关机
- quit 正常关机
- reload 重新加载配置文件
- reopen 重新打开日志文件
2.配置文件
nginx是由模块组成的,这些模块在配置文件中又有指定的指令。 指令被分成简单指令和块指令。简单指令包括名称和用空格分割的参数以及用来结尾的分号(;)。 一个块指令和简单指令有相同的结构,但是它使用大括号({and})来包围一系列说明来替代使用分号作为结尾。
放在配置文件最外面的指令的称之为主文,
event
,http
指令在主文中;server
在http
中,location
在server
中。
3.静态服务
Web服务器一个重要的任务就是提供文件(如图像或者静态html页面)。 根据需求,你将实现一个例子,文件被本地不同的目录服务着,如/data/www
包含html文件,/data/images
包含图片。这需要编辑配置文件,在http
块中设置server
块。
首先,创建
/data/www
目录并放置index.html文件(文件中可以是任意内容)。 然后创建/data/images
目录并放置一些图片。接下来,打开配置文件。默认的配置文件已经包含了几个server块的例子,大多数都被注释掉了。 现在注释掉所有的块,并开始一个新的server块。
1 | http { |
一般情况下,配置文件中包含多个server块,它们之间以监听的端口号和server name来区分。 一旦nginx决定了哪个server处理请求,它测试在请求的对server块内定义的位置指令的参数头中指定的URI。
添加location到server中
1 | location / { |
与请求的URI相比,location块指定了“/”前缀。为了匹配请求,该URI会被添加到root指令指定的路径中, 即,到/data/www,在本地文件系统中组成请求文件的路径。如果有多个匹配的location块,nginx会选择前缀最长的。 上面的location块提供了最短的前缀,如果其他的location块匹配失败,这个location块就会被使用。
现在来添加第二个location:
1 | location /images/ { |
它与带/images/的请求请求匹配。(location / ,当然也匹配,除非有更短的前缀。)
#####现在server中是这样的:
1 | server { |
重启配置文件,让配置生效 nginx -s reload
这已经是一个可以工作的服务器配置文件,它监听的是80端口,可在本地通过
http://localhost/
访问。 响应带/images/
的URI路由请求时,服务器将会从/data/images
目录发送文件。 例如,响应http://localhost/images/example.png
路由请求,nginx将会发送/data/images/example.png
文件。如果这个文件不存在,nginx将会发出404错误的响应。不带/images/
的URIs请求将会映射到/data/www
目录。 例如,为了响应http://localhost/some/example.html
请求,nginx将会发送/data/www/some/example.html
文件。
3.代理服务器
服务器A接受到请求后,将请求转发给其他的服务器B,从服务器B处获得响应,并将取得的相应返回给客户端,服务器B则是服务器A的代理服务器
首先,我们新增一个server
1 | server { |
这是一个简单的server块,监听8080端口(此前,listen指令没有被提起是由于已经使用了标准的80端口),并将所有的请求 映射到本地文件系统的/data/up1目录。创建这个目录,并将index.html文件放置其中。注意root指令已经被放置在server环境中。 当location块被选中服务请求时,root指令就会被使用,当然不包括自己的root指令。
修改第一个location块,放置proxy_pass
指令与协议、名称和参数中指定的代理服务器端口
1 | server { |
修改第二个location块,它目前映射所有带/images/前缀的请求到/data/images 目录下的文件,是为了使其符合典型的文件扩展的图像请求
1 | location ~ \.(gif|jpg|png)$ { |
该参数是一个正则表达式,匹配所有.gif,.jpg,.png 结尾的路由。正则表达式应该优于~。相应的请求都会被映射到 /data/images目录。
当nginx选择一个location块服务一个请求时,它首先检查location指令的指定前缀,记住location最长的前缀, 然后检查正则表达式。如果有一个匹配的正则表达式,nginx会挑选location块,否则它会选择之前的。
因此代理服务器的配置文件应该是这样的:
1 | server { |
此服务器会筛选出以.gif,.jpg,.png 结尾的请求,并将他们映射到/data/images目录下(通过添加URI到root指令的参数上), 然后通过所有其它请求到代理服务器配置上
`nginx -s reload` 重启配置使更改生效
4. FastCGI代理
nginx可用于路由请求FastCGI服务器,FastCGI服务器运行各种不同的框架和编程语言,如PHP,建立的应用。
最常用与 FastCGI server工作的nginx配置,用fastcgi_pass指令替代了proxy_pass指令,并设置fastcgi_param 参数传递给FastCGI server。
假设FastCGI server通过localhost:9000可以访问。 以上一节代理配置作为基础,用fastcgi_pass指令替换proxy_pass指令,并修改参数为localhost:9000。在PHP中, SCRIPT_FILENAME参数用来确定脚本名,QUERY_STRING参数用来传递请求参数。
1 | server { |
nginx与PHP通信
首先我们先简单的看一份nginx server
1 | server { |
CGI是通用网关协议,FastCGI则是一种常住进程的CGI模式程序。我们所熟知的PHP-FPM会通过用户配置来管理一批FastCGI进程,例如在PHP-FPM管理下的某个FastCGI进程挂了,PHP-FPM会根据用户配置来看是否要重启补全,PHP-FPM更像是管理器,而真正衔接Nginx与PHP的则是FastCGI进程。
我们可以看到server中包含了fastcgi.conf
,里面是一些fastcgi_param的配置项,如下:
1 | fastcgi_param QUERY_STRING $query_string; |
fastcig_param中所声明的内容会传到php-fpm(或者其他fast-cgi server)所管理的fast-cgi进程。我们可以看到,fastcgi_param中都是一些服务器的信息,如remote_addr(访问用户的ip)等,他就可以把这些信息传递给后端程序,如PHP的$_SERVER