ngnix入门指南
本指南给出了nginx的基本介绍,并介绍了可以使用它的完成一些简单任务。 它假定nginx已经安装在读者的机器上。 如果不是,请参阅安装nginx页面。 本指南介绍如何启动和停止nginx,重新加载其配置,解释配置文件的结构,并介绍如何设置nginx以提供对静态内容的访问支持,如何配置nginx作为代理服务器,以及如何将其与 FastCGI应用程序对接起来。
nginx有一个主进程和几个工作进程。 主进程的主要目的是读取和评估配置,并维护工作进程。 工作进程做请求的实际处理。 nginx采用基于事件的模型和OS依赖的机制,在工作进程之间有效地分配请求。 工作进程的数量在配置文件中定义,对于给定配置可以是固定的,也可以根据可用CPU核心的数量自动调整(请参阅 worker_processes)。
nginx及其模块的工作方式在配置文件中确定。 默认情况下,配置文件名为nginx.conf,并放在目录/ usr / local / nginx / conf,/ etc / nginx或/ usr / local / etc / nginx中。
1. 启动,停止,重载配置文件
- 启动
要启动nginx,请运行可执行文件。 一旦nginx启动,它可以通过使用-s参数调用可执行文件来控制。 使用以下语法:
nginx -s signal
其中signal可以是以下之一:
- stop - 快速关机
- quit - 正常关机
- reload - 重新加载配置文件
- reopen - 重新打开日志文件
例如,在停止nginx进程前,等待工作进程完成当前请求,可以执行以下命令:
nginx -s quit
这个命令应该在启动nginx的那个用户下执行。
如果想要配置文件中所做的更改立即生效,需要执行重新加载配置的命令或重新启动ngnix。要重新加载配置,请执行:
ngnix -s reload
一旦主进程接收到要重载配置的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。如果上述步骤成功,主进程将启动新的工作进程,并向旧工作进程发送消息,请求它们关闭。 否则,主进程会回滚更改,并继续使用旧配置。 旧工作进程接收到关闭的命令,停止接受新连接并继续服务当前已接受的请求,直到所有这样的请求被服务。 之后,老工作进程退出。
也可以使用Unix工具(如kill实用程序)发送信号给nginx进程。 在这种情况下,信号被直接发送到具有给定进程ID的进程。 默认情况下,nginx主进程的进程ID被写入目录/ usr / local / nginx / logs或/ var / run中的nginx.pid。 例如,如果主进程ID为1628,要发送QUIT信号导致nginx的正常关闭,请执行:
kill -s QUIT 1628
为了获得所有正在运行的nginx进程的列表,可以使用ps实用程序,例如,以下列方式:
ps -ax | grep ngnix
更多关于发送信号给ngnix的信息,请参见Controlling ngnix
2. 配置文件的结构
例子,如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ .php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ .php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
解释:nginx由模块组成,这些模块由配置文件中指定的指令控制。 指令分为简单指令和块指令。一个简单的指令包含名称和参数,以空格分隔,以分号(;)结尾。块指令具有与简单指令相同的结构,但是以用大括号({})包围的一组附加指令结束。如果块指令的大括号内有其他指令,则它被称为上下文(例如:events, http, server, and location)。
在配置文件中,不包含在任何上下文中的指令被认为是在主上下文中的指令。 events 和 http 指令驻留在主上下文中,server 位于 http 中,而 location 在 sever 中的位置。
#符号开头的是注释。
3. 静态内容服务
一个Web服务器的重要任务是对外提供文件(例如图像或静态HTML页面)服务。我们将实现一个示例,根据请求,文件将从不同的本地目录:/data/ www(可能包含HTML文件)和 /data/ images(包含图像)提供。 这将需要编辑配置文件:在 http 块中有一个 server 块,这个 server 块又包含了两个 location 块。
- 创建 /data/www 目录,并将包含任意文本内容的index.html文件放入其中,并创建 /data/images目录并在其中放置一些图像。
- 打开配置文件。 默认配置文件已经包括 server 块的几个示例,大多是被注释掉的语句。现在注释掉所有这些块并开始编译一个新的 server 块:
http {
server {
}
}
通常,配置文件可以包括若干 server 块,这些块通过其监听的端口和 server names 来区分。 一旦nginx决定哪个服务器处理请求,它将根据在服务器块中定义的位置指令的参数测试请求头中指定的URI。
将以下 location 块添加到 server 块:
location / {
root /data/www;
}
此 location 块指定与请求中的URI相匹配的“/”前缀。 对于匹配的请求,URI将被添加到根指令中指定的路径,即 /data/www,以形成本地文件系统上被请求的文件的路径。 如果有几个匹配的 location 块,nginx选择具有最长前缀的那个。上面的位置块提供最短的前缀,长度为1,因此只有当所有其他 location 块不能提供匹配时,才使用该块。
3. 添加第二个 location 块:
location /images/ {
root /data;
}
它将匹配以 /images/(location/ 也能匹配这样的请求,但较/images/更短,这里是长匹配优先)开始的请求。
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 / 开头的 URI 请求将映射到 /data /www目录下。 例如,响应http://localhost/some/example.html请求,nginx将发送 /data/www/some/example.html 文件。
要应用新配置,请启动nginx(如果尚未启动)或通过执行以下命令向nginx的主进程发送重新加载信号:
ngnix -s reload
如果某些东西不能按预期工作,您可以尝试在/usr/local/nginx/logs或/var/log/nginx目录中的access.log和error.log文件中找出原因。
4. 配置一个简单的代理服务器
nginx的一个常见用途是将其设置为代理服务器(接收请求并将它们传递到被代理的服务器,检索来自被代理服务器的响应,并将响应发送到客户端)。
我们将配置一个基本代理服务器,该服务器读取本地目录中的文件来响应图片请求,并将处图片请求以外的其他请求(request)转发到代理服务器上。 在此示例中,这两个服务器都将在一个nginx实例上定义。
- 首先,通过向nginx的配置文件中添加一个 server 块来定义代理服务器,该配置文件包含以下内容:
server {
listen 8080;
root /data/up1;
location / {
}
}
这将是一个简单的服务器,侦听端口8080(以前,未指定listen指令,因为使用标准端口80),并将所有请求映射到本地文件系统上的/ data / up1目录上。 创建此目录并将 index.html 文件放入其中。 注意,root指令放在了 server 上下文中。 Such root directive is used when the location block selected for serving a request does not include own root directive.
2. 使用上一节中的服务器配置,并将其修改为代理服务器配置。 在第一个 location 块中,将 proxy_pass 指令与参数中指定的代理服务器的协议(http),名称和端口(在我们的示例中为http:// localhost:8080)放在一起:
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我们将修改第二个位置块,它目前是将带有 /images/ 前缀的请求映射到 /data/images 目录下的文件,以使其与常见文件扩展名的图像请求相匹配。 修改的位置块如下所示:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ .(gif|jpg|png)$ {
root /data/images;
}
}
此服务器将过滤以.gif,.jpg或.png结尾的请求,并将它们映射到 /data/images 目录(通过向根指令的参数添加URI),并将所有其他请求传递到上面配置的代理服务器。
最终完整版的ngnix配置文件如下:
http {
//静态服务器
server {
listen 8080;
root /data/up1;
location / {
}
}
//代理服务器
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ .(gif|jpg|png)$ {
root /data/images;
}
}
}
要应用新配置,请将重新加载信号发送到nginx,如上一节所述。
更多关于配置代理服务器的指令信息请参见更多
5. 设置FastCGI代理
nginx可用于将请求路由 到 运行着使用各种框架和编程语言(如PHP)构建的应用程序的FastCGI 服务器上。
使用FastCGI服务器的最基本的nginx配置包括使用 fastcgi_pass 指令代替 proxy_pass 指令,以及使用fastcgi_param 指令来设置传递给 FastCGI 服务器的参数。 假设 FastCGI 服务器可在 localhost:9000 上访问。 以上一节中的代理配置为基础,使用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 )操作的代理服务器。