什么是Nginx
Nginx是一个高性能的http服务器和反向代理服务器。Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 。它支持内核 Poll 模型,能经受高负载的考验。Nginx的架构
Nginx 在启动后以daemon 的方式在后台运行,采用master + worker 的方式工作。master 的任务是接收外界的信号,管理worker结点;worker的作用是处理http请求。
- nginx处理一个请求的流程
todo
nginx对于使用者来说,最重要的是熟悉它的配置文件。下面是一个nginx的一个标准配置文件nginx.conf, 我的想法是把配置文件里面的每一行的作用分析一下,这样可以了解nginx 的基本功能。然后,配置一个nginx静态服务器,作为练手。
-
配置文件中每一行代码功能的分析
# line1 : worker_processes 8
第一行,worker_porcesses 8,表示的是nginx启动之后,会创建8个worker结点来干活。
nginx 的架构是master-worker 的结构,master进程来管理多个worker进程。
- master的作用只是来管理worker进程,启动服务,停止服务,重启加载配置文件。
- worker结点的作用是用来干活的,是来处理http请求的。(刚刚开始看的时候,理解错误了,worker结点是用来处理http请求的,但是并不是每遇到一个http的请求就创建一个worker来处理。worker只会创建有限的个数)
- 对于worker的个数,官方给出的建议是等于cpu核心的个数。nginx的想法并不是通过创建无限多的进程,来提高处理并发请求的能力。ngxin是尽可能的以异步的方式去处理请求。对于worker进程,它的想法是尽可能的减少进程切换的开销,所以进程数等于cpu核心数是最好的状态。(这个又看到一个风骚的操作,就是worker进程去绑定特定的cpu核心,切换环境的开销还可以再高效一点)
#line2~line3 error_log logs/error.log; pid logs/nginx.pid;
第二行到第三行,这个就是指定错误日志的输出位置和进程的pid,这两个文件都存在与logs的文件夹下面。
#line4~line7: events { worker_connections 1024; }
这里遇到了第一个块配置项events,worker_connnects 1024 ;表示的nginx 的默认的并发数目。
那么,一个nginx的最大连接数 = worker_processes * worker_connections
PS : 这里不是很确定,不知道worker_processes * worker_connections
计算出来的是最大连接数,还是最大并发数? 让我再想想这个worker_connnects 1024 是配置文件给的,实际在我的电脑上能不能做到,我接下来用apache ab 压力测试一下。结果以后补充
#line 8 ~line14
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
...
...
include 表示嵌入将其他的配置文件嵌入到当前的配置文件里面。
关于mime.types ,我的理解是:
HTTP request里面有一个头叫 Accept,列出浏览器可以接受的mime type,HTTP response 的Content-Type 的值 在Accept 里面。我的理解是Nginx 会根据请求的文件的扩展名来决定返回什么 Content-Type。
如果Web程序没设置,Nginx也没找到对应文件的扩展名的话,就使用默认的Type,这个在Nginx 里用 default_type定义,比如 default_type application/octet-stream; 。
关于sendfile on
这是nginx 的文件操作的优化配置之一,这个是启用linux上的sendfile系统调用来发送文件,这样就减少了内核态和用户态的切换,减少了两次内存的复制。文件从磁盘里面读取之后直接在内核态里面写入网卡设备,提高了发送文件的效率。
关于nginx文件操作的优化,还有aio,directio,还有文件缓存机制open_file_cache_max等
keepalive_timeout 65;
http请求里面的keepalive 功能是为了让多个请求复用一个http长连接,这个功能可以提高服务器的性能。 keepalive_timeout 表示了一个长连接闲置超过65秒的时候,服务器就会关闭这个链接。
gzip on;
表示启用压缩
#line 17 ~31
server {
listen 80;
server_name localhost;
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;
}
}
每一个server块表示的是一个虚拟主机
listen 80 表示的是在监听的端口是80,server_name 表示的是虚拟主机的名字
line19 ~ line22
location /test {
root html; #这个root也可以不写,因为默认的root就是html
}
假设nginx 的服务器的路径是:
location的作用是,会尝试根据用户的请求中的URI来匹配上面的/URI的表达式,如果可以匹配,就选择location的规则来处理用户的请求。所以,location的作用就是,选择location里面的配置来处理用户的请求。
对于这样的一个location ,对于请求是 127.0.0.1/test/my.html , nginx收到这个请求之后,处理的流程是:
- location 找到test
- 在root的路径对应的html文件夹下面找到test 文件里里面的my.html文件
-
ATTENTION: 注意必须在html的文件夹下面 创建一个名字叫test的文件夹,里面放一个my.html的文件。
如果我有一个静态文件 myindex.html mycss.css 我想搭建一个静态的站点,那直接放到nginx的html文件夹里面就可以了。
小结
小结一下,nginx配置文件的结构图,应该是如下:
这篇文章写的是nginx配置文件的分析,这一篇文章写的是关于nginx的基本使用和一些常用的配置。
https://www.jianshu.com/p/b2817017ddaf