Nginx 如何处理请求

摘要:以下内容翻译 Nginx 官网:How nginx processes a request 文章。之前一篇博文简单编译安装了 Nginx,接下来我们看下 Nginx 的配置文件 nginx.conf 和 Nginx 如何处理静态内容,设置反向代理等配置。

Nginx 配置文件位置

nginx 编译安装完成后,nginx 的配置文件 nginx.conf 默认在 /usr/local/nginx/conf  目录下。安装方式不同,文件的默认位置不同,也有可能在 /etc/nginx 或 /usr/local/etc/nginx 目录下。


文件结构

1、nginx 由模块组成,这些模块由配置文件中指定的指令控制,指定分为简单指令和块指令。

2、简单指令由名称和参数组成,用空格分割,以分号(;)结束。

3、块指令以大括号({})包围的一组附加指令结束。

4、# 后面是注释。

5、根据 nginx.conf 配置文件结构,我们可以将它分为三块:全局块、events 块、http 块(http 块包括 http 全局块和 server 块)。

#最外面的配置项就是全局快,比如:
worker_processes 1;

#events 配置块
events {

}

#http 配置块
http {
    
    #server 配置块
    server {
    
        #location 配置块
        location / {
            root /usr/local/nginx/html;
        }
    }
}

以上的配置项,足以让你看见 Welcome to nginx! 页面,看来这样配置是没有问题的,非常完美。


处理静态内容

web 服务器主要任务就是提供文件,例如图像或静态 html 页面。这些都是在 http 模块中配置 server 模块然后再配置 location 模块来操作。

首先我们创建两个目录 /usr/local/nginx/html(这个目录不用创建了,因为 nginx 默认已经有了。我的是一个 index.html 和 50x.html 文件)和 /usr/local/nginx/images 目录,然后 /usr/local/nginx/images 目录中放一张名字为 example.png 图片。

#nginx.conf 配置文件中 http 模块这样配置
server {
    location / {
        root /usr/local/nginx/html;
    }
}

上面这段配置大致就是 location 指定 / 与请求中的 url 进行比较的“ ”前缀。对于请求 url 会匹配到此 location / { } 模块,然后找到指定的 /usr/local/nginx/html 目录中的 html 文件。如果存在多个 location 模块,则 nginx 优先选择最长的匹配的模块,当所有 location 模块无法匹配是,就会选择 location  / {} 模块进行匹配。

#接下来再增加第二个 location 模块
server {
    location / {
        root /usr/local/nginx/html;
    }
		
    location /images/ { 
        root /usr/local/nginx/; 
    } 
}

上面这段配置大致就是 nginx 默认监听 80 端口,假如访问 url 是 http://localhost/images/example.png,那么服务器将从  /usr/local/nginx/images 目录中查找文件,url 中的 /images/ 关键字将匹配映射到 /usr/local/nginx/html 目录。

例如:响应 http://localhost/50x.html  请求 nginx 将发送 /usr/local/nginx/html/50x.html 文件。


设置简单的代理服务器

nginx 的一个常见用途是将其设置为代理服务器。这意味着服务器接收请求,将它们传递给代理服务器,从中检索响应,然后将它们发送给客户端。

我们将配置一个基本代理服务器,它使用来自本地目录的文件处理图像请求,并将所有其他请求发送到代理服务器。

http {
	server {
	    listen 8080;
	    root /usr/local/nginx/html;
		
	    location / {
	    
	    } 
	}
	
	server {
        location / {
            proxy_pass http://localhost:8080/; 
        }
			
        location ~ \.(gif|jpg|png)$ {
            root /usr/local/nginx/images; 
        } 
	}
}

该参数 location ~ \.(gif|jpg|png)$ {} 是一个正则表达式,该表达式匹配所有结尾是  .gif、.jpg、.png 请求。然后服务器每次收到比如 http://localhost/example.png 这样的 url 时,服务器会自动按照匹配规则映射到 /usr/local/nginx/images 目录。

当nginx选择一个 location 块来提供请求时,它首先检查指定前缀的位置,刚才讲 location 优先匹配最长前缀,然后检查正则表达式。如果与正则表达式匹配,则 nginx 选择此项 location 配置块。否则,它会选择 location / {} 模块,然后将请求传到上面的代理服务器。


一个简单的 PHP 站点配置

我们都知道 nginx 是无法处理动态请求的,例如 php 文件。nginx 都是将以 php 结尾的文件传递给你 fastcgi 服务器,然后处理完成后再返回给 nginx 服务器,然后再由 nginx 返回给客户端。

1、假如此时请求一个 index.php 文件,nginx 会与正则表达式 \.(php)$ 匹配,向上面那个匹配静态资源一样。

2、然后请求被传递给监听 localhost:9000 的 fastcgi 服务器(这里有两种方式:一种是 sock 文件方式,一种是 tcp 监听 ip 端口方式 )。

3、该 fastcgi_param 指令设置 fastcgi 的参数 SCRIPT_FILENAME 为 /data/www/index.php,并且 fastcgi 的服务器执行文件。变量 $document_root 等于 root 指令的值,变量 $fastcgi_script_name 等于请求 rul,即 /index.php。

events {

}
http {
	server {
	    location / {
			root /usr/local/nginx/html;
	    }

		location ~* \.php$ {
			fastcgi_index   index.php;
			fastcgi_pass    127.0.0.1:9000;
			include         fastcgi_params;
			fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
			fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
		}
	}
}


参考:

How nginx processes a request

结束语:感谢您对本网站文章的浏览,欢迎您的分享和转载,但转载请说明文章出处。
Top