一、nginx简介
Nginx是轻量级的 Web 服务器 / 反向代理服务器和电子邮件(IMAP代理服务器/POP3,并在一个 BSD-like 协议下发行,可在 UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及 Microsoft Windows 在操作系统中运行。Nginx是高性能的 HTTP 与反向代理的web服务器具有很强的处理高并发性,能够承受高负荷 有报告显示,负载测试可以支持高达 并发连接数5万个。
其特点是占有内存少,并发能力强
能做什么?
- Nginx 作为 web 服务器
- 正向代理
- 反向代理
- 负载均衡
- 动静分离
环境:centos7
版本:1.23.3
地址:http://nginx.org/en/download.html
2.1 用源代码编译安装安装安装
[root@localhost nginx]# wget http://nginx.org/download/nginx-1.23.3.tar.gz--2023-02-09 22:46:37-- http://nginx.org/download/nginx-1.23.3.tar.gz正在分析主机 nginx.org (nginx.org)... 52.58.199.22, 3.125.197.172, 2a05:d014:edb:5702::6, ...正在连接 nginx.org (nginx.org)|52.58.199.22|:80... 已连接。已发出 HTTP 请求,等待回应... 200 OK长度:1108958 (1.1M) [application/octet-stream]保存至: “nginx-1.23.3.tar.gz”100%[===============================================================================================================================================================================================>] 1,108,958 510KB/s 用时 2.1s 2023-02-09 22:47:11 (510 KB/s) - 已保存 “nginx-1.23.3.tar.gz” [1108958/1108958]#解压安装包[root@localhost nginx-1.23.3]# tar zxvf nginx-1.23.3.tar.gz#查看安装包[root@localhost nginx-1.23.3]# pwd/home/nginx[root@localhost nginx-1.23.3]# lsnginx-1.23.3 nginx-1.23.3.tar.gz# 编译[root@localhost nginx-1.23.3]# cd nginx-1.23.3[root@localhost nginx-1.23.3]# ./configure --prefix=/usr/local/nginx # --prefix=/usr/local/nginx 指安装路径/usr/local/nginx,[root@localhost nginx-1.23.3]# make[root@localhost nginx-1.23.3]# make install
启动
# 进入安装好的目录 /usr/local/nginx/sbin[root@localhost nginx-1.23.3]# cd /usr/local/nginx/sbin# 启动[root@localhost sbin]# ./nginx
其他命令
./nginx # 启动./nginx -s stop #快速停止./nginx -s quit #优雅关闭,在退出前完成已接受的连接请求./nginx -s reload #重新加载配置
访问
地址:http://192.168.2.193/
如下界面出现,标志安装成功
配置系统服务nginxx配置服务脚本.service(路径/usr/local/nginx/sbin)
[root@localhost nginx-1.23.3]# vi /usr/lib/systemd/system/nginx.service
脚本内容如下
[Unit]Description=nginx - web serverAfter=network.target remote-fs.target nss-lookup.target[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.confExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin/nginx -s stopExecQuit=/usr/local/nginx/sbin/nginx -s quitPrivateTmp=true[Install]WantedBy=multi-user.target
重载系统服务
[root@localhost nginx-1.23.3]# systemctl daemon-reload
启动服务
[root@localhost nginx-1.23.3]# systemctl start nginx.service
设置启动启动
[root@localhost nginx-1.23.3]# systemctl enable nginx.service
访问测试
地址:http://192.168.2.193/
如下界面出现,标志安装成功
2.2 docker安装下载nginx镜像
# 下载最新版本的Nginx镜像 (实际上,这个命令相当于 : docker pull nginx:latest )docker pull nginx
创建Nginx配置文件
# 创建mkdirir创建挂载目录 -p /apps/nginx/confmkdir -p /apps/nginx/logmkdir -p /apps/nginx/html
将nginx放在容器中.conf文件和conf文件.将d文件夹复制到宿主机
# docker生成容器 run --name minNginx -p 81:80 -d nginx# 将容器nginx.conf文件复制到宿主机docker cp minNginx:/etc/nginx/nginx.conf /apps/nginx/conf/nginx.conf# conf容器.将内容复制到宿主机docker cp minNginx:/etc/nginx/conf.d /apps/nginx/conf/conf.d# 将容器中的html文件夹复制到宿主机docker cp minNginx:/usr/share/nginx/html /apps/nginx/
创建Nginx容器并运行
# docker直接执行 rm nginx或容器id关闭容器# 找到nginx对应的容器idocker ps -a# 关闭容器docker stop minNginx# 删除该容器的docker rm minNginx # 或删除正在运行的nginx容器docker rm -f minNginx
配置文件
根据需要修改目录/app/nginx可以在conf下配置文件
启动
docker run \-p 81:81 \--name minNginx \-v /apps/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \-v /apps/nginx/conf/conf.d:/etc/nginx/conf.d \-v /apps/nginx/log:/var/log/nginx \-v /apps/nginx/html:/usr/share/nginx/html \-d nginx:latest
三、目录结构及运行原理
查看nginx目录
[root@localhost sbin]# tree /usr/local/nginx/usr/local/nginx├── client_body_temp├── conf│ ├── fastcgi.conf│ ├── fastcgi.conf.default│ ├── fastcgi_params│ ├── fastcgi_params.default│ ├── koi-utf│ ├── koi-win│ ├── mime.types│ ├── mime.types.default│ ├── nginx.conf│ ├── nginx.conf.default│ ├── scgi_params│ ├── scgi_params.default│ ├── uwsgi_params│ ├── uwsgi_params.default│ └── win-utf├── fastcgi_temp├── html│ ├── 50x.html│ └── index.html├── logs│ ├── access.log│ ├── error.log│ └── nginx.pid├── proxy_temp├── sbin│ ├── nginx│ └── nginx.old├── scgi_temp└── uwsgi_temp9 directories, 22 files
主要目录说明:
sbin:可执行文件
conf:核心配置文件
html:静态页面
logs:存储日志信息
四、配置文件说明nginx的初始化.conf(删除注释)
worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}
全局块
worker_processes 1;
这是 Nginx 服务器并发处理的关键配置,worker_processes 值越大,可以支持的并发处理量越多,但是 会受到硬件、软件等设备的限制。
工作流程:数量。根据硬件调整,通常等于CPU数量或CPU数量的两倍。
events块
events { worker_connections 1024;}
每个 word process 可同时支持的最大连接数等;
每个 work process 支持的最大连接数为 1024.
http
http是Nginx 绝大多数功能和第三方模块的配置,如代理、缓存和日志定义,都是服务器配置中最频繁的部分
http 块也可以包括 http全局块,server 块。
http全局块http全局块配置指令包括文件介绍,MIME-TYPE 定义、日志自定义、连接超时间、单链接请求数上限等。 server 块与虚拟主机密切相关。从用户的角度来看,虚拟主机与独立的硬件主机完全相同。该技术的产生是为了 节省互联网服务器硬件成本。 每个 http 块可以包括多个块 server 块,而每个 server 块相当于虚拟主机。而每个 server 块也分为全局 server 块,可以同时包含多个块 locaton 块。 全局 server 块最常见的配置是虚拟机主机的监控配置,以及虚拟主机的名称或IP配置。 location 块一个 server 多个块可以配置 location 块。这一块的主要功能是基于 Nginx 服务器收到的请求字符串(例如 server_name/uri-string),虚拟主机名称 (也可以是IP 以外的字符串(如别名)(例如 前面的 /uri-string)匹配,处理具体要求。 地址定位,数据缓慢 这里还有许多第三方模块的配置,如存储和响应控制。
五、虚拟主机配置5.1 多IP配置
一台Linux服务器绑定两个ip:192.168.20.30、192.168.20.29
server { listen 80; server_name 192.168.1.1; location / {root /opt/demo1; index index.html; }}server { listen 80; server_name 192.168.1.2; location / { root /opt/demo2; index index.html; }}
5.2 多端口配置
server { listen 80; server_name 192.168.2.193; location / { root /opt/demo1; index index.html; }}server { listen 81; server_name 192.168.2.193; location / { root /opt/demo2; index index.html; }}
5.3 多域名配置
server { listen 80; server_name www.demo1.com; location / { root /opt/demo1; index index.html; }}server { listen 80; server_name www.demo2.com; location / { root /opt/demo2; index index.html; }}
5.4 server_name匹配原则
1.完整匹配
多个域名可以在server中配置,例如:
server_name test.demo1.com test.demo2.com;
2.匹配通配符
server_name *.demo.com;
需要注意的是,精确匹配的优先级大于通配符匹配和正则匹配
3.通配符结束匹配
server_name test.demo.*;
4.正则匹配
server_name ~^www\d+\.example\.com$;
正常的匹配格式必须是~开头。如果开头没有~,nginx被认为是准确的匹配。逻辑上,需要添加^和$锚定符号。请注意,在正则匹配格式中。它是正则元字符,如果需要匹配.,需要反斜线转义。
如果正则匹配中含有{和},则需要引用双引号,以避免nginx报错。如果没有双引号,nginx将报告以下错误:directive "server_name" is not terminated by ";" in ..。
5.特殊匹配格式
server_name ""; 不存在匹配Host请求头的情况。
匹配顺序
1. 精确的名字2. 以*号开头的最长通配符名称为例 *.example.org3. 以*号结尾最长通配符的名称,例如 mail.*4. 第一个匹配的正则表达式(出现在配置文件中的顺序)
- 尽量使用精确匹配;
- 当定义大量server_name或特别长的server_name时,需要在http级别调整server_namenames_hash_max_size和server_names_hash_bucket_size,否则nginx将无法启动。
反向代理是指用代理服务器接收Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上获得的结果返回到请求在Internet上连接的客户端。此时,代理服务器外部显示为服务器。
反向代理服务器通常有两种模型,一种是内容服务器的替身,另一种是内容服务器集群的负载平衡器。
6.1 作为内容服务器的替身
通过访问跳转百度的配置
server { listen 80; server_name 192.168.2.193; location / { proxy_pass http://www.atguigu.com/ ; }}
测试访问:192.168.2.193
6.2 负载平衡作为内容服务器集群
#定义一组服务器upstreamm httpds{ server 192.168.2.191:80; server 192.168.8.192:80;} server { listen 80; server_name 192.168.2.193; location / { proxy_pass http://httpds ; }}
三种模式
轮询模式(默认):如果后端服务器down丢失,每个请求将按时间顺序逐一分配到不同的后端服务器。
weight权重模式:这种方式比较灵活。当后端服务器性能不同时,可以充分发挥服务器性能,通过配置权重有效利用资源。
upstream httpds{ server 192.168.8.191 weight=10; server 192.168.8.192 weight=1; # server 192.168.8.191 weight=10 down; #down表示不参与负载平衡 # server 192.168.8.192 weight=10 backup; #backup表示是备用服务器,当没有服务器可用时使用}
ip_hash:如果客户已经访问了服务器,当用户再次访问时,请求将通过哈希算法自动定位到服务器。每个请求都根据访问ip的hash结果进行分配,以便每个访问者可以通过固定访问后端服务器来解决session不能跨服务器的问题。
upstream httpds {server 192.168.8.191:8080;server 192.168.8.192:8081;ip_hash;}server {listen 80;server_name localhost;location / {proxy_pass http://httpds;}}
七、动静分离7.1动静分离
为了提高网站的响应速度,减少程序服务器(Tomcat,Jboss等)的负载,对于静态资源,如图片,js、css等文件可以在反向代理服务器中缓存,这样当浏览器要求静态资源时,代理服务器可以直接处理,而无需将请求转发给后端服务器。对于servlet等用户请求的动态文件、jsp,将其转发给Tomcat,Jboss服务器处理,即动态文件与静态文件的分离。
两种方式:
一: 纯粹将静态文件独立成独立域名,放在独立服务器上,也是目前主流推崇的解决方案;
二是动态与静态文件混合发布,通过nginx分开。
动态资源代理
#location配置如下 / { proxy_pass 路径;}
静态资源代理
#location配置如下 /{ root静态资源路径; Index默认访问路径下的资源是什么? autoindex on;#以列表的形式展示静态资源的全部内容。}
配置案例
#user nobody;worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { proxy_pass http://192.168.2.191:8080; } # 静态资源配置 location /images { root /www/resources; index index.html index.htm; } location /js { root /www/resources; index index.html index.htm; } location /css { root /www/resources; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}
在实际使用中,定义了三个匹配规则:
1、直接匹配网站根部,通过域名访问网站主页更频繁,使用这将加速处理,如官方网站。
location = / { proxy_pass http://192.168.2.191:8080/; }
2、直接转发到后端应用服务器,也可以是静态主页。
location ^~ /static/ { root /webroot/static/;}location ~* \.(html|gif|jpg|png|css|js|ico)$ { root /webroot/res/;}
3、一般规则用于将动态请求转发到后端应用服务器。
location /api/ { proxy_pass http://192.168.2.191:8080/api/}
7.2 URL Rewrite
rewrite是实现URL重写的关键指令。根据regex(正则表达式)的部分内容,重定向到repacement,最后是flag标记。
优点:隐藏真实url和url中可能暴露的参数,以及隐藏web中使用的编程语言,以提高搜索引擎的安全性
缺点:降低效率,影响性能。如果项目用于内部网络,如公司内部软件,则无需配置。
效果:
实际地址:http://192.168.2.192/index.jsp?pageNum=伪地址(访问):http://192.168.2.192/2.html
rewrite语法
根据regexx,rewrite是实现URL重写的关键指令 (正则表达式)部分内容,重定向到replacement,最后是flag标记。语法:rewrite <regex> <replacement> [flag];关键字 正则 替代内容 flag标记关键词:关键词不能改变正则:perl兼容正则表达式语句用规则匹配替代内容:用replacementflag标记替换正则匹配的内容:rewrite支持的flag标记rewrite参数的标签段位置: server,location,if 理解:rewrite ^ 正则 $ 书写变更地址,真实地址 转发的形式 (break ,rewrite,last,redirect ,percent )例子:rewrite ^ /2.html $ /index.jsppageNum=2 break;URLRewrite 的关键字 rewrite ,后面是正则表达式,这是正则表达式 ^ 开始,然后用这个$ 结尾, 里面写正则, 写下我们想要改变的地址,这就是flag标记的原始真实地址:last #本条规则匹配完成后,继续向下匹配新的location URI规则breakak #本规则匹配完成后终止,不再匹配以下任何规则 #返回302临时重定向,浏览器地址将显示跳转后的URL地址permanentnt #返回301永久重定向,浏览器地址栏将显示跳转后的URL地址redirect 和 perement redirecttt的区别 302 临时重定向将返回 perement 301 返回 永久冲定向。这个 301 和 302 区别,当我们实际上给真正的用户,我们的用户实际上没有区别,它会跳转,然后这个 URL 一切都会改变。这个 301 和 302 区别,当我们实际上给真正的用户,我们的用户实际上没有区别,它会跳转,然后这个 URL 一切都会改变。这种临时重定向和永久重定向是给我们的网络爬虫看的。
配置案例
访问http://localhost/2.html 通过转发返回httpp://192.168.2.191:8080/index.jsp?pageNum=2内容
#user nobody;worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { rewrite ^/2.html /index.jsp?pageNum=2 break proxy_pass http://192.168.2.191:8080; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}
也可通过正则表达式灵活传参,如下:
#user nobody;worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { rewrite ^([0-9]+).html$ /index.jsp?pageNum=$1 break proxy_pass http://192.168.2.191:8080; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}
说明:rewrite ^([0-9]+).html$ /index.jsp?pageNum=$1 break
^([0-9]+).html$:匹配所有数字.html;
$1:识别第一个匹配的变量值。
7.3 URL rewrite+负载均衡
#定义一组服务器upstreamm httpds{ server 192.168.2.191:80; server 192.168.8.192:80;} server { listen 80; server_name 192.168.2.193; location / { rewrite ^([0-9]+).html$ /index.jsp?pageNum=$1 break proxy_pass http://httpds ; }}
八、防盗链
盗链是指服务提供商不提供服务的内容,通过技术手段绕过其他有利可图的最终用户界面(如广告),直接在自己的网站上向最终用户提供其他服务提供商的服务内容,欺骗最终用户的浏览和点击率。受益人不提供资源或很少的资源,但真正的服务提供商不能获得任何好处。
valid_referers 指令,配置是否允许 referer 头部和允许的东西 referer 访问。 192.168.2.193不是ip,而是域名(删除httpp:// 前缀)
location ^~/images/ { valid_referers 192.168.2.193; if ($invalid_referer) { # 注意这里的if,然后添加空格 return 403; ## 返回错误码 } root /www/resources; }
说明:
none:允许没有 referer 请求访问信息,即通过url直接访问。blocked:请求头referer字段不为空(即存在referer),但值可为空(值被代理或防火墙删除),允许refer不为“http://”或“https:一般来说,开头是允许的“//”http://”或"https以外的请求。**server_names:若 referer 中站域名与 server_name 如果中间域名匹配,请求允许访问其他字符串类型:检测refererer和字符串是否匹配。如果匹配,则允许访问,可以使用一般匹配符*正则表达:如果 referer 值与正则相匹配,允许访问invalid_referer 变量:允许访问时变量值为空,不允许访问时变量值为空 1。
示例
server { server_name referer.test.com; listen 80; error_log logs/myerror.log debug; root html; location / { valid_referers none server_names *.test.com www.test.org.cn/nginx/; if ($invalid_referer) { return 403; # 返回错误码 } return 200 'valid\n'; }}# none:表示没有 referer 的可以访问# server_names:表示本机 server_name 也就是 referer.test.com 可以访问# *.test.com:匹配正则的可访问# www.test.org.cn/nginx/:页面发起的请求可以访问
九、keepalived9.1 kepalived简介
keepalived
观察它的名字,保持生存,在网络中保持在线
,也就是所谓的高可用
或热备
,在集群管理中轻量级保证集群高可用性
服务软件的功能与服务软件相似heartbeat
,用于防止单点故障(单点故障是指一旦某一点出现故障,就会导致整个系统架构不可用)
keepalived
主要用作RealServer
健康状况检查和LoadBalance
主机和BackUP
主机之间failover
的实现。keepalived
它的作用是检测web
如果有服务器,如果有服务器的状态web
服务器死机,或工作故障,keepalived
检测到并出现故障web
当服务器从系统中删除时web
服务器正常工作后keepalived
自动将web
服务器加入到服务器组中,所有这些工作都是自动完成的,不需要人工干预,只需要修复故障的web服务器。
例如,每个服务器都需要安装,
主:192.168.2.191
从:192.168.2.192
yum install -y keepalived
安装后,配置文件目录如下:
/etc/keepalived/keepalived.conf
修改配置文件
keepalived.conf
global_defs { # 路由id:目前安装keepalived的节点主机标识符,保证全局唯一 router_id keep_171 } vrrp_instance VI_1 { #当前节点所属虚拟路由的名称 # 状态是MASTER主机还是备用机BACKUP state MASTER # 本实例绑定的网卡 interface eth0 # 确保主备节点一致 virtual_router_id 51 # 权重,master的权重一般高于backup。如果有很多,那就是选举。谁权重高,谁就当选 priority 100 # 同步检查主备之间的时间间隔,单位秒 advert_int 2 # 认证权限密码,防止非法节点进入 authentication { auth_type PASS auth_pass 1111 } # 虚拟ip,可以有多个(vip) virtual_ipaddress { 192.168.2.161 }}
修改正常情况 state、interface、virtual_ipaddress就够了。
具体配置如下
主:192.168.2.191
global_defs { # 路由id:目前安装keepalived的节点主机标识符,保证全局唯一 router_id keep_191 } vrrp_instance VI_1 { #当前节点所属虚拟路由的名称 # 状态是MASTER主机还是备用机BACKUP state MASTER # 本实例绑定的网卡 interface eth33 # 确保主备节点一致 virtual_router_id 51 # 权重,master的权重一般高于backup。如果有很多,那就是选举。谁权重高,谁就当选 priority 100 # 同步检查主备之间的时间间隔,单位秒 advert_int 2 # 认证权限密码,防止非法节点进入 authentication { auth_type PASS auth_pass 1111 } # 虚拟ip,可以有多个(vip) virtual_ipaddress { 192.168.2.161 }}
从:192.168.2.191
global_defs { # 路由id:目前安装keepalived的节点主机标识符,保证全局唯一 router_id keep_192 } vrrp_instance VI_1 { #当前节点所属虚拟路由的名称 # 状态是MASTER主机还是备用机BACKUP state BACKUP # 本实例绑定的网卡 interface eth33 # 确保主备节点一致 virtual_router_id 51 # 权重,master的权重一般高于backup。如果有很多,那就是选举。谁权重高,谁就当选 priority 50 # 同步检查主备之间的时间间隔,单位秒 advert_int 2 # 认证权限密码,防止非法节点进入 authentication { auth_type PASS auth_pass 1111 } # 虚拟ip,可以有多个(vip) virtual_ipaddress { 192.168.2.161 }}
kepalived命令
启动keepalived启动
systemctl start keepalived
重启keepalived
systemctl restart keepalived
查看状态
systemctl status keepalived
测试
ping 192.168.2.161
ping可以通过
其它测试:停止192.169.2.191主机,192.168.2.161IP漂移到192.169.2.192
十、配置https证书10.1 申请网上证书以阿里云为例
10.2 证书下载选择nginx证书下载,下载后获得两份文件,如下:
10.3 证书安装
server{listen 443 ssl;server_name localhost;ssl_certificate .pem文件全路径;ssl_certificate_key .key文件路径}