nginx配置文件及工作原理详解
1 nginx配置文件的结构
1)以下是nginx配置文件默认的主要内容:
#user nobody; #配置用户或组,默认为nobody nobody
worker_processes 1; #允许生成的进程数,默认为1,该数量就是worker进程的数量,一般设置为与cpu数量相等。也可以设置为auto,表示自动匹配cpu核数
#error_log logs/error.log; #指定日志路径和级别 ,级别依次为:debug、info、notice、warn、error、crit、alert、emerg
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #指定nginx进程运行文件存放地址
events {
worker_connections 1024; #允许的最大连接数
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#这里是一些自定义格式,其中$remote_addr与$http_x_forwarded_for用于记录客户端ip地址;$remote_user用于记录客户端用户名;$time_local用于记录访问时间和时区;$request用来记录请求的url与http协议;$status记录请求状态;$body_bytes_sent记录发送给客户端文件主体内容大小;$http_referer记录从哪个链接访问的;$http_user_agent记录客户端浏览器相关信息
#access_log logs/access.log main;
sendfile on; ##允许传输文件的方式
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; ##连接超时的时间
#gzip on; ##压缩方式
server {
listen 80;
server_name localhost; #监听地址
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm; #设置默认页
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
- nginx配置文件中包含http模块,而http模块中又包含server模块,server模块中包含有location模块,其中:
- events模块:与用户的网络连接相关
- http模块:可以实现与http协议有关的公共配置,例如代理,缓存,日志,以及第三方模块的配置
- server模块:提供http服务配置,一个http模块中可以配置多个server
- location模块:主要用作地址定向,实现路径和服务器建立连接,一个server中可以包含多个location
2)在配置文件中多添加一个location,注意区分两个location
- 第一个location后面的 / 代表我们从浏览器访问默认发布页面时后面的 /,也就是说当我们在浏览器中输入 http://192.168.149.201/ 去访问默认发布页面时,该url后面的 / 就等于location后面的 / ,也就是说他会默认访问到服务器上的
/usr/local/nginx/html/index.html
文件。 - 而root指令表示的是当前location对应的文档根目录是哪里,那么 root html 就表示当前location的文档根目录是html目录,文档根目录是指 当有人访问 / 这个路径时,去服务器的哪个目录中寻找对应的资源,也就是说html就是当前location的资源目录,html目录指的是相对nginx安装目录的相对路径。
- 第二个location后面是/demo,root指令后面是/opt表示用户访问时,输入的url是http://192.168.149.201/demo,但实际上的资源路径时 http://192.168.149.201/opt/demo/index.html
- 注意:当配置文件中的index里的指令相同时(如上图的情况),此时可以将相同的部分提出来,写在serverl里,如下所示。不过需要注意的是,它对应的作用域会有所不同
server {
listen 80;
server_name localhost
index index.html index.htm; ###
location / {
root html;
}
location /demo {
root /opt;
}
}
3)root和alias的区别:
- 我们除了用root将url和资源路径联系起来之外,还可以使用alias指令
location /demo {
alias /opt;
}
- 上述配置表示当我们访问 /demo/index.html 时,其实就是在访问服务器的/opt/demo/index.html ,也就是说location的url与alias的路径完全对等;并且alias只能用于location块中
4)注意,为避免cpu在切换晋城市产生消耗,我们可以将worker进程和某个cpu进行绑定,这样可以使得worker更好的使用某个cpu上的缓存,并以此来减少cpu因切换worker进程从而导致的缓存失效。实现该方法需要使用 worker_cpu_affinity
指令写入全局块中,它的表示方法是使用0和1表示,1表示使用哪一个cpu,0小时cpu个数,从右边开始算,例如4核的cpu,要使用其中第三个核,则 worker_cpu_affinity 0100
2 nginx工作原理
(注:图来自百度)
- 当我们启动nginx后,它会启动两个进程,master和worker。其中worker进程是用于处理真正请求的,而master进程的主要作用是 用于管理worker进程,它会读取配置文件、判断配置文件语法等,它还负责接受信号,将信号分发给worker进程,监听worker进程工作状态,当worker进程非正常退出时,负责启动新的worker进程。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的 。一个请求,只可能在一个worker进程中处理
- nginx处理请求的过程:
- nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址;然后在nginx的master进程里面,先初始化好这个监控的socket,再进行listen;然后再fork出多个子进程出来, 子进程会竞争accept新的连接。
- 此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后;某一个子进程会accept成功,然后Nginx创建对连接的封装,即ngx_connection_t结构体。接着,根据事件调用相应的事件处理模块,如http模块与客户端进行数据的交换。
- 最后,nginx或客户端来主动关掉连接,到此,一个连接就完成了。