1.nginx概述
Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。
1.1 nginx访问流程
客户端发起请求 先发送到网卡
网卡收到的报文复制到内核空间
内核空间再复制到用户空间的应用程序空间
nginx 分析得到一个磁盘页面文件
再将需求反馈给内核空间,应为应用程序没有权限从磁盘上直接读取文件,需要依靠内核
内核去磁盘上找到所需要的文件,加载到内核空间
加载后再复制到用户空间
用户空间构建响应报文,交给内核空间,内核空间再复制给网卡,返回给用户
整个过程会来回切换 用户空间,内核空间 那么我们可以再次基础上做优化处理
1.2 Nginx的进程
Nginx有两个进程:
master process:主进程(守护进程),用来管理工作进程。
worker process:工作进程,用来处理用户的请求。
1.3 nginx与apache的区别
- Apache是同步多进程模型,一个连接对应一个进程,而Nginx是异步的,多个连接(万级别)可以对应一个进程。
- Nginx轻量级,抗并发,处理静态文件好。
- Apache超稳定,对PHP支持比较简单,Nginx需要配合其他后端用,处理动态请求有优势,建议使用前端Nginx抗并发,后端apache集群,配合起来会更好。
- Nginx负载均衡、反向代理、处理静态文件优势。
- Nginx处理静态请求的速度高于apache,同时并发性比较好,CPU内存占用低,因此可以应对千万级别的网络请求。
1.4 I/O模型相关概念
同步/异步(消息反馈机制):关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。
- 同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成
- 异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
- 阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。
- 非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。
1.5 事件驱动模型
Nginx支持在多种不同的操作系统实现不同的事件驱动模型,但是其在不同的操作系统甚至是不同的系统版本上面的实现方式不尽相同,主要有以下实现方式:
1、select:
select库是在linux和windows平台都基本支持的 事件驱动模型库,并且在接口的定义也基本相同,只是部
分参数的含义略有差异,最大并发限制1024,是最早期的事件驱动模型。
2、poll:
在Linux 的基本驱动模型,windows不支持此驱动模型,是select的升级版,取消了最大的并发限制,在编
译nginx的时候可以使用--with-poll_module和--without-poll_module这两个指定是否编译select
库。
3、epoll:
epoll是库是Nginx服务器支持的最高性能的事件驱动库之一,是公认的非常优秀的事件驱动模型,它和
select和poll有很大的区别,epoll是poll的升级版,但是与poll有很大的区别.
epoll的处理方式是创建一个待处理的事件列表,然后把这个列表发给内核,返回的时候在去轮训检查这个
表,以判断事件是否发生,epoll支持一个进程打开的最大事件描述符的上限是系统可以打开的文件的最大
数,同时epoll库的I/O效率不随描述符数目增加而线性下降,因为它只会对内核上报的“活跃”的描述符进行
操作。
2.编译安装Nginx
1.先把安装包放到/opt下并解压
2.下载编译安装环境
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
#安装依赖包
3.新建nginx用户便于管理
4.进行设置环境
./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
5.进行编译make -j2 && make install
6.修改文件权限
chown -R nginx.nginx /apps/nginx
7.这几个重要文件夹的作用
ll /apps/nginx/
total 0
drwxr-xr-x 2 root root 333 Sep 22 12:49 conf
drwxr-xr-x 2 root root 40 Sep 22 12:49 html
drwxr-xr-x 2 root root 6 Sep 22 12:49 logs
drwxr-xr-x 2 root root 19 Sep 22 12:49 sbin
- conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,配置文件一般都有个样板配置文件,是文件名.default结尾,使用的使用将其复制为并将default去掉即可。
- html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面。
- logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比如/var/logs/nginx里面。
- sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。
8.创建nginx自启动文件
vim /usr/lib/systemd/system/nginx.service
#建立文件
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
#注意文件位置,如果不对 启动不了
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
9 systemctl daemon-reload 重新加载配置,并启动服务
3.nginx信号的使用
3.1信号
nginx 命令支持向其发送信号,实现不同功能
nginx 当做单独命令使用有以下选项
[root@node2 ~]#nginx -h
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /etc/nginx/)
-e filename : set error log file (default: /var/log/nginx/error.log)
-c filename : set configuration file (default: /etc/nginx/nginx.conf)
-g directives : set global directives out of configuration file
3.1.1 显示版本
[root@localhost system]#nginx -v
nginx version: nginx/1.18.0
3.1.2 显示编译详细情况,模块等信息
3.1.3 发送信号
nginx -h 中可以看到的信号较少
s signal : send signal to a master process: stop, quit, reopen, reload
可以使用man手册来查看详细的信号 如果没安装,去源码包里找到man文件
man 路径/nginx.8 不加路径打不开man帮助
stop SIGTERM 直接停止
quit SIGQUIT 优雅的退出:有人在访问不会结束进程
reopen SIGUSR1 分割日志
reload SIGHUP 重新加载配置文件
实例:
nginx -s stop #立即关闭nginx
nginx -s quit #优雅退出 不影响业务的状态下退出
nginx -s reload #重新加载
3.1.4 指定配置,不以配置文件中的为准
nginx -g 指定配置 不已配置文件中的为准
nginx -g 'user zhangsan;' 已张三身份运行,默认是以nginx身份
nginx -g 'daemon off;' 前台运行命令
3.1.5 检查语法格式
nginx -t
3.1.6 nginx分隔日志
1.先将原先的日志文件改个名字
2.在创建一个日志文件
3.去输入命令 nginx -s reopen将日志生成转到新建立的文件中
4.用别的主机访问一下看日志生成在哪
3.1.7 平滑升级
1.先下载nginx1.20.2 的安装包
wget https://nginx.org/download/nginx-1.20.2.tar.gz -P /opt
#下载安装包到opt目录
2.解压安装包
tar xf nginx-1.20.2.tar.gz
3.编译安装
./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
4.进行编译make -j2, 注意不要执行make install
5.进入到nginx1.20.1 的objs文件夹里查看版本
6.将老版本的nginx做一个备份
7.将objs里的nginx拷到/apps/nginx/sbin/
8.输入指令发送升级信号
9.优雅的关闭老版本的worker进程
kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`
10.新版本会生成新的pid号
11.去另外一台主机上测试版本是否改过来了
4.nginx配置详细解释
主配置文件位置:/usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/ 目录下:
- nginx.conf 是主配置文件
- nginx.conf.default 是主配置文件的备份文件
主配置文件中有六个主要模块:
1、全局块:全局配置,对全局生效。
2、events块:配置影响Nginx服务器与用户的网络连接。
3、http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
4、server块:配置虚拟主机的相关参数,一个http块中可以有多个server 块。每个 server 块就相当于一个虚拟主机。。
5、location块:用于配置匹配的url,一个server块中可以有多个location块。
6、upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
配置文件由指令和指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
pid /apps/run/nginx.pid
指令已{}达括号将多条指令组织在一起且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性
4.1 全局配置
nginx 有多种模块
- 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
- 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
- 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
- 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
- Stream服务模块: 实现反向代理功能,包括TCP协议代理
- 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
4.1.1 隐藏版本或修改版本
vim /apps/nginx/conf/nginx.conf
#修改配置文件 放在 http语句中
http {
server_tokens off;
[root@localhost nginx]#nginx -s reload
#重新加载
修改成自己想要的名字
#去修改源码,在安装包里, 再重新编译 #号不要去掉
#先把服务关闭,不然编译不成功
[root@localhost core]#vim /opt/nginx-1.18.0/src/core/nginx.h
13 #define NGINX_VERSION "9527"
14 #define NGINX_VER "http/" NGINX_VERSION
[root@localhost core]#vim /opt/nginx-1.18.0/src/http/ngx_http_header_filter_module.c
49 static u_char ngx_http_server_string[] = "Server: lzq" CRLF;
重新编译安装
./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
[root@localhost nginx-1.18.0]#make && make install
4.1.2 修改启动的进程数
worker_processes 1;
#允许的启动工作进程数数量,和你真实的cpu数量有关 1
worker_processes auto;
#如果设置为auto 就是你真实的cpu数量
[root@localhost ~]#ps axo pid,cmd,psr,ni|grep nginx
#可以看到 nginx的 worker数量
4.1.3 cpu与work进程绑定
将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
CPU MASK: 00000001:0号CPU
00000010:1号CPU
................
10000000:7号CPU
worker_cpu_affinity 00000001 00000010 00000100 00001000;第0号---第3号CPU
#序号绑定cpu 亲缘性
4.1.4 nginx进程的优先级(work进程的优先级)
修改配置文件
user nginx;
worker_processes 2;
worker_cpu_affinity 00000101 00000010;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
worker_priority -20;
#添加此项
nginx -s reload
4.1.5 调试work进程打开的文件的个数
worker_rlimit_nofile 65536;
#所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致,
vim /etc/security/limits.conf
#上面修改过后limit里面也要修改不然不生效
#最后加入
* soft core unlimited
* hard core unlimited
* soft nproc 1000000
* hard nproc 1000000
* soft nofile 1000000
* hard nofile 1000000
* soft memlock 32000
* hard memlock 32000
* soft msgqueue 8192000
* hard msgqueue 8192000
#设置完后重启
[root@localhost ~]#ulimit -a
4.2 event事件
events {
worker_connections 65536;
#设置单个工作进程的最大并发连接数
use epoll;
#使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select、poll、epoll,只能设置在events模块中设置,这个一般默认就写好了,不需要自己写
accept_mutex on;
#on为同一时刻一个请求轮流由work进程处理,而防止被同时唤醒所有worker,避免多个睡眠进程被唤醒的设置,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊群",因此nginx刚安装完以后要进行适当的优化。建议设置为on
multi_accept on;
#ON时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认为off,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。建议设置为on,这个一般是要打开的
}
4.3 http设置
http {
...
... #各server的公共配置
server { #每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
...
}
server {
...
server_name #虚拟主机名
root #主目录
alias #路径别名
location [OPERATOR] URL { #指定URL的特性
...
if CONDITION {
...
}
}
}
}
4.3.1 server块构建虚拟主机
1.先在主配置文件中放入子配置文件
[root@localhost ~]#vim nginx.conf
#修改配置文件 要放在 http 模块里,注意要在http模块中
include /etc/nginx/mime.types;
include /apps/nginx/conf.d/*.conf;
2.去到文件夹下创建自己的自配置文件
3.分别写好配置文件
4.也可以使用location 模块查找文件位置
server{
listen 192.168.223.100:80;
server_name www.pc.com;
location / {
#模糊查找根一下的文件
root /data/nginx/html/pc;
#这边是具体文件路径
}
}
5.创建数据文件名
6.创建页面
7.去第二台机器修改 /etc/hosts 文件做测试
8.测试自己的网页是否有问题
4.3.2 alias别名
别名设置
server {
listen 80;
server_name www.kgc.com;
location /news {
root /data/nginx/html/pc/;
#相当于追加 将 文件夹news追加到/data/nginx/html/pc/news
}
location /study{
alias /mnt/nginx/sports/;
#相当于替换 你访问 study 就是访问/mnt/nginx/sports
#跟那个linux里这边设置别名的意思差不多
}
}
4.3.3 location
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,按一定的优化级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
= #用于标准url前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
^~ #用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URL的最左边部分做匹配检查,不区分字符大小写
~ #用于标准url前,表示包含正则表达式,并且区分大小写
~* #用于标准url前,表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此url的所有的url
#\ #用于标准url前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号
例子:
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
访问路径是 / a
访问路径是 /index.html b
访问路径是 /documents/document.html c
访问路径是 /images/1.gif d
访问路径是 /documents/1.jpg e
4.3.4 access 模块 四层控制
[root@localhost nginx-1.18.0]#./configure --help |grep access
# 可以去源码包中 过滤 access模块 自带 不想要可以 without 去掉
--without-http_access_module disable ngx_http_access_module
--http-log-path=PATH set http access log pathname
--without-stream_access_module disable ngx_stream_access_module
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
配置文件修改
server {
listen 80;
server_name www.kgc.com;
allow 192.168.91.0/24;
deny 192.168.91.101;
location / {
root /data/nginx/html/pc;
}
}
匹配了之后就不往下匹配了
所以范围小的往上
4.3.5 验证模块
1.先安装http-tools 包,使用htpasswd 命令
第一次生成文件
htpasswd -c 文件路径 姓名 交互式生成密码
htpasswd -bc 文件路径 姓名 密码 直接将密码跟在后面
-c 代表新建用户名和密码对应的文件
-b 将密码跟在用户名后
非第一次
htpasswd 文件路径 姓名 交互式生成密码
htpasswd -b 文件路径 姓名 密码 直接将密码跟在后面
2.因为是第一次创建先做用户名和密码
3.想往文件中再加入文件名的话直接htpasswd -b就行了-c是新建文件夹的意思
4.去到自己的子配置文件中去设置将文件位置输出出来
location /admin {
root /opt/html;
#文件位置
auth_basic "admin site"
auth_basic_user_file /data/.httpuser;
}
5.去网站测试一下自己有没有设置成功
4.3.6 自定义错误界面
我们 可以改变 默认的错误页面,同时也可以用指定的响应状态码进行响应, 可用位置:http, server, location, if in location
格式:
error_page code ... [=[response]] uri;
页面错误代码
error_page 固定写法
code 响应码
= 可以将响应码转换
uri 访问连接
实际操作:
使用我们的子虚拟机添加配置文件
server {
listen 80;
server_name www.pc.com;
root /data/nginx/html/pc;
error_page 404 /40x.html;
#当出现404 错误 就去 root /data/nginx/html/pc/error/ 这个文件夹找40x.html 这个文件
location = /40x.html {
root /data/nginx/html/pc/error/;
}
4.3.7 日志位置存放
可以将自己的子配置文件日志分离
1.进入子配置文件直接配置子文件的日志位置
2.进入logs就能看到分离出来的日志文件
4.3.8 检测文件是否存在
try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。
1.在子配置文件中配置
4.3.9 长连接
http 基于 tcp 协议 先要 三次握手然后 再传输数据
一次三次握手 下载多个资源
一次三次握手下载一个资源
相关设置
keepalive_timeout timeout [header_timeout];
#设定保持连接超时时长,0表示禁止长连接,默认为75s,通常配置在http字段作为站点全局配置
keepalive_requests number;
#在一次长连接上所允许请求的资源的最大数量,默认为100次,建议适当调大,比如:500
可以加在全局或者 server
具体操作
直接设置在全局配置里面就行了
keepalive_requests 3;
#最大下载三个资源就会断开
keepalive_timeout 60 65; #只能有一个空格
#开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,后面的60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。
Keep-Alive:timeout=60 #浏览器收到的服务器返回的报文
#如果设置为0表示关闭会话保持功能,将如下显示:
4.3.10 作为下载服务器配置
autoindex on | off;
#自动文件索引功能,默为off
autoindex_exact_size on | off;
#计算文件确切大小(单位bytes),off 显示大概大小(单位K、M),默认on
autoindex_localtime on | off ;
#显示本机时间而非GMT(格林威治)时间,默认off
autoindex_format html | xml | json | jsonp;
#显示索引的页面文件风格,默认html
limit_rate rate;
#限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位B/s,即bytes/second,默认值0,表示无限制,此指令由ngx_http_core_module提供
set $limit_rate
#变量提供 限制 变量优先级高
例子实现
mkdir /opt/download
#注意:download不需要index.html文件
location /download {
autoindex on;
#开启下载服务器
autoindex_exact_size on;
#开启确切大小不建议开启
autoindex_localtime on;
#使用当地时间
limit_rate 1024k;
#所有人限速1024k,默认单位是字节数
set $limit_rate 2M;
#谁先生效
alias /opt/download;
}
1.在子配置文件中进行设置
2.先把光盘镜像挂到opt的download下
3.再去浏览器下去查看download文件夹的内容
4.3.11 用户上传资料
上传需要借助开发小的程序, 并且程序 5M 和 nginx 10M 都会限制。 两者取最小
client_max_body_size 1m;
#设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误
client_body_buffer_size size;
#用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
client_body_temp_path path [level1 [level2 [level3]]];
#设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,使用hash之后的值从后往前截取1位、2位、2位作为目录名
上传文件大于限制 错误代码413
4.3.12 其他设置
open_file_cache_min_uses
#指令所指定的次数的缓存项即为非活动项,将被删除
open_file_cache_valid time;
#缓存项有效性的检查验证频率,默认值为60s
open_file_cache_errors on | off;
#是否缓存查找时发生错误的文件一类的信息,默认值为off
open_file_cache_min_uses number;
#open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项,默认值为1
范例:
open_file_cache max=10000 inactive=60s;
#最大缓存10000个文件,非活动数据超时时长60s
open_file_cache_valid 60s;
#每间隔60s检查一下缓存数据有效性
open_file_cache_min_uses 5;
#60秒内至少被命中访问5次才被标记为活动数据
open_file_cache_errors on;
#缓存错误信息