文章目录
-
-
- 1. 启动、停止和重新加载配置
- 2. 配置文件的结构
- 3. 提供静态内容
- 4. 设置简单的代理服务器
- 5. 设置FastCGI代理
- 参考文档
-
nginx有一个主进程和几个工作进程。
主流程的主要目的是读取和评估配置,以及维护工作流程。工作进程对请求进行实际处理。nginx采用基于事件的模型和依赖于操作系统的机制,在工作进程之间有效地分配请求。工作进程的数量在配置文件中定义,可以针对给定的配置进行调整,也可以根据可用的CPU内核数量自动调整。从句法上很容易理解worker_processes number | auto,工作进程数的最佳值取决于许多因素,包括(但不限于)CPU内核数,存储数据的硬盘驱动器数以及加载模式。将其设置为可用的CPU内核数将是一个不错的开始(值 auto 将尝试自动检测)。
1. 启动、停止和重新加载配置
要启动nginx,请运行可执行文件。一旦启动nginx,就可以通过使用-s参数调用可执行文件来对其进行控制。语法如下:
nginx -s signal
其中signal可能是以下之一:
- stop 快速退出
- quit 正常退出
- reload 重新加载配置文件
- reopen 重新打开日志文件
例如,要停止nginx进程并等待工作进程完成对当前请求的服务,可以执行以下命令:
nginx -s quit
此命令应由启动nginx的用户执行。
只修改配置文件是不会生效的,如果想让修改的配置文件生效,需要向nginx发送reload信号或者重新启动nginx。要重新加载配置,请执行:
nginx -s reload
一旦主进程接收到重新加载配置的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。如果成功,则主进程将启动新的工作进程并将消息发送到旧的工作进程,要求它们关闭。否则,主进程将回滚更改并继续使用旧配置。旧的工作进程接收到关闭命令,停止接受新的连接并继续为当前请求提供服务,直到服务结束。之后,旧的工作进程退出。
也可以借助Unix工具(如kill命令)将信号发送到nginx进程。在这种情况下,信号将直接发送至特定进程。默认情况下,nginx主进程的进程ID将写入目录/usr/local/nginx/logs或/var/run中的nginx.pid。例如,如果主进程ID为1628,要发送quit信号使NGINX正常关闭,请执行:
kill -s QUIT 1628
为了获取所有正在运行的nginx进程的列表,可以使用ps命令,例如:
ps -ax | grep nginx
2. 配置文件的结构
nginx由众多模块组成,这些模块受配置文件中的指令控制。指令分为简单指令和块指令。简单指令由名称和参数组成,这些名称和参数用空格分隔,并以分号;结尾。块指令与简单指令具有相同的结构,但它以一组附加指令结尾,这些指令被大括号 { } 包围,而不是分号。如果块指令可以在大括号中包含其他指令,则称之为上下文(例如: events, http, server和 location)。
放置在配置文件中任何上下文之外的指令都被视为位于主上下文中。events和http指令位于主上下文,server指令位于http,location在server中。
以行为单位,#符号后面的其余部分被视为注释。
3. 提供静态内容
Web服务器的一项重要任务是分发文件(例如图像或静态HTML页面)。您将实现一个示例,其中根据请求,将从不同的本地目录提供文件:/data/www (包含HTML文件)和/data/images(包含图像)。这需要编辑配置文件,在http块中设置一个server块,server块中有两个location块。
首先,创建/data/www目录,并在其中放置一个index.html,其中包含文本内容。然后创建/data/images目录,并在其中放置一些图像。
接下来,打开配置文件nginx.conf。默认配置文件已经包含server块的几个示例,大部分已被注释掉。现在注释掉所有这样的块并新建一个新 server块:
http {
server {
}
}
通常,配置文件可以包括多个server块,这些server块由它们侦听的端口和服务器名称区分。一旦nginx决定由哪个server处理请求,它就会根据server块中定义的location指令的参数来检测请求头中指定的URI。
将以下location块添加到该server块:
location / {
root /data/www;
}
与请求中的URI相比, 此location块指定“ /”前缀。对于匹配的请求,会将URI添加到root 指令中指定的路径 ,即添加到/data/www,以形成本地文件系统上所请求文件的路径。如果有多个匹配的location块,nginx将选择前缀最长的块。location上面的块提供了最短的前缀,长度为1,因此,只有在所有其他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文件。如果不存在这样的文件,将发送一个表示404错误的响应。URI不以/images/开头的请求将映射到/data/www目录。例如,为了响应http://localhost/some/example.html请求,nginx将发送/data/www/some/example.html文件。
为了应用新配置,如果nginx尚未启动,则启动nginx,或者发送reload信号到nginx主进程:
nginx -s reload
如果出现问题,您可以尝试在/usr/local/nginx/logs或/var/log/nginx目录下的access.log和error.log文件中查找原因。
文章图片
4. 设置简单的代理服务器
NGNX的常见用途之一是将其设置为代理服务器,这意味着服务器接收请求,将它们传递给代理服务器,从代理服务器获取响应,并发送给客户端。
我们将配置一个基本的代理服务器,该服务器从本地目录提取文件来响应图像请求,并将所有其他请求发送到代理服务器。在此示例中,两个服务器都将在1个nginx实例上定义。
首先,通过向NGIX配置文件中添加一个server块来定义代理服务器,其内容如下:
server {
listen 8080;
root /data/up1;
location / {
}
}
这将是一个简单的服务器,它监听端口8080,并将所有请求映射到本地文件系统上的/data/up1目录。创建此目录并将index.html文件放入其中。注意,root指令放在server上下文中。当响应http请求的location块中没有root指令时,使用该root指令。
接下来,使用上一部分中的服务器配置并对其进行修改以使其成为代理服务器配置。在第一个location块中,将 proxy_pass 指令与参数中指定的代理服务器的协议,名称和端口(在本例中为http://localhost:8080)放置在一起:
server {
location / {
proxy_pass http://localhost:8080;
}location /images/ {
root /data;
}
}
我们将修改第二个location块,该块当前将带有/images/前缀的请求映射到/data/images目录下的文件,以使其与具有典型文件扩展名的图像的请求相匹配。修改后的location块如下所示:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
该参数是一个正则表达式,匹配以.gif、.jpg或.png结尾的所有URI。正则表达式前面应加~。相应的请求将映射到/data/images目录。
当nginx选择一个location块来处理请求时,它首先检查指定前缀的location指令,记住前缀最长的location,然后检查正则表达式。如果与正则表达式匹配,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。
5. 设置FastCGI代理
nginx可用于将请求路由到FastCGI服务器,该服务器运行使用各种框架和编程语言(如PHP)构建的应用程序。
使用FastCGI服务器的最基本nginx配置包括使用FastCGI_pass指令代替proxy_pass指令,以及使用fastcgi_param 指令来设置传递给FastCGI服务器的参数。假设可通过localhost:9000访问FastCGI服务器,以上一节中的代理配置为基础,将proxy_pass指令替换为fastcgi_pass指令并将参数更改为 localhost:9000。在PHP中,SCRIPT_FILENAME 参数用于确定脚本名称,QUERY_STRING 参数用于传递请求参数。结果配置为:
server {
location / {
fastcgi_passlocalhost: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。
注意:
- 安装php,php-fpm之后启动,在nginx/html目录下放置.php的测试文件,即可进行验证。
- 如果需要通过FastCGI访问其他格式结尾的文件,需要在php-fpm的配置文件中进行添加:
security.limit_extensions = .php .php3 .php4 .php5 .html
- 可以在nginx配置文件中添加 fastcgi_index info.php;
指定FastCGI的默认首页。
文章图片
【Nginx|NGINX初学者指南】https://nginx.org/en/docs/beginners_guide.html
推荐阅读
- nginx|nginx 初学者指南
- nginx的root和alias详解
- nginx|CVE-2013-4547 Nginx 文件名逻辑漏洞
- nginx|业务前端界面报错504排查思路和解决办法
- 运维|用Nginx做端口转发(反向代理)
- Linux系统|互联网最受欢迎的开源Web服务器软件——Nginx的搭建和优化
- Nginx|Nginx笔记——代理服务配置
- 服务器运维|LNMP详解(八)——Nginx动静分离实战配置
- linux|Web服务(08)——Nginx的Rewrite