nginx--Beginner's Guide
文章包括六部分
- 前言
- 开始,停止,重新加载的配置
- 配置文件的结构
- 提供静态内容
- 设置一个简单的代理服务器
- 设置FastCGI代理
这篇引导是对nginx的基础介绍,通过一些简单的案例来展示nginx能做什么,默认你已经安装好nginx,否则请先进行安装,本文将介绍怎么运行/停止nginx,重新加载配置,解释配置文件的结构以及怎么设置nginx服务器提供静态内容,如何将nginx设置成代理服务器,如果连接到FastCGI应用
nginx有一个master
进程和多个worker
进程,master
线程的目的是读取和解析配置以及维持worker
进程,worker
进程处理实际的工作(请求)
nginx采用基于事件的模型,和基于OS的机制来高效率地在worker
之间分发请求,worker
进程的数字被定义在配置文件中,可以指定配置进行固定,也可以设置成根据可用CPU内核的数量自动调整(参见worker_processes)。
nginx及其模块的工作由配置文件进行设定,默认情况下,配置文件名为 nginx.conf
一般放置在 /usr/local/nginx/conf
, /etc/nginx
或者 /usr/local/etc/nginx
docker 的官方nginx镜像是存放在
/etc/nginx
目录下
Starting , Stopping , and Reloading Configuration
开启nginx,只需运行可执行文件。 nginx开启后,可以通过 -s
参数进行控制 例如
nginx -s singal
signal可以是下面任一
- stop -- 快速关闭
- quit -- 优雅地关闭(等待工作线程完成目前的请求)
- reload -- 重新加载配置文件
- reopen -- 重新开启日志文件
应该使用开启 nginx 的用户来执行该命令
如果配置文件发生了修改,可以运行nginx -s reload
让其真正生效(否则只能通过重启令其起作用)
一旦master
进程收到reload
信号,会先检查新配置文件中的语法有效性,然后会尝试应用新的配置,如果顺利,master
进程会开启新的工作进程,同时发送消息到旧的工作进程通知让他们关闭。否则master
进程会回退修改,继续依照旧的配置工作。
旧的工作进程收到关闭命令时,会停止接收新的连接,但会继续完成已有的请求,直到所有请求处理完成,在那之后,旧工作进程才会退出
一个信号也可以通过Unix工具的帮助发送到nginx进程,例如kill
, 这种情况下 一个信号被直接发送到给定进程ID的进程master
进程的进程ID会被记录下来,默认写到中 /usr/local/nginx/logs
或者 /var/run
的nginx.pid
中,例如 master进程 ID 是 1628 可以发送QUIT
信号 可以执行:
kill -s QUIT 1628
获取所有运行的nginx进程,可以使用ps 命令,例如:
ps -ax | grep nginx
关于发送信号到nginx上更详细的信息,可以查看Controlling nginx.
Configuration File's Structure
nginx包含由配置文件中指定的指令控制的模块,指令分为简单指令和块指令
简单指令包含名字和参数,由空格进行分隔,并以;
结尾
块指令跟简单指令有相同的结构,不过它不是以分号结束,而是以一组由({})
包围的附加指令
如果块指令可以在大括号内包含其他指令,则称为上下文(context)
(例子: events, http, server, and location)。
任何上下文之外的指令被认为包含在主上下文中,events
和http
指令 在主上下文中,server
在http
中, location
在server
中
其余以#开头的部分 是注释
Service Static Content
一个重要的web服务器任务是提供文件(例如 图片,或者静态HTML页面)你将实现一个样例,其中根据请求,将从不同的本地目录中提供文件:/data/www
(一般包含静态HTML文件) /data/images
(一般包含图像),这将需要编辑配置文件,然后设置 http
- server
-- location
(两个)
首先,创建 /data/www
目录,然后放置一个 index.html
文件输入一些html内容,然后创建 /data/images
目录,其中放置一些图片...
接着,打开配置文件,默认配置文件以及包含一些server
块的样例,主要是注释掉了。现在,请注释掉所有这些块并启动一个新的服务器块:
http{
server{
}
}
通常地,配置文件可能包含多个 server
块,由 监听端口,服务器名进行区分
一旦nginx决定哪个server
处理一个请求,会根据server
中的location
指令测试指定在请求的头参数中的URI
,
添加以下 location
块到 server
块中
location / {
root /data/www;
}
location
块 指定 /
前缀,为了匹配请求,URI会被添加到root指令指定的路径上,即 /data/www
,以规范访问本地文件系统中文件的路径。如果有多个location
块符合配对,nginx会选择有最长前缀的一个,上面的location
块拥有最短的前缀 /
,因此只有其他所有location
块都无法配对时,才会选择该块
然后,添加第二个 location
块
location /images/ {
root /data;
}
这会配对 以/imgaes/
开头的请求,(/
也能够配对,但是长度要更短)
最终的配置应该是这样:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
这已经是一个服务器的工作配置,监听标准80端口,允许本地机器访问 http://localhost/
响应以 /images/
开头的URI请求,服务器会从/data/images
目录发送文件,例如,作为回答http://localhost/images/example.png
这个请求,nginx会发送 /data/images/example.png
文件,如果这样的文件不存在,nginx会返回一个404错误页面,不是以/images/
开头的请求URI将会映射到/data/www
目录,例如 对于http://localhost/some/example.html
nginx会返回/data/www/some/example.html
路径上的文件(如果存在)
为了应用新配置,可以发送reload
信号到 nginx的master进程,例如执行:
nginx -s reload
以防超出工作预期,你也许可以尝试查看
/usr/local/nginx/logs
中的access.log
和error.log
文件 。 一般在/usr/local/nginx/logs
或者/var/log/nginx.
Setting Up a Simple Proxy Server
最流行的一种nginx用途是将其设置成代理服务器,意味着接收请求(request),然后传递他们(request)到被代理服务器(proxied server),并将(从被代理服务器)收到的答复发送回给客户端(client)
我们会配置一个基础的代理服务器,可以处理访问本地图片文件请求,然后发送所有其他请求到代理服务器上,此例子中,两个server
会被定义在一个单一的nginx实例上
首先,通过添加一个server
块到nginx的配置文件中来定义被代理服务器
server {
listen 8080;
root /data/up1;
location / {
}
}
这样就设定了一个简单的监听8080端口的服务器(之前没有指定端口时,默认使用80端口),然后映射所有请求到/data/upl
本地文件目录,(手动)创建这个目录,然后向其中添加index.html
文件,注意到 root
指令是放置在的server
上下里面,当选择了某个没有包含root
指令的location
块去处理一个请求,就会使用这个(server域)root
指令
接下来,使用前一节中的服务器配置,并对其进行修改,使其成为代理服务器配置。首先,location
块,放置proxy_pass指令,并带上 协议、名字和端口(我们的样例中是http://localhost:8080
)
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我们将修改第二个location
块,使得其能够配对包含典型文件拓展名的请求,修改后location
块:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
这个参数是匹配所有以.gif , .jpg , .png
结尾的正则表达式,一个正则表达式的前面应该有 ~.
,相应的请求将会被映射到/data/images
目录
当nginx选择一个 location
块去处理一个请求,首先会检查有特定前缀的 location指令,记住符合的最长前缀的location
,然后检查正则表达式,如果有符合的正则表达式,nginx选择这个location
或者,否则会选择之前记住的location
意味着,正则表达式的优先级要高于长前缀的
location
最终代理服务器的配置会类似:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
这个服务器会过滤以.gif , .jpg , .png
结尾的请求,然后将他们映射到/data/images
目录(通过添加URI到root
指令的参数),然后传递其他所有请求到被代理服务器上
为了应用新的配置,发送reload
信号到nginx
还有其他更多的指令以满足更复杂的代理连接配置
Setting Up FastCGI Proxying
nginx可以用来路由请求到 FastCGI服务器---以多个框架和编程语言构建的应用,例如PHP
对于FastCGI服务器最主要的nginx配置 ,包括使用 fastcgi_pass指令,而不是 proxy_pass
指令,以及使用 fastcgi_param指令来设置参数传递到 FastCGI服务器上,假设localhost:9000
可以访问FastCGI服务器,以前一节的代理配置为基础,用fastcgi_pass指令替换proxy_pass指令,并将参数更改为localhost:9000。在PHP中,SCRIPT_FILENAME
参数用于确定脚本名称,而QUERY_STRING
参数用于传递请求参数。产生的配置将是:
server {
location / {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
这将建立一个服务器,它将通过FastCGI协议路由所有除了请求静态图像达到请求到在localhost:9000
上运行的代理服务器