文章目录
- 一、简介:
- 1、Nginx简介
- 2、常用四大发行版
- 二、Nginx编译安装:
- 1、Nginx编译安装
- 2、Nginx目录结构
- 3、Nginx 相关命令
- 三、Nginx配置文件解析
- 1、最小配置
- 2、虚拟主机
- 3、匹配正则表达式
- 四、Nginx反向代理
- 1、理论
- 2、实践:Nginx反代代理Tomcat
- 五、Nginx负载均衡
- 1、实践:Nginx负载均衡Tomcat
- 2、负载均衡策略
- 六、Nginx + Keepalived 高可用
- 1、环境说明
- 2、实践
- 七、Nginx证书认证
- 1、SSL证书配置
- 2、rewrite地址重写
- 八、Nginx平滑升级
- 1、Nginx平滑升级原理
- 2、实践:1.16版本 升级到 1.18版本
- 3、升级失败 回滚操作
- 4、遇到问题
- 九、Nginx 优化方案
- 十、扩展
- 1、网站返回码
- 2、URL和URI的区别
- 3、F12网络返回参数
- 4、curl 常用测试参数
一、简介:1、Nginx简介
Nginx是一款免费且开源的Web服务器项目,常用来做、Web服务器、反向代理服务器、负载均衡服务器。特点如下:
- 免费且开源:免费试用,开放源代码。
- 轻量级且模块化:消耗内存少、保留核心模块、不需要全部安装、支持第三方模块。
- 高性能:Nginx支持很高的并发 。
- 热部署:在不重启Web服务器时升级、或者添加新模块等。
Nginx开源版官网:
Nginx plus 商业版官网:
Openresty官网:
Tengine官网:
Openresty:是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。
Tengine:是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。
二、Nginx编译安装:1、Nginx编译安装1、依赖环境安装
yum -y install pcre-devel pcre gcc gcc-c++ zlib zlib-devel openssl openssl-devel# gcc: C语言编辑器 nginx是C语言编写的 所以需要C环境# pcre: 支持正则表达式# openssl: 支持HTTPS加密协议# zlib: 支持数据包头压缩
2、编译安装
wget http://nginx.org/download/nginx-1.18.0.tar.gztar xf nginx-1.18.0.tar.gz -C /usr/src/cd /usr/src/nginx-1.18.0/./configure --prefix=/usr/local/nginx --with-http_ssl_module make && make install
3、启动
cd /usr/local/nginx/sbin/./nginxnetstat -anput | grep 80
4、防火墙设置
firewall-cmd --add-port=80/tcp --permanentfirewall-cmd --add-service=http --add-service=https --permanent firewall-cmd --reload
5、验证
浏览器访问 自己的IP地址即可!
2、Nginx目录结构/usr/local/nginx # 服务安装目录/usr/local/nginx/sbin # 服务主程序目录/usr/local/nginx/sbin/nginx # 服务程序文件/usr/local/nginx/conf # 服务主配置文件目录/usr/local/nginx/logs/ # 服务日志文件目录/usr/local/nginx/logs/nginx.pid # 服务pid文件/usr/local/nginx/logs/error.log # 服务错误日志文件/usr/local/nginx/logs/access.log # 服务访问日志文件
3、Nginx 相关命令/usr/local/nginx/sbin/nginx # 启动nginx/usr/local/nginx/sbin/nginx -v # 小写v查看nginx版本信息/usr/local/nginx/sbin/nginx -V # 大写V除版本信息外还显示配置参数信息/usr/local/nginx/sbin/nginx -t # 检查nginx配置文件是否正确/usr/local/nginx/sbin/nginx -s reload # 重新加载nginx/usr/local/nginx/sbin/nginx -s quit # 正常关闭nginx/usr/local/nginx/sbin/nginx -s stop # 快速关闭nginx
quit 和 stop 的区别:
- quit:当nginx服务已经启动,想要停止服务可以使用quit信号正常停止服务,quit信号并不会立即停止 服务,而是先不接收新的请求,但是会先处理完已经接收的连接后在停止服务,这种停止的方式被称为 ”优雅 的停止“
- stop:当nginx服务已经启动,想要停止服务可以使用stop信号快速停止服务,stop信号会立即停止服 务,这种停止服务的方式被称为 ”暴力停止“
去除Nginx配置文件中的注释等内容 -r 支持正则 -i.bak备份
sed -r -i.bak '/(^$|^#|#)/d' nginx.conf
worker_processes 1; # worker工作进程数events { worker_connections 1024; # 每个worker进程可以创建的连接数}http { include mime.types; # 解析类型定义 default_type application/octet-stream; # 默认解析类型 sendfile on; # 减少Copy的过程 keepalive_timeout 65; # 保持连接超时时间 server { # 虚拟主机 vhost listen 80; # 监听端口号 server_name localhost; # 主机名、域名 location / { # 根据规则匹配URL root html; # 网页主目录 nginx根目录中的html index index.html index.htm; # 默认页 } error_page 500 502 503 504 /50x.html; # 错误网页指定 location = /50x.html { root html; } }}
2、虚拟主机原本一台服务器只能对应一个站点、通过虚拟主机技术可以虚拟化多个站点对外提供服务。
每一段 server 中就是一个虚拟主机 如下:
server {.. .. }
实验:通过不同端口 设置多实例虚拟主机
创建不同的 index.html文件
mkdir /wwwcd /www/mkdir www videoecho "This is the www site." > /www/www/index.htmlecho "This is the video site." > /www/video/index.html
http {.. .. server { listen 80; server_name localhost; location / { root /www/www; # 设置80端口网页主目录 index index.html index.htm; }}server { listen 88; server_name localhost; location / { root /www/video; # 设置88端口网页主目录 index index.html index.htm; } } }
/usr/local/nginx/sbin/nginx -s reload
测试:
curl 127.0.0.1This is the www site.curl 127.0.0.1:88This is the video site.
3、匹配正则表达式= # 开头表示精确匹配~ # 区分大小写匹配~* # 不区分大小写匹配!~和!~* # 分别为区分大小写不匹配及不区分大小写不匹配的正则^ # 以什么字符开头$ # 以什么字符结尾^~ # 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可* # 任意字符 / # 通用匹配,任何请求都会匹配到
举例:
通用匹配 任何请求都会匹配到
location / {}
严格区分大小写,匹配.图灵结尾
location ~ \.图灵$ {fastcgi_pass http://127.0.0.1:9000;}
严格区分大小写,匹配.jsp结尾
location ~ \.jsp$ {proxy_pass http://127.0.0.1:8080;}
不区分大小写匹配
location ~* "\.(sql|bak|tgz|tar.gz|.git)$ {default_type text/html;return 403 "启用访问控制";}
四、Nginx反向代理1、理论反向代理 记住 proxy_pass
反向代理的工作原理是,代理服务器来接受客户端的网络访问连接请求,然后服务器将请求有策略的转发给网络中实际工作的业务服务器,并将从业务服务器处理的结果,返回给网络上发起连接请求的客户端。
2、实践:Nginx反代代理Tomcat1、部署安装Tomcat (两台同步操作)
安装JDK环境 并验证
yum install -y java-1.8.0-openjdk-devel.x86_64java -version
下载Tomcat 并解压启动
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.62/bin/apache-tomcat-9.0.62.tar.gz --no-check-certificatetar xf apache-tomcat-9.0.62.tar.gz -C /usr/local/cd /usr/local/apache-tomcat-9.0.62/bin/./startup.sh ps -aux |grep java
防火墙配置
# 开启8080端口firewall-cmd --add-port=8080/tcp --permanent firewall-cmd --reload # 开启8081端口firewall-cmd --add-port=8081/tcp --permanent firewall-cmd --reload
2、更改其中一台的端口号为 8081
cd /usr/local/apache-tomcat-9.0.62/conf/vim server.xml .. ..<Connector port="8081" protocol="HTTP/1.1"
重启 Tomcat
./shutdown.sh./startup.shnetstat -anput |grep 8081
3、插入不同的页面
# 101 操作mv /usr/local/apache-tomcat-9.0.62/webapps/ROOT/index.jsp{,.bak}cd /usr/local/apache-tomcat-9.0.62/webapps/ROOTecho "This is 101" > index.jsp# 105 操作mv /usr/local/apache-tomcat-9.0.62/webapps/ROOT/index.jsp{,.bak}cd /usr/local/apache-tomcat-9.0.62/webapps/ROOTecho "This is 105" > index.jsp
测试
curl 10.10.14.101:8081This is 101curl 10.10.14.105:8080This is 105
4、Nginx 反代配置
http {.. .. server { listen 8888; server_name 10.10.14.100; location = /8080/ { proxy_pass http://10.10.14.105:8080/; } location = /8081/ { proxy_pass http://10.10.14.101:8081/; } }}
验证
curl 10.10.14.100:8888/8080/This is 105curl 10.10.14.100:8888/8081/This is 101
五、Nginx负载均衡负载均衡是基于 反向代理之上的 需要配合proxy_pass一起来使用,可以通过配置负载均衡策略 将请求转发到 后端集群中。
所谓的集群定义 是多台服务器提供相同服务,在客户端开来好像就只有一台服务器。
1、实践:Nginx负载均衡Tomcat1、配置Tomcat 参考 四、Nginx反向代理
最终效果如下:
curl 10.10.14.101:8080This is 101curl 10.10.14.105:8080This is 105
2、Nginx 配置
upstream 负载均衡配置 需要在http 字段下定义
http {.... upstream tomcat { server 10.10.14.101:8080 weight=8;server 10.10.14.105:8080 weight=2;# server 10.10.14.101:8080 weight=8 down;# server 10.10.14.105:8080 weight=2 backup;}.. .. }
weight 权重值 此值越高 被分配的优先级也就越高
down 不使用此服务器
backup 备份服务器 当没有一台可以提供服务时自动启动
虚拟主机配置:
http { .... server { listen 8888; server_name localhost; location / { proxy_pass http://tomcat; # 当使用proxy_pass 就需要注释掉下面内容 # root /www/www; # index index.html index.htm; } } }
3、防火墙配置
在外网不能访问后端Tomcat 只能通过Nginx访问 如下图:
Tomcat服务器上配置防火墙:
systemctl start firewalld.servicefirewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.10.14.100" port protocol="tcp" port="8080" accept"firewall-cmd --reload
移除规则:
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="10.10.14.100" port protocol="tcp" port="8080" accept"firewall-cmd --reload
4、重启Nginx并验证
curl 10.10.14.100:8888This is 101curl 10.10.14.100:8888This is 105
2、负载均衡策略目前为止 内置策略有3中 分别是:轮询策略、加权策略和ip_hash策略,默认使用轮询策略。
1、轮询策略
默认使用 轮询策略 逐一转发 适用于无状态请求。
2、加权策略(weight)
设置优先级 weight的大小和访问率成正比。
3、ip_hash策略
根据客户端ip地址转发同一台服务器,可以保持回话。
4、least_conn
最少连接访问。
5、url_hash
根据用户访问url定向转发请求。
六、Nginx + Keepalived 高可用1、环境说明环境:
IP地址
说明
备注
10.10.14.100
Nginx_Master节点
Master和Backup配置文件保持一致
10.10.14.102
Nginx_Backup节点
Master和Backup配置文件保持一致
10.10.14.105
Tomcat 节点1
10.10.14.101
Tomcat 节点2
2、实践1、Nginx_Master节点 和 Nginx_Salve节点 配置保持一致 nginx配置文件如下
http { .. .. upstream tomcat {server 10.10.14.101:8080;server 10.10.14.105:8080;} server { listen 80; server_name localhost; location / { proxy_pass http://tomcat; } } .. .. }
2、keepalived 安装配置(两台Nginx 都需要操作)
yum -y install openssl-devel libnl libnl-devel libnfnetlink-devel
wget https://www.keepalived.org/software/keepalived-2.0.20.tar.gz --no-check-certificatetar zxf keepalived-2.0.20.tar.gz cd keepalived-2.0.20/./configure --sysconf=/etcmake && make install # --sysconf 指定配置文件路径
3、Master keepalived配置:
[root@nginx1 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs { router_id 111}vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.10.14.200 }}
4、Slave keepalived配置:
cat /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs { router_id 102}vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 50 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.10.14.200 }}
5、启动验证
systemctl restart keepalived.service ip a # 配置正确应该 Master上可以看到200IP地址 Backup则不能# 在Master上停止keepalived 看VIP是否可以票到Backup主机上
6、防止脑裂配置
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --destination 224.0.0.18 --protocol vrrp -j ACCEPTfirewall-cmd --reload
7、 监控脚本
监控本地Nginx是否正常 如果不正常 则停止keepalived
cat keep_nginx.sh #!/bin/bashif ! (which killall);then(yum install psmisc -y) &>/dev/nullfikillall -0 nginxif [ $? -ne 0 ];then systemctl stop keepalivedfi# killall -0 nginx: 判断Nginx进程是否存在 存在则返回0
添加脚本追踪模块到keepalived配置文件
cat /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs { router_id 111}vrrp_script keep_nginx.sh { script "/root/keep_nginx.sh" interval 2 weight 5 }vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.10.14.200 }track_script { keep_nginx.sh }}
七、Nginx证书认证1、SSL证书配置# CA:证书颁发机构# RA:证书注册机构
证书配置:
mkdir /usr/local/nginx/ssl_keycd /usr/local/nginx/ssl_key
创建私钥:
[root@loaclhost ssl_key]# openssl genrsa -idea -out server.key 2048 Generating RSA private key, 2048 bit long modulus......................................+++.....+++e is 65537 (0x10001)Enter pass phrase for server.key: # 密码Verifying - Enter pass phrase for server.key: # 密码
生成证书 去除私钥密码:
openssl req -days 3650 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crtls /usr/local/nginx/ssl_keyserver.crt server.key
Nginx配置:
server { listen 443 ssl; server_name localhost; ssl_certificate /usr/local/nginx/ssl_key/server.crt; # 指定证书位置 ssl_certificate_key /usr/local/nginx/ssl_key/server.key; # 指定私钥位置 ssl_session_timeout 5m; }
防火墙配置:
firewall-cmd --add-service=https --permanent firewall-cmd --add-service=http --permanent firewall-cmd --reload
启动测试:
echo "Test Service SSL" > html/index.htmlnginx -tnginx
浏览器访问:https://NginxIP
若涉及到本地域名等信息需要修改hosts文件:C:\Windows\System32\drivers\etc\hosts
- 格式:域名 IP地址
server { listen 80; server_name https.benet.com;# rewrite .* https://https.benet.com; #重定向任选其一# rewrite .* https://$host$request_uri redirect;# rewrite .* https://$server_name$request_uri redirect; rewrite .* https://$server_name$1 redirect;}
八、Nginx平滑升级1、Nginx平滑升级原理一般有两种情况下需要升级 nginx,一种是确实要升级 nginx 的版本,另一种是要为 nginx 添加新的模块。
Nginx平滑升级其原理简单概括:
- (1)在不停掉老进程的情况下,启动新进程。
- (2)老进程负责处理仍然没有处理完的请求,但不再接受处理请求。
- (3)新进程接受新请求。
- (4)老进程处理完所有请求,关闭所有连接后,停止。
信号说明:
信号
nginx内置shell
说明
HUP
nginx -s reload
重载配置文件
USR1
nginx -s reopen
重新打开日志文件,配置mv,用做日志切割
USR2
-
热升级nginx程序
WINCH
-
优雅的关闭相关的worker进程
QUIT
nginx -s squit
优雅的停止nginx
TERM,INT
nginx -s stop
立即停止nginx
2、实践:1.16版本 升级到 1.18版本nginx -vnginx version: nginx/1.16.1
按照原来的编译参数安装 nginx 的方法进行安装,只需要到 make,千万不要 make install 。如果make install 会将原来的配置文件覆盖
wget http://nginx.org/download/nginx-1.18.0.tar.gztar zxvf nginx-1.18.0.tar.gz -C /usr/local/srccd /usr/local/src/nginx-1.18.0./configure --prefix=/usr/local/nginx --user=nginx --with-http_ssl_modulemake
备份替换nginx命令:
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_$(date +%F)cp /usr/local/src/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/
测试新版本:
/usr/local/nginx/sbin/nginx -t/usr/local/nginx/sbin/nginx -v
查找nginx.pid文件位置
find / -name nginx.pid/usr/local/nginx/logs/nginx.pid
发送平滑迁移信号 USR2: 启动新的主进程,实现热升级
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
发送WINCH信号给旧版主进程,旧版主进程就开始从容关闭
kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
3、升级失败 回滚操作1、替换原来的 nginx命令
cd /usr/local/nginx/sbin/mv nginx_2022-03-21 nginx
2、kill -HUP 旧版本的Master进程号
//不重载 配置文件下 启动旧的worker进程
kill -HUP `cat /usr/local/nginx/logs/nginx.pid.oldbin`
3、kill -USR2 新版本的主进程号
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
4、kill -WINCH 新版本的主进程号
kill -WINCH `cat /usr/local/nginx/logs/nginx.pid`
4、遇到问题**问题:**执行完成 “发送平滑迁移信号 USR2” 没有出现新的Master进程信息
查看日志 报错内容为: 大致意思是 找不到 nginx 目录
execve() failed while executing new binary process "nginx" (2: No such file or directory)
原因: Nginx平滑升级是根据环境变量来进行的 ,找不到 nginx目录 是因为上次启动nginx不是 使用完全路径启动的 而环境变量中并没有 nginx这个目录 所以导致 这个问题!
**解决:**使用正确的启动方法
/usr/local/nginx/sbin/nginx
九、Nginx 优化方案参考文档1:
参考文档2:
十、扩展1、网站返回码200# 请求成功201# 上传文件成功301# 永久重定向(redirect)302,307 # 临时重定向(redirect)304# 浏览器缓存403# 请求不到首页,没有权限404# 请求的资源在前端查明不存在405# 请求方法不支持500# 服务器的内部错误,程序错误502# 请求的资源前端有记录指向后端数据库,却找不到后端资源503# 服务暂时不可用504# 请求超时
2、URL和URI的区别URL:统一资源定位符格式:https://www.baidu.com/?tn=98010089_dg&ch=12URL和URI的区别: URI:可以理解成一个网站的首页URL:可以理解成资源的具体路径
3、F12网络返回参数General(大致信息):
Request URL: http://10.10.14.100/index.html # 请求的URL地址Request Method: GET # 请求的方法Status Code: 304 OK # 状态码Remote Address: 10.10.14.100:80 # 请求地址(ipv4/ipv6)Referrer Policy: no-referrer-when-downgrade # 降级(从https降级到http)
Request Headers(请求头部信息):
Accept: text/html # 请求的类型Accept-Encoding: gzip, deflate, br # 是否进行压缩Accept-Language: zh-CN,zh;q=0.9 # 请求的语言Connection: keep-alive # TCP长连接cache-control:max-age=0 # 缓存时间Cookie: # 客户端缓存,用户密码等网站信息Host:www.baidu.com/ # 请求的域名Upgrade-Insecure-Requests: 1 # 启用升级https访问User-Agent: Mozilla/5.0 # 客户端浏览器(可以理解xxx浏览器是基于什么内核开发出开的)
Response Headers(服务器响应头部信息):
Cache-Control: private# 缓存类型非公开(公开:pubLic)Connection: keep-alive# 长连接Content-Encoding: gzip# 压缩格式gzipContent-Type: text/html;charset=utf-8 # 文档类型Date: Sat, 14 Mar 2020 08:48:02 GMT # 响应时间Expires: Sat, 14 Apr 2022 08:47:42 GMT # 失效时间Server: BWS/1.1 # 网站服务器软件status:200 # 状态码
4、curl 常用测试参数-I 参数: 只显示响应内容
curl -I 127.0.0.1:8080HTTP/1.1 200 Set-Cookie: JSESSIONID=CA2EC2BDA2C9E6A0BE3EB87FDEEFA8FA; Path=/; HttpOnlyContent-Type: text/html;charset=ISO-8859-1Transfer-Encoding: chunkedDate: Sat, 09 Apr 2022 06:27:19 GMT
-i 参数:显示响应内容 + 整体内容
curl -i 127.0.0.1:8080