Nginx的的目录结构,基本运行原理及基本配置文件
1 Nginx目录结构
[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp # POST 大文件暂存目录
├── conf # Nginx所有配置文件的目录
│ ├── fastcgi.conf # fastcgi相关参数的配置文件
│ ├── fastcgi.conf.default # fastcgi.conf的原始备份文件
│ ├── fastcgi_params # fastcgi的参数文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types # 媒体类型
│ ├── mime.types.default
│ ├── nginx.conf #这是Nginx默认的主配置文件,日常使用和修改的文件
│ ├── nginx.conf.default
│ ├── scgi_params # scgi相关参数文件
│ ├── scgi_params.default
│ ├── uwsgi_params # uwsgi相关参数文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp # fastcgi临时数据目录
├── html # Nginx默认站点目录
│ ├── 50x.html # 错误页面优雅替代显示文件,例如出现502错误时会调用此页面
│ └── index.html # 默认的首页文件
├── logs # Nginx日志目录
│ ├── access.log # 访问日志文件
│ ├── error.log # 错误日志文件
│ └── nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp # 临时目录
├── sbin # Nginx 可执行文件目录
│ └── nginx # Nginx 二进制可执行程序
├── scgi_temp # 临时目录
└── uwsgi_temp
主要的目录是conf,html,及sbin。
conf目录放的是核心配置文件
html目录放的是静态页面
[root@localhost nginx]# cd html/
[root@localhost html]# ls
50x.html index.html
[root@localhost html]#
50x.html是发生错误展示的页面,index.html是默认的访问页面。可以在该目录下新建html,然后在浏览器中访问,例如在该目录下新建hello.html,内容是hello,然后访问:http://192.168.1.100/hello.html,结果如下:
logs文件夹用于存放日志信息:
[root@localhost nginx]# cd logs/
[root@localhost logs]# ls
access.log error.log nginx.pid
error.log存放出错的信息,nginx.pid存放的是当前nginx的pid。
sbin存放的是可执行文件,可以用 ./nginx启动nginx:
[root@localhost sbin]# ls
nginx
[root@localhost sbin]#
2 Nginx基本运行原理
2.1 Nginx进程模型
Nginx的进程是使用经典的「Master-Worker」模型,Nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。
worker进程主要处理基本的网络事件,多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。
2.2 Worker事件处理机制
传统HTTP服务器是同步处理,当多个客户端请求时,如果Client1的请求被阻塞,Master会fork新的worker进程处理
但是Nginx采用的是异步非阻塞方式,如果Client1的请求被阻塞,worker会取处理下一个请求,不会阻塞当前worker进程。所以Nginx的一个worker进程可以并发处理大量请求
3 Nginx的配置文件
Nginx的默认配置文件是nginx.conf
后面学习Nginx配置,每次修改配置文件,一定要重载才能生效
systemctl reload nginx # 以系统服务的方式启动nginx
3.1 nginx.conf配置文件
# master进程会启动worker进程,该选项设置在系统中显示启动该进程的用户名(一般不改动,默认nobody)
# user nobody
# 启动的worker进程数
worker_processes 1;
# 错误日志放置的路径 notice、info是错误日志的级别,比如:info就是日志级别大于info才生成日志
# 默认地址为/var/log/nginx/error.log ,可通过nginx -V返回的--eror-log-path字段获取实际值
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# pid文件存放路径,默认:/var/run/nginx/nginx.pid,可通过nginx -V返回的--pid-path字段获取实际值
#pid logs/nginx.pid;
# 配置事件处理方式、worker最大连接数
events {
use epoll; # 使用epoll事件处理机制(默认值)
worker_connections 1024; # 每个worker进程处理的最大连接数
}
# http模块配置
http {
include mime.types; #include是引入关键字,这里引入了mime.types这个配置文件的内容(同在conf目录下,mime.types是用来定义,请求返回的content-type)
default_type application/octet-stream; #mime.types未定义的,使用默认格式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"';
# 访问日志地址,默认:/var/log/nginx/access.log,可通过nginx -V返回的--http-log-path字段获取实际值
#access_log logs/access.log main;
# 详见下文
sendfile on;
#tcp_nopush on;
keepalive_timeout 65; # TCP链接超时时间,单位秒
# 压缩相关,详见下文
gzip on; # 开启压缩,压缩后发送给客户端
# 详见下文
server {
//xxx
}
}
3.2 sendfile配置
打开sendfile,用户请求的数据不用再加载到nginx的内存中,而是直接发送
高负载的场景下,使用 sendfile 功能可以降低 CPU 和内存的占用,提升服务器性能
打开sendfile,用户请求的数据不用再加载到nginx的内存中,而是直接发送
高负载的场景下,使用 sendfile 功能可以降低 CPU 和内存的占用,提升服务器性能
3.3 gzip压缩
http{
gzip on; # 开启压缩,压缩后发送给客户端
gzip_min_length 1;# 设置最小压缩下限。1就是小于1字节的文件不压缩
gzip_comp_level 3 # 压缩级别0-9,值越大文件就压缩的越小,相应的会损耗更多性能
gzip_type text/plain application/javascript image/* # 指定哪些 MIME 类型,开启压缩(不写默认全部),可以使用通配符 image/* 就是所有图片。具体哪些类型可以看conf/mime.types文件
}
nginx 中的 gzip 压缩分为动态压缩、静态压缩
动态压缩:服务器给客户端返回响应时,消耗自身的资源进行实时压缩,保证客户端拿到 gzip 格式的文件
gzip on开启的就是动态压缩,gzip_comp_level设置的级别高,可能会造成CPU占用过高(文章:简单一招竟把nginx服务器性能提升50倍)
静态压缩:直接将预先压缩过的 .gz 文件返回给客户端,不再实时压缩文件,如果找不到 .gz 文件,会使用对应的原始文件
该功能需要模块:
ngx_http_gzip_static_module
(默认不会被构建)我们可以通过下面命令查看,当前安装的是否包含该模块
./nginx -V
如果不包含,需要重新编译Nginx
./configure --with-http_gzip_static_module # 指定编译配置,这个参数安装模块`ngx_http_gzip_static_module`
make # 编译
make install # 安装
包含该模块,则可以启用下面配置
http{
gzip_static on;
gzip_proxied expired no-cache no-store private auth;
}
3.4 server配置
虚拟主机配置
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;
}
}
虚拟主机
原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务
servername匹配规则
我们需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。
完整匹配
我们可以在同一servername中匹配多个域名
server_name vod.mmban.com www1.mmban.com;
通配符匹配
server_name *.mmban.com;
通配符结束匹配
server_name vod.*;
正则匹配
server_name ~^[0-9]+\.mmban\.com$;
评论区