Nginx整理
1.1Nginx 概述和安装
1.1.1Nginx 介绍
Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus ) 2019年3月11日 F5 Networks 6.7亿美元的价格收购 Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务 器 解决C10K问题(10K Connections)
Nginx官网: http://nginx.org
nginx的其它的二次发行版:
- Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加 了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了 很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始, Tengine成为一个开源项目官网: http://tengine.taobao.org/
- OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发,
官网: https://openresty.org/cn/
1.1.2 Nginx 功能介绍
- 静态的web资源服务器html,图片,js,css,txt等静态资源
- http/https协议的反向代理
- 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
- tcp/udp协议的请求转发(反向代理)
- imap4/pop3协议的反向代理
1.2 Nginx安装
1.2.1 Nginx获取
- 网站获取下载链接,用wget命令下载
- 提前准备好安装包,传入并下载
我这里使用方法2,自备安装包后传入进行安装
对包进行解压缩:
[root@nginx ~]# tar zxf nginx-1.24.0.tar.gz
可以看到nginx的目录解压出来了
1.2.2 编译安装 Nginx
进入目录文件后进行编译安装:
[root@nginx nginx-1.24.0]# ./configure \
> --prefix=/usr/local/nginx \ # 设置 Nginx 的安装路径为 /usr/local/nginx
> --user=nginx \ # 指定 Nginx 进程将以 nginx 用户身份运行
> --group=nginx \ # 指定 Nginx 进程的组为 nginx> --with-http_ssl_module \ # 启用 HTTP SSL 模块
> --with-http_v2_module \ # 启用 HTTP/2 模块,支持 HTTP/2 协议
> --with-http_realip_module \ #支持ip透传
> --with-http_gzip_static_module \ #支持压缩
> --with-http_stub_status_module \ #支持状态页面
> --with-pcre \ #支持正则
> --with-stream \ #支持tcp反向代理
> --with-stream_ssl_module #支持tcp的ssl加密
显示需要编译器:
安装 *gcc:
[root@nginx nginx-1.24.0]# dnf install gcc -y
再次执行检测命令:
显示需要安装pcre:
查询pcre:
[root@nginx nginx-1.24.0]# dnf search pcre
找到我们要安装的包:
安装pcre:
[root@nginx nginx-1.24.0]# dnf install pcre-devel.x86_64 -y
再次进行检测;显示还是需要安装openssl
查询要安装的包:
进行安装:
[root@nginx nginx-1.24.0]# dnf install openssl-devel.x86_64 -y
再次进行检测,显示缺少zlib:
查询并进行安装:
[root@nginx nginx-1.24.0]# dnf install zlib-devel.x86_64 -y
再次进行检测:
显示检测完成:
可以看到生成了两个文件
进行编译:
[root@nginx nginx-1.24.0]# make
没有显示错误,编译完成;
make install安装
[root@nginx nginx-1.24.0]# make install
nginx完成安装以后,有四个主要的目录
- 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二进制启动脚本,可以接受不同的参数以实现不同的功能。
此时建立个之前指定的用户:
[root@nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx
1.2.3 清除编译内容(可选)
如果想要回退到编译之前的环境
[root@nginx nginx-1.26.1]# make clean
1.2.4 配置nginx环境变量
[root@nginx nginx-1.24.0]# vim ~/.bash_profile
更新当前 shell 的环境变量:
[root@nginx nginx-1.24.0]# source ~/.bash_profile
查看nginx版本:
[root@nginx nginx-1.24.0]# nginx -v
1.2.5 启动nginx
Options:
-?,-h : this help
-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 #
发送信号,reload信号 会生成新的worker,但master不会重新生成
-p prefix : set prefix path (default: /etc/nginx/) #指定Nginx 目录
-c filename : set configuration file (default: /etc/nginx/nginx.conf) #
配置文件路径
-g directives : set global directives out of configuration file #设置全局指令,注 意和配置文件不要同时配置,否则冲突
启动nginx:
[root@nginx nginx-1.24.0]# nginx
注意:在这里有个排错示范,本机上有httpd占用了80端口,导致启动nginx时报错:
查看当前所有进程:
将占用80端口的进程杀死:
[root@nginx objs]# kill 981
再次启动并查看,nginx正常启动:
1.3 nginx服务的启动脚本编写
编辑 /lib/systemd/system/ 下的文件,底下的名字自己取
[root@nginx sbin]# vim /lib/systemd/system/nginx.service
重新读取配置:
[root@nginx sbin]# systemctl start nginx
关闭nginx:
[root@nginx sbin]# killall nginx
启动nginx:
[root@nginx sbin]# systemctl start nginx
可以看见配置完成:
1.4 平滑升级和回滚
1.4.1 平滑升级和回滚介绍
- 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
- 向master进程发送USR2信号
- master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
- master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主 进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进 程的PID存放至新生成的pid文件nginx.pid
- 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
- 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
- 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT
1.4.2 实现平滑升级和回滚
1.4.2.1 获取新nginx安装包
我在这已经准备好了新的安装包
进行解压:
[root@nginx ~]# tar zxf nginx-1.26.1.tar.gz
1.4.2.2 增加新模块(可选)
这里不添加新模块的可以跳过
先准备好新增模块的安装包
进行解压
[root@nginx ~]# tar zxf echo-nginx-module-0.63.tar.gz
1.4.2.3 进行编译安装
这是新加的模块,没加的可以忽略
进行编译:
[root@nginx nginx-1.26.1]# make
编译完成:
1.4.2.4 对旧版nginx命令进行备份
来到 /usr/local/nginx/sbin/
为了以防万一,对旧版的nginx命令进行备份,以便出现问题能够进行回滚操作
1.4.2.5 将新版的nginx命令替换掉现在的 nginx
使用新版nginx命令对现版本的nginx命令进行覆盖操作
[root@nginx sbin]# \cp -f /root/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin/
查看替换情况,替换成功
1.4.2.6 进行平滑升级
查看当前nginx的版本:
[root@nginx sbin]# curl -I 172.25.254.100
当前nginx版本为1.24.0
筛选nginx进程:
[root@nginx sbin]# ps aux |grep nginx
可以看到新版的nginx已经可以看到,但是因为未进行替换升级,只有旧版的master在监听端口
平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的 nginx
#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
#此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进 程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
[root@nginx sbin]# kill -USR2 7959
再次查看nginx运行状况:
[root@nginx sbin]# ps aux |grep nginx
发现新版的nginx已经上来了
回收旧版本:
[root@nginx sbin]# kill -WINCH 7959
旧进程已经被回收:
查看当前nginx状况:
[root@nginx sbin]# curl -I localhost
版本号已经变更为1.26.1:
1.4.2.7 回滚
操作与升级类似
- 先对nginx命令文件进行备份
- 查看进程,找到老版本端口号
使用命令:
[root@Nginx sbin]# kill -HUP 端口号
将老版本的进程提上来
- 将新进程杀掉,kill -WINCH 端口号
- 完成回滚操作
1.4.3 进行平滑升级和回滚时的排错(可选)
发生如下图情况:
进行平滑升级后,新版本进程仍未上来,那么可以进行下面步骤:
将当前的nginx进程杀掉:
然后将我们之前备份的ngin.old 手动回滚:
[root@nginx sbin]# \cp -f /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx
再次启动nginx,版本号显示1.24.0,回滚完毕:
此时再进行平滑升级操作即可。
2.1 Nginx 核心配置详解
2.1.1 配置文件说明
nginx 官方帮助文档:https://nginx.org/en/docs/
Nginx的配置文件的组成部分:
- 主配置文件:nginx.conf
- 子配置文件: include conf.d/*.conf
- fastcgi, uwsgi,scgi 等协议相关的配置文件
- mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
nginx 配置文件格式说明
配置文件由指令与指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性
使用#符号添加注释,提高可读性
使用$符号使用变量
部分指令的参数支持正则表达式
Nginx 主配置文件的配置指令方式:
directive value [value2 ...];
注意
(1) 指令必须以分号结尾
(2) 支持使用配置变量
内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义,格式: set variable_name value;
引用变量:$variable_name
主配置文件结构:四部分
main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
...
}
#http/https 协议相关配置段
http {
...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {
...
}
默认的nginx.conf 配置文件格式说明
[root@nginx sbin]# cat /usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 1; #worker 进程数量#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;
events { # 事件区块
worker_connections 1024; #每个worker进程可以处理的连接数
}
http { # 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 { #server 区块
listen 80; #端口
server_name localhost; #域名#charset koi8-r;
#access_log logs/host.access.log main;
location / { # 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 { #location处理对应的不同错误码的页面定 义到/50x.html
root html; #定义默认页面所在的目录
}
2.1.2 nginx全局配置参数优化调整
2.1.2.1 修改用户及nginx工作进程优化
worker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同
worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ;
# 将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,
# 绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不运行在其他核心上,
# 这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,
# 减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
CPU MASK: 00000001:0号CPU
00000010:1号CPU
10000000:7号CPU
#示例
worker_cpu_affinity 0001 0010 0100 1000;第0号---第3号CPU
worker_cpu_affinity 0101 1010;
示例4:
用户我这里之前创建了nginx用户,所以user 后面跟的nginx
重新加载并进行检测:
[root@nginx sbin]# systemctl restart nginx
[root@nginx sbin]# nginx -t
显示没问题:
查看进程状况,成功开启双核指定进程
2.1.2.2 实现nginx的高并发配置
最大并发数量一般不能超过当前系统的最大文件打开数:
查看当前系统支持打开的文件数量:
[root@nginx sbin]# ulimit -a
查看到当前系统支持最多打开1024个文件:
所以我们两个都要进行修改:
先对最大文件打开数进行修改:
[root@nginx sbin]# vim /etc/security/limits.conf
用超级用户进行查看:
[root@nginx sbin]# sudo -u nginx ulimit -a
显示修改成功:
接着再回去把最大并发数量进行修改:
重启服务即可
[root@nginx sbin]# systemctl restart nginx
2.1.3 http配置块
#在响应报文中将指定的文件扩展名映射至MIME对应的类型
include /etc/nginx/mime.types;
default_type application/octet-stream; #除mime.types中的类型外
#指定其它文件的默认MIME类型,浏览
器一般会提示下载
types {
text/html html;
image/gif gif;
image/jpeg jpg;
}
2.1.4 核心配置示例
2.1.4.1 新建一个 PC web 站点
创建需要的文件夹:
[root@nginx sbin]# mkdir -p /usr/local/nginx/conf.d
定义子配置文件路径:
[root@nginx sbin]# vim /usr/local/nginx/conf/nginx.conf
创建虚拟主机网站配置:
[root@nginx sbin]# vim /usr/local/nginx/conf.d/vhost.conf
配置网站内容:
[root@nginx sbin]# mkdir -p /data/web/html
[root@nginx sbin]# echo www.rin.org > /data/web/html/index.html
对nginx进行检测:
[root@nginx sbin]# nginx -t
显示没问题:
进行重启:
[root@nginx sbin]# systemctl restart nginx
提前配置好解析:
C:\Windows\System32\drivers\etc\hosts
进行测试:
测试完成,没问题。
2.1.4.2 root 与 alias
root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location
创建网站文件,并进行编辑内容
[root@nginx sbin]# mkdir /data/web/test -p
[root@nginx sbin]# echo This is test > /data/web/test/index.html
检验并重启服务:
[root@nginx sbin]# nginx -t
[root@nginx sbin]# systemctl restart nginx
编辑配置:
[root@nginx sbin]# vim /usr/local/nginx/conf.d/vhost.conf
测试:
alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于 location上下文,此指令使用较少
重新编写个test2网页文件夹,并进行内容编写:
[root@nginx sbin]# mkdir /data/web/test2 -p
[root@nginx sbin]# echo This is test2 > /data/web/test2/index.html
修改路径配置:(location与alias最后面要有斜杠就一起都有,反之没有就一起都没有)
重启服务,并进行测试:
[root@nginx sbin]# systemctl restart nginx
测试完毕。
2.1.4.3 location 的详细使用
- 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;
- ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,
而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹 配度最 高的一个uri
- uri是用户请求的字符串,即域名后面的web文件路径
然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location 处理 此请求。
2.1.4.3.1 语法规则及顺序:
规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
顺序:= ~ ~* 不带符号 ^~
= | 用于标准uri前,需要请求字串与uri精确匹配,大小敏感, 如果匹配成功就停止向下匹配并立即处理请求 |
^~ | 用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头 对uri的最左边部分做匹配检查,不区分字符大小写 |
~ | 用于标准uri前,表示包含正则表达式,并且区分大小写 |
~* | 用于标准uri前,表示包含正则表达式,并且不区分大写 |
不带符号 | 匹配起始于此uri的所有的uri |
\ | 用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号 |
2.1.4.3.2 优先级实验案例:
实验环境:
[root@nginx ~]# mkdir -p /data/web{1..5}/test
[root@nginx ~]# echo web1 > /data/web1/test/index.html
[root@nginx ~]# echo web2 > /data/web2/test/index.html
[root@nginx ~]# echo web3 > /data/web3/test/index.html
[root@nginx ~]# echo web4 > /data/web4/test/index.html
[root@nginx ~]# echo web5 > /data/web5/test/index.html
编辑配置文件:
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
访问rin.org/test/index.html,看看谁优先级高
测试1:将搜索全部启用
测试2:将 = 注释掉:
测试3:再将 ~ 注释掉
测试4:将 ~* 的注释掉
测试5:将不带符号的注释掉
2.1.4.3.3 生产使用案例
#直接匹配网站根会加速Nginx访问处理
location = /index.html {
......;
}
location / {
......;
}
#静态资源配置方法1
location ^~ /static/ {
......;
}
#静态资源配置方法2,应用较多
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
......;
}
#多应用配置
location ~* /app1 {
......;
}
location ~* /app2 {
......;
}
2.1.4.4 Nginx 账户认证功能
由 ngx_http_auth_basic_module 模块提供此功能
创建认证文件:
创建认证文件分为两种情况,即在同一文件下是否为首次创建:
1.首次创建:
使用命令
[root@nginx data]# htpasswd -cm /usr/local/nginx/.htpassswd rin
创建完成后能够在文件处查询到:
2.非首次创建:
使用创建命令时参数为 -m 不是-cm!
[root@nginx data]# htpasswd -m /usr/local/nginx/.htpassswd rinrin
可以看见创建第二个用户认证文件成功:
创建数据目录,用于测试
[root@nginx data]# mkdir /data/web/rin
[root@nginx rin]# echo rinrinrinrinrin >/data/web/rin/index.html
配置文件:
[root@nginx rin]# vim /usr/local/nginx/conf.d/vhost.conf
测试:
2.1.4.5 自定义错误页面
创建错误目录并编辑内容:
[root@nginx rin]# mkdir -p /data/web/errorpage
[root@nginx rin]# echo error page > /data/web/errorpage/40x.html
测试:
2.1.4.6 自定义错误日志
编辑配置文件:
[root@nginx rin]# vim /usr/local/nginx/conf.d/vhost.conf
建立日志目录:
[root@nginx rin]# mkdir /var/log/rin.org
测试:
2.1.4.7 检测文件是否存在
try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如 果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一 个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内 部500错误。
语法格式:
Syntax: try_files file ... uri;
try_files file ... =code;
Default: —
Context: server, location
编辑文件:
[root@nginx html]# vim /usr/local/nginx/conf.d/vhost.conf
2.1.4.8 长连接配置
编辑文件:
[root@nginx html]# vim /usr/local/nginx/conf/nginx.conf
2.1.4.9 作为下载服务器配置
测试:
3.1 Nginx 高级配置
3.1.1 Nginx 状态页
- 基于nginx 模块 ngx_http_stub_status_module 实现
- 在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module
否则配置完成之后监测会是提示法错误
- 状态页显示的是整个服务器的状态,而非虚拟主机的状态
还要提前做好解析,
测试:
3.1.2 Nginx 压缩功能
Nginx支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文 件大小将比源文件显著变小,样有助于降低出口带宽的利用率,降低企业的IT支出,不过会占用相 应的CPU资源。
Nginx对文件的压缩功能是依赖于模块 ngx_http_gzip_module,默认是内置模块
配置命令:
#启用或禁用gzip压缩,默认关闭
gzip on | off;
#压缩比由低到高从1到9,默认为1,值越高压缩后文件越小,但是消耗cpu比较高。基本设定未4或者5
gzip_comp_level 4;
#禁用IE6 gzip功能,早期的IE6之前的版本不支持压缩
gzip_disable "MSIE [1-6]\.";
#gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
#启用压缩功能时,协议的最小版本,默认HTTP/1.1
gzip_http_version 1.0 | 1.1;
#指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k;
gzip_buffers number size;
#指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错
gzip_types mime-type ...;
#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开
gzip_vary on | off;
#预压缩,即直接从磁盘找到对应文件的gz后缀的式的压缩文件返回给用户,无需消耗服务器CPU
#注意: 来自于ngx_http_gzip_static_module模块
gzip_static on | off;
配置文件:
[root@nginx local]# vim /usr/local/nginx/conf/nginx.conf
测试: