Nginx API 学习之一:初学者指南
初学者指南
[nginx documentation][http://nginx.org/en/docs/]
1. 启动、停止和重启配置
通过运行可执行文件启动 nginx,一旦 nginx 已经启动,可以通过调用可执行的带 -s 参数进行控制,使用下面语法:
nginx -s signal
signal 可以使以下中的一个:
- stop:快速停止
- quit:温和停止
- reload:重载配置文件
- reopen:重启日志文件
例如,若是等待工作进程完成当前请求的服务,再停止 nginx 进程,执行下面命令:
nginx -s quit
此命令执行前提是,同一个用户启动的 nginx 进程
修改配置文件,使其生效,需要发送重载配置信号到 nginx,或是重启 nginx 进程。重载配置文件,执行:
nginx -s reload
一旦主进程收到重载配置信号,会执行检查新配置文件语法的有效性,尝试运用新文件中的配置。如果成功,主进程启动新的工作进程,并发送关闭消息给旧的工作进程。否则,主进程回滚继续使用旧的配置工作。旧的工作进程,接收到关闭命令后,停止接受新连接,并继续服务当前请求直至服务完成,之后,旧的工作进程退出。
nginx 进程也会接收Unix工具发出的类似 kill 的信号。这种情况下,信号直接发送到指定进程ID的进程,nginx主进程的进程ID默认写入 /usr/local/nginx/logs 或者 /var/run 目录中的nginx.pid。例如。若主进程ID是1628,发送 QUIT 信号来执行温和停止,执行:
kill -s QUIT 1628
使用 ps 命令查看所有在运行 nginx 进程,例如下面方式:
ps -ax | grep nginx
关于nginx信号发送的更多信息,请查看Controlling nginx。
2. 配置文件结构
nginx多个模块组成,这些模块由配置文件中的具体指令控制。指令分为简单指令和块指令。一个简单指令由名称和参数组成,以空格区分并以英文分号(;)结尾。块指令结构与简单指令相同,但是不以英文分号结尾,块指令由英文大括号包围({和})。块指令大括号内包含的其它指令,称为内容(例如events, http, server, 和 location)
配置文件中的指令,无论哪个上下文外层都应该在对应的 main中,events 和 http 在 main 内,server 在 http 内,location 在 server 内。
# 开始的内容表示该行为注释内容。
3. Serving静态内容
web服务器的一个重要任务是文件服务(例如文件或者静态 HTML 网页)。根据需求实现一个例子,文件来源于本地不同目录:/data/www(包含 HTML 文件),/data/images(包含图片文件)。这将需要编辑配置文件,在 http 块内增加一个 server 块,里面包含2个 location 块。
首先,创建目录 /data/www,添加 index.html 文件到该目录,文件中写入一些内容。创建目录 /data/images,存入一些图片文件。
其次,打开配置文件,配置文件 server 块中默认包含一些样例,大部分是注释掉的。现在注释掉所有例子,重新开始编写 server 块。
http {
server {
}
}
通常来说,配置文件中可能包括几个 server 块,通过监听端口号和服务名称来区分。一旦 Nginx 需要确定用哪一个 server 处理请求,通过匹配请求头部信息中 URI 数据与配置文件 server 块定义的 location 指令。
将下面的 location 块添加到 server 块:
location / {
root /data/www;
}
上面 location 块指定 “/” 与请求中的 URI 进行比较。为了匹配请求数据,请求路径中需要加入 root 指令中定义的 URI 信息,即 /data/www ,来组成请求的文件在本地文件系统的目录。如果有多个匹配的 location 块,Nginx 选择前缀最长的一个,上面的 location 提供了前缀最短的一个,相对对于前缀长的一个,所以,仅当其它的 location 都不匹配的时候,才使用最短的这个。
再次,添加第二个 location 块:
location /images/ {
root /data;
}
这个会匹配以 /images/ 开头的请求(location / 也匹配这个请求,但是前缀更短)。
最终的 server 块如下所示:
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/ 开头的响应,Nginx 会匹配到 /data/www 目录,例如,对于 http://localhost/some/example.html 请求,将发送 /data/www/some/example.html 文件。
使修改配置文件生效,若是 Nginx 服务没有启动,则启动服务,否则发送 reload 信号到 nginx 主进程,通过执行以下命令:
nginx -s reload
如果有些内容未达到期望效果,可以试着从日志文件 access.log 或 error.log 中查找原因,文件在目录 /usr/local/nginx/logs 或 /var/log/nginx 中。
4. 建立一个简单代理服务
nginx长作为一个代理服务器使用,作为一个服务器接收请求、转至被代理的服务器、从被代理服务器返回响应并发送给客户端。
我们来配置一个基本的代理服务器,服务图片请求,文件来自本地目录,其它请求发送到一个代理服务器。在这个例子中,服务器和代理服务器定义在一个 nginx 实例上。
首先,定义代理服务器,通过在配置文件中增加一个 server 块,如下所示:
server {
listen 8080;
root /data/up1;
location / {
}
}
这是一个简单的服务器监听8080端口(之前,自80端口占用之后,listen 指令还未被指定),并把所有请求匹配到 本地文件系统的 /data/up1 目录。创建这个目录并放入 index.html 文件。注意,root 指令放在 server 内,这个 root 指令在 请求匹配的location 块中没有 root 时使用。
其次,使用前面部分 server 配置,把它调整为一个代理服务器。在一个 location 块,添加 proxy_pass 指令,参数部分指定被代理服务器的协议、名称和端口号(我们这里是 http://localhost:8080):
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我们将修改第二个 location 块,当前匹配前缀为 /images 的请求到 /data/images 目录的文件。为了使它匹配典型的文件扩展请求,做如下调整:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
参数是正则表达式来匹配所有以 .gif, .jpg 或 .png 结尾的URI,正则表达式以 ~ 开始。符合规则的请求将匹配到 /data/images 目录。
nginx选择 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,见上文。
配置代理服务器更多指令见more 。
5. 建立 FastCGI 代理
nginx可以用于把请求路径转至 FastCGI 服务器,提供不同框架的应用的运行和不同语言的编程(如 PHP)。
FastCGI 服务器最基本配置包括使用 fastcgi_pass 指令代替 proxy_pass,fastcgi_param 指令设置参数传输至
FastCGI 服务。假设可以通过 localhost:9000 访问 FastCGI 服务器。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 将除了静态图片之外的所有请求传输至代理服务器。
浙公网安备 33010602011771号