基本介绍
Nginx简介
Nginx是一款高性能的Web服务器软件,能在高并发环境下快速响应http/https请求,同时也提供IMAP/POP3/SMTP服务,可用于反向代理服务器、虚拟主机、域名解析、负载均衡、防盗链、URL重定向、http/https、邮件代理服务器等各类场景。
根据Netcraft 发布的web服务器调查报告,截至2022年1月,nginx是全球最常用的web服务器软件,占有全球32.3%的站点,另一服务器软件Apache占有23.9%的站点,很大一部分web服务器使用Nginx作为负载均衡服务器。
依赖与环境
操作系统要求:Nginx底层使用了多进程和I/O多路复用(epoll)来提高并发能力,因此需要使用Linux2.6以上的内核以支持epoll
源码包依赖:
- GCC编译器:编译C语言
- PCRE库(兼容正则表达式库):用于支持正则表达式
- zlib库:为Nginx的gzip压缩提供压缩算法
- OpenSSL:提供安全通信
进程模型
master进程:主进程,以root权限运行,负责读取检测配置文件,启动和管理worker进程
worker进程:工作进程,权限由配置文件中的user决定,负责处理网络请求,进程数量由配置文件中的worker_processes决定
常用命令
Nginx服务命令
未配置全局环境变量的情况下,nginx命令执行路径为/usr/local/nginx/sbin,可以通过./nginx -h查看所有命令
命令 | 说明 |
---|---|
./nginx | 启动nginx |
./nginx -h | -h可替换为-?,查看nginx的所有命令 |
./nginx -v | 查看nginx的版本 |
./nginx -s 信号量 | 发送一个信号量操作nginx |
./nginx -s stop | 强制关闭nginx |
./nginx -s quit | 停止接受新请求,等待nginx处理完当前任务后关闭nginx |
./nginx -s reload | 重新加载配置文件 |
./nginx -s reopen | 重新打开日志文件(可用于日志分割) |
./nginx -t [文件路径] | 检测nginx的配置文件是否书写正确 |
./nginx -T | 检测nginx的配置文件是否书写正确,若正确则将内容输出到屏幕 |
./nginx -c 文件路径 | 手动指定nginx的配置文件后启动 |
Linux系统命令
kill -信号 master进程PID
信号 | 说明 |
---|---|
TERM/INT | 强制关闭nginx |
QUIT | 停止接受新请求,处理完当前任务后关闭nginx |
HUP | 重新加载配置文件 |
USR1 | 重新打开日志文件(可用于日志分割) |
USR2 | 不停止服务,平滑升级到最新版nginx |
WINCH | 停止接受新请求,处理完当前任务后关闭所有worker进程 |
关于平滑升级
执行 kill -USR2 17482(假设17482为master进程PID)命令进行平滑升级时,更新完ngixn后会开启一个新版本nginx对应的master进程和work进程,此时系统中将会有两个master进程,并且新版本的master进程PID会被记录在/usr/loca1/nginx/logs/nginx.pid文件中,而旧版本master进程PID会被记录在/usr/loca1/nginx/logs/nginx.pid.oldbin文件中,之后会发送QUIT信号给旧的master进程,让其处理完请求后关闭,完成升级。
配置文件
配置文件位于/usr/local/nginx/conf/nginx.conf路径下
全局配置
#error_log logs/error.log; //日志级别与存放路径
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; //master进程pid存放路径
……
user配置进程权限
user 用户名 [用户组];
默认为nobody,配置决定了worker进程的调用用户,以及nginx对文件(一般指资源文件和目录)的读写权限,而日志文件、pid文件、配置文件等由master进程调用的文件则不受此配置影响,所有者一般为root。当配置的用户对指定文件无访问权限时,Nginx将返回403错误,此时需要授予该用户相关权限,或者更改为权限更高的用户。
worker_processes配置进程数量
- master_process on/off;用于指定是否生成worker进程,默认为on
- worker_processes 值/auto;指定worker进程生成数量,默认为1
daemon配置nginx为守护进程
daemon on/off;
配置nginx是否以守护进程方式启动,并在后台运行,默认为on
error_log配置日志
error_log 路径 [日志级别];
配置日志路径和记录级别,这里指Nginx本身运行错误产生的日志,用户连接产生的日志需要在http/https块里配置,默认将notice以上级别的日志写入error.log日志文件中,日志级别有 debug、info、notice、warn、error、crit
pid配置pid文件路径
pid 路径;
自定义pid文件路径,默认在/usr/local/nginx/logs/nginx.pid路径下。pid文件用于存放master进程的pid,会在master进程产生时生成,进程关闭时删除。当使用nginx -s reload/reopen重新加载配置文件或日志时,nginx会到该文件中读取进程pid,如果该文件无法找到或者已经被删除,nginx将报错,常用的解决方法是使用nginx -c 配置文件名命令重新指定配置文件后启动nginx
events块
accept_mutex配置网络连接序列号
accept_mutex on/off;
默认为on,用于解决“惊群”问题,即将连接到nginx的网络连接进行序列化,并依次分配给worker进程,防止多个worker争抢连接。
accept_mutex配置网络连接序列号
multi_accept on/off;
默认为off,在off状态下,一个worker进程只能接收一个新的连接请求,否则,一个worker进程将同时接收所有新连接。
worker_connections配置单进程最大连接数
worker_connections 值;
默认为1024,用于配置每个worker允许的最大连接数,值不能超过操作系统最大文件句柄数量。
use配置事件处理模型
use 参数;
可选参数有poll/select/epoll/kqueue等,Linux2.6以上内核默认使用epoll函数以优化并发连接能力。
http块
include
include 文件名;
- 用于引入外部文件,管理员可以定义一个外部文件书写配置,然后通过include将该文件内容引入到相应位置。
- 这里引入的mime.types用于标识文档、媒体文件格式和类型,该文件标识了常用的html、css、js、jpg等文件类型,用于帮助nginx识别请求的文件类型
default_type
default_type MIME类型;
默认值application/octet-stream指没有特定类型的二进制文件,MIME类型可参考MDN文档:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types
access_log
- log_format 变量名 日志格式;
- access_log 路径 变量名;
二者搭配使用,第一个语句用于定义一个变量名,并将配置的日志格式赋值给该变量,变量名取值需使用$符。第二个语句用于根据变量名对应的日志格式,将用户访问日志书写到对应路径下。日志格式中对应的变量含义:
变量名 | 说明 |
---|---|
remote_addr | 客户端地址 |
remote_user | 客户端用户名 |
time_local | 访问时间和时区 |
request | 请求的URL和HTTP协议 |
http_host | 请求地址,即浏览器中输入的地址 |
status | http请求返回的状态码,如:301、404等 |
upstream_status | upstream状态 |
body_bytes_sent | 发送给客户端的文件大小(字节) |
http_referer | 该请求是从哪个链接跳转过来 |
http_user_agent | 客户端信息,如:浏览器标识等 |
ssl_protocol | SSL协议版本 |
ssl_cipher | 交换数据中的算法 |
request_time | 整个请求的总时间 |
upstream_addr | upstream的地址,即真正提供服务的主机地址 |
http_x_forwarded_for | 记录有代理服务器时客户端地址的配置 |
upstream_response_time | 请求过程中,upstream响应时间 |
sendfile
- sendfile on/off;
- tcp_nopush on/off;
sendfile用于高效传输文件,在sendfile为on的状态下,开启tcp_nopush会将文件积累到一定大小后再统一发送,用于提高包传输效率
keepalive_timeout
- keepalive_timeout 值;
- tcp_nodelay on/off;
keepalive_timeout用于设置保持与客户端连接的最大时间,单位默认为s,超时时nginx会关闭连接并释放服务器资源,若设置为0则禁用该设置。设置的时间过大会导致大量的无效连接未断开,从而占用服务器资源,太小会导致服务未处理完,就被强制关闭连接。
在keepalive_timeout启用状态下,配置tcp_nodelay on;可以将数据即使发送。
gzip
gzip on/off;
gzip 用于配置传输文件前是否进行压缩以提高传输速率,压缩会占用一定系统资源
server块
listen
listen 地址/端口 [default_server];
配置监听地址和端口,default_server参数用于将该server设置为默认主机,无该参数则第一个server为默认主机,当没有匹配到客户端指定的端口/IP时,将连接到默认主机。地址和端口格式可以为:
- listen 127.0.0.1 监听该地址所有端口
- listen 127.0.0.1:8080 监听该地址的8080端口
- listen *:8080 监听所有地址的8080端口
server_name
server_name 域名/IP地址;
用于配置虚拟主机的标识名称,域名或IP地址可以写多个,使用空格隔开。当listen中配置了域名或IP地址,则server_name配置的域名和IP地址将失效,配置方法可以使用以下三种,当域名被多个server匹配到,将按精确匹配>通配符在开头>通配符在结尾>正则匹配>默认主机的优先级进行分配。
精确匹配
通配符匹配
通配符只能在段首和段尾使用,不能再域名中间使用!
正则匹配
charset
charset 编码格式;
charset 用于指定字符编码格式,默认的koi8-r为俄语编码格式(nginx作者是俄罗斯人),与utf-8类似
access_log
access_log 路径 日志格式;
用于指定该server的连接日志,日志格式默认使用http模块中的main变量定义的格式,可用log_format命令自行定义。
location
location 请求路径;
配置请求路径,可配置多个location块用于响应不同请求
root/alias
root/alias 路径;
用于指定资源查找路径,使用root语句时,客户端请求location路径,Nginx查找资源会直接前往root路径+location路径。alias一般在需要隐藏服务器真实路径时使用,查找资源会直接前往alias路径,location路径仅作为客户端请求的虚拟路径
index
index 文件名;
用于设置主页,文件名可以写多个,如: index index1.html index2.html;当找不到第一个文件时,会依次往后查找。
error_page
error_page 状态码 [=状态码] 路径;
用于设置错误处理方法,根据不同的状态码,进行相应处理,常用于配置404,50x页面,可以通过添加[=状态码]修改返回给客户端的状态码,如:error_page 404 [=200] /404.html,浏览器收到的状态码将从404修改为200。路径可以为:
- 地址:error_page 404 http://wrong.com
- 重定向:error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
} - 返回信息:error_page 404 @goto
loaction @goto{
default_type text/plain;
return 404 ‘not found….’
}
Web服务器配置实例
需求:在服务器8081和8082端口分别配置server1、server2两个服务,每个服务下有两个页面,根据客户端请求返回不同页面,为每个服务配置单独的访问日志。
目录树
webservers目录位于服务器根目录下,conf.d目录用于存放每个服务的配置文件,web目录用于存放页面和访问日志。每个服务下的logs目录用于存放access_log日志文件,webpages目录用于存放页面。
http块配置
定义两个变量server1和server2,用于配置日志格式,两个服务的配置文件独立存放于/webservers/conf.d路径下,使用include引入nginx.conf配置文件中。
server1配置
访问http://45.77.77.10:8081
访问web1页面
访问http://45.77.77.10:8081/pages
访问web2页面
server{
listen 8081;
server_name 45.77.77.10;
access_log /webservers/web/server1/logs/access.log server1;
error_page 404 /404.html;
location /{
alias /webservers/web/server1/webpages/;
index web1.html;
}
location /pages{
alias /webservers/web/server1/webpages/;
index web2.html;
}
location =/404.html{
root /webservers/web;
index 404.html;
}
}
server2配置
访问http://45.77.77.10:8082/web3.html
访问web3页面
访问http://45.77.77.10:8082/webpages
访问web4页面
server{
listen 8082;
server_name 45.77.77.10;
access_log /webservers/web/server2/logs/access.log server2;
error_page 404 /404.html;
location /web3.html{
root /webservers/web/server2/webpages;
index web3.html;
}
location /webpages{
root /webservers/web/server2;
index web4.html;
}
location =/404.html{
root /webservers/web;
index 404.html;
}
}
静态资源提供服务
http {
.......
gzip on;
gzip_min_length 1; //设置最小压缩大小,小于1字节的文件不进行压缩
gzip_comp_level 3; //压缩级别(压缩比),取值范围为1-9,值越大,压缩越多,cpu占用率越高
gzip_types text/css text/javascript; //配置压缩的文件类型
server {
listen 80;
server_name 45.77.78.10;
#charset koi8-r;
#access_log logs/host.access.log main;
location /images/ { //匹配路径
root /test; //资源所在路径
autoindex on; //自动生成资源归档页面
}
location /images { //匹配路径
root /test; //资源所在路径
}
location /other/ { //匹配路径
alias /test/images; //资源所在路径
}
#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;
}
.....
}
........
}
test目录服务器根目录下,并且在/test/images路径下存放了photo.jpg照片
- 使用第一个location配置时,当访问 http://45.77.78.10/images/ 时,ngxin会在自动生成的归档页面上输出/test/images/目录下的所有文件。请求只能为location后面配置的参数,若请求为 http://45.77.78.10/test/images/则会返回404
- 使用第二个location配置时,由于未使用 autoindex on 配置,nginx不会生成归档页面,当访问 http://45.77.78.10/images/ 时nginx将返回403,访问文件需指定具体文件路径,如:http://45.77.78.10/test/images/photo.jpg
- 当需要对访问者隐藏服务器实际文件路径时,可以使用alias进行配置,使用第三个location配置,url应当为http://45.77.78.10/other/photo.jpg,此时实际访问的依旧alias指定的/test/images路径下的文件