Nginx配置文件分析
文章目录
Nginx文件目录解析
Nginx中主要有四个文件夹:
- conf存放配置文件
- html存放静态页面
- logs存放日志信息
- sbin存放可执行文件nginx
conf文件夹
最主要的文件就是nginx.conf,其它文件在nginx.conf中被引用。
html文件夹
一开始就存放了两个html文件,分别是index页面和访问失败页面。
我也可以自己放入html文件,之后只要配置好规则即可。
logs文件夹
存放了访问信息和错误信息,还有nginx的pid进程识别号。
sbin文件夹
只有一个文件,就是用于启动nginx的文件。
Nginx多进程模型
Nginx
工作模式为多进程,Nginx
在启动之后会有一个master
进程和多个worker
进程(默认1
个),多个worker
子进程将监听master
父进程监听的端口(参考父子进程的关系),并行处理请求。master
父进程主要用来管理worker
子进程(管理真正提供服务的worker
进程,向worker
进程发送信号,监控worker
进程的运行状态,当worker
进程异常退出后,会重新启动新的worker
进程),读取并验证配置信息,master
进程不会对用户请求提供服务,而用户请求是由worker
进程进行处理。
而Nginx的热部署则是给master
进程发送SIGUSR2
信号,让Nginx
平滑升级可执行程序。Nginx重新启动一组master
进程和worker
进程,而新master
进程是旧master
进程的子进程(通过父子进程的继承关系,新master
进程可以很方便地继承旧master
进程的相关资源)。
更多详情可以参考这篇文章:https://www.jb51.net/article/232570.htm
Nginx的运行原理
如下图,从用户发送请求,由Worker进程进行处理,根据配置文件解析请求,最终找到目标资源返回给用户。
Nginx.conf配置文件
最小配置
worker_processes
worker_processes 1;
默认为1,表示开启一个业务进程
worker_connections
worker_connections 1024;
单个业务进程可接受连接数
include mime.types
include mime.types;
引入http mime类型。
default_type application/octet-stream
default_type application/octet-stream;
如果mime类型没匹配上,默认使用二进制流的方式传输。
sendfile on
sendfile on;
使用linux的sendfile(socket, file, len)高效网络传输,也就是数据0拷贝。
全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process
数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
events块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process
下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process
可以同时支持的最大连接数等。
http块
配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,需要注意的是:http 块中包括了 http 全局块、server 块。
- http 全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
- server块
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
#全区块:配置服务器整体运行的配置指令
#user nobody;
#允许进程数量,建议设置为cpu核心数或者auto自动检测
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
# events块:影响 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"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# server块:每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块
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;
}
}
}
虚拟主机原理
虚拟主机是为了在同一台物理机器上运行多个不同的网站,提高资源利用率引入的技术。
自定义配置虚拟主机
- 首先在根目录下新建一个文件夹叫:www
- 然后再www中在创建两个子文件夹,分别为:video、photo
- 在两个子文件夹中各创建一个index.html用于显示页面
- 配置我们本机的hosts添加域名解析:
www.test.com
和ph.test.com
vi nginx.conf
修改配置文件:
在http块中添加两个虚拟主机的配置:
# 自定义虚拟主机配置1
server {
listen 80;
server_name www.test.com;
location / {
#配置根目录和默认页面
root /www/video;
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;
}
}
# 自定义虚拟主机配置2
server {
listen 80;
server_name ph.test.com;
location / {
#配置根目录和默认页面
root /www/photo;
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;
}
}
访问测试:
访问www.test.com
访问ph.test.com
总结
自定义配置虚拟主机可以实现将不用不同域名的访问路由到不同的路径资源下,但是要注意,每一个server
的配置中,server_name
和linsten
二者不可以完全相同,否则会发生冲突。
泛域名解析
简单泛域名解析就是在域名中加入通配符: * ,从而实现所有的次级域名均指向同一IP地址。
例如:*.weibo.com
,*.bilibili.com
…
泛域名解析的好处:
- 避免键入URL详细地址不正确造成没法恰当浏览网址。
- 键入便捷,随意键入哪些标识符都可以浏览总体目标网址(子网址)。
- 能够完成无穷二级域名、出示完全免费URL转发,关于建网站,全自动分派免费网址等作用。自然,泛域名解析也有一个缺点,由于开展泛域名解析得话,就不可以另外在主机空间中浏览好几个不一样的子网址。现阶段,大部分网站域名全是能够开展泛域名解析的。特别注意的是,泛域名解析偏向的IP务必为单独IP地址,共享IP是不能的。
server_name的匹配规则
在一个server_name中,我们可以配置多个域名。
完整匹配
server_name ttt.test.com qqq.test.com;
通配符匹配
通配符匹配起始:
server_name www.test.*;
通配符匹配结尾:
server_name *.test.com;
注意: 精确匹配的优先级大于通配符匹配和正则匹配。
正则匹配
可以使用正则表达式进行匹配。
例如:
server_name ~^[0-9]+\.test\.com$
特殊匹配
server_name ""; 匹配Host没有请求头的情况。
总结
配置时需要注意匹配的优先级,以下情况优先级依次降低:
- 精确的名字
- 以
*
号开头的最长通配符名称,例如*.example.org
- 以
*
号结尾的最长通配符名称,例如mail.*
- 正则匹配,如
~^\.www\.test\.com$
对配置server_name的建议:
- 尽量使用精确匹配
- 当定义大量server_name时或特别长的server_name时,需要在http级别调整
server_names_hash_max_size
和server_names_hash_bucket_size
,否则nginx将会启动失败。