1 nginx配置文件的结构
1)以下是nginx配置文件默认的主要内容:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
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或客户端来主动关掉连接,到此,一个连接就完成了。
|