关于nginx:点击参考
nginx有一个主进程和多个工作进程。主进程用于阅读和评估配置,并且维护工作进程。工作进程用于实际处理请求。nginx使用基于事件的模型和依赖于操作系统的机制在工作进程之间有效地分发请求。工作进程的数量在配置文件中定义,可以针对给定的配置进行固定,也可以根据可用的CPU内核数量自动调整。
nginx及其模块的工作方式在配置文件中确定。 默认情况下,配置文件名为nginx.conf
,并放置在目录/usr/ local/nginx/conf
,/etc/nginx
或/usr/local/etc/nginx
中。
运行可执行文件启动nginx。一旦nginx启动,就可以通过调用带有-s参数的可执行文件来控制它。使用以下语法
nginx -s signal
signal可能是以下参数之一:
例如,要在等待工作进程完成当前请求后停止nginx进程,可以执行以下命令
nginx -s quit
This command should be executed under the same user that started nginx.
在重新加载配置的命令发送到nginx或重新启动之前,不会应用配置文件中的更改。要重新加载配置,请执行
nginx -s reload
nginx由模块组成,模块由配置文件中指定的指令控制。指令分为简单指令和块指令。一个简单的指令由名称和参数组成,以空格分隔,并以分号(;)结束。块指令的结构与简单指令相同,但它的结尾不是分号,而是一组由大括号({和})包围的附加指令。如果一个block指令可以在大括号内包含其他指令,它就被称为上下文(例如:events、http、server和location)。(事件、http、服务器和位置)
放在任何上下文之外的配置文件中的指令被认为是在主上下文中。events和http指令驻留在主上下文中,server在http中,location驻留在server中。
#符号后面的行被认为是注释。
web服务器的一个重要任务是提供文件(如images或静态HTML文件)。下面的一个实例,将根据请求从不同的本地目录提供文件:/data/www
(可能包含HTML文件)和/data/images
(包含图像)。This will require editing of the configuration file and setting up of a server block inside the http block with two location blocks.
首先,创建/data/www
目录,并将包含任意文本内容的index.html
文件放入其中,并创建/data/images
目录,并将一些图像放入其中。
接下来,打开配置文件。默认的配置文件已经包含了几个server块的例子,大部分都被注释掉了。现在注释掉所有这些块并启动一个新的server块。
http {
server {
}
}
通常,配置文件可能包括几个server块,这些server块通过它们监听的端口和server name进行区分。一旦nginx决定哪个服务器(server)处理请求,它就根据服务器块中定义的location指令的参数测试请求头中指定的URI。
在server块中增加一个location块:
location / {
root /data/www;
}
此位置(location)块指定“ /”前缀与请求中的URI相比。 对于匹配的请求(就是以“/”为前缀),会将URI添加到root指令中指定的路径,即/data/www
,以形成本地文件系统上所请求文件的路径。 如果有多个匹配的位置块,nginx将选择前缀最长的位置块。 上面的位置块提供了最短的前缀,长度为1,因此,只有在所有其他位置块均未提供匹配项时,才会使用该块。
关于URI和URL的区别
接下来,添加第二个location块:
location /images/ {
root /data;
}
这将匹配以/images/
开头的请求(location /
也匹配此类请求,但前缀较短,所以失效)。 服务器块的最终配置应如下所示:
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错误。Requests with URIs not starting with /images/
will be mapped onto the /data/www
directory. For example, in response to the http://localhost/some/example.html
request nginx will send the /data/www/some/example.html
file.
启动nginx或nginx -s reload
应用新配置。
如果未按预期结果工作,你可以尝试在
/usr/local/nginx/logs
或/var/log/nginx
中的access.log
和error.log
文件中查找原因
nginx的一个常见用法是将其设置为代理服务器,这意味着服务器接收请求,将其传递给代理服务器,从代理服务器检索响应,再将其发送给客户端。
我们将配置一个基本代理服务器,它使用本地目录中的文件来服务图像请求,并将所有其他请求发送到代理服务器。在本例中,这两个服务器将定义在一个nginx实例上。
首先,通过在nginx的配置文件中添加一个包含以下内容的服务器块来定义代理服务器:
server{
listen 8080;
root /data/upl;
location / {
}
}
这将是一台简单的服务器,它在端口8080上进行监听(在此之前,由于使用了标准端口80,所以没有指定listen指令)并将所有请求映射到本地文件系统的data/upl
文件夹下。创建这个文件夹并在文件夹内创建index.html
。注意到,root
指令放置在server
上下文中。这样的root
指令在location
块被选择去服务请求但没有自己的root
指令时使用。
接下来,使用上一节中的服务器配置并修改它,使其成为代理服务器配置。在第一个location
块中,将proxy_pass
指令与参数中指定的代理服务器的协议,名称和端口放在一起(在本例中为http://localhost:8080
):
server{
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我们将修改第二个位置块,该位置块当前将带有/ images /
前缀的请求映射到/data/images
目录下的文件,以使其与具有典型文件扩展名的图像的请求匹配。 修改后的位置块如下所示:
location ~\.(gif|jpg|png){
root /data/images;
}
该参数是一个正则表达式,它匹配所有以.gif
,.jpg
或.png
结尾的URI。 正则表达式的标记应以〜开头。 相应的请求将映射到/data/images
目录。
当nginx选择一个location
块来服务一个请求时,它首先检查指定前缀的location指令,记住带有最长前缀的location,然后检查正则表达式。如果有一个正则表达式匹配,nginx会选择这个location
,否则,它会选择之前记住的那个位置。
代理服务器的最终配置将如下所示:
server{
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)${
root /data/images;
}
}
该服务器将过滤以.gif
,.jpg
或.png
结尾的请求,并将它们映射到/data /images
目录(通过将URI添加到root指令的参数中),并将所有其他请求传递给上面配置的代理服务器。
可以使用更多的指令来进一步配置代理连接。
nginx可用于将请求路由到FastCGI服务器,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
上运行的代理服务器。