一、nginx简介
Nginx是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个 BSD-like 协议下发行,可以在 UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及 Microsoft Windows 等操作系统中运行。Nginx是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 5万个并发连接数。
其特点是占有内存少,并发能力强
可以做什么?
- Nginx 作为 web 服务器
- 正向代理
- 反向代理
- 负载均衡
- 动静分离
二、nginx安装部署
环境: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]# ls
nginx-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 #重新加载配置访问
出现如下界面,则标志安装成功

配置系统服务
配置服务脚本nginx.service(路径/usr/local/nginx/sbin)
[root@localhost nginx-1.23.3]# vi /usr/lib/systemd/system/nginx.service脚本内容如下
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=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访问测试
出现如下界面,则标志安装成功

2.2 docker安装
下载nginx镜像
# 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest )
docker pull nginx创建Nginx配置文件
# 创建挂载目录
mkdir -p /apps/nginx/conf
mkdir -p /apps/nginx/log
mkdir -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.d文件夹下内容复制到宿主机
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对应的容器id
docker 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_temp
9 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数量或者2倍于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.20.29;
location / {
root /opt/demo1;
index index.html;
}
}
server {
listen 80;
server_name 192.168.20.30;
location / {
root /opt/demo2;
index index.html;
}
}5.2 多端口配置
server {
listen 80;
server_name 192.168.20.29;
location / {
root /opt/demo1;
index index.html;
}
}
server {
listen 81;
server_name 192.168.20.29;
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.org
3. 以*号结尾的最长通配符名称,例如 mail.*
4. 第一个匹配的正则表达式(在配置文件中出现的顺序)- 尽量使用精确匹配;
- 当定义大量server_name时或特别长的server_name时,需要在http级别调整server_names_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 作为内容服务器集群的负载均衡
#定义一组服务器
upstream 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|jpeg|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=2伪地址(访问):http://192.168.2.192/2.html
rewrite语法
rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,重定向到replacement,结尾是flag标记。
语法:
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag标记
关键字:其中关键字不能改变
正则:perl兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记: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规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
redirect 和 perement 的区别
redirect 302 会返回的临时重定向
perement 301 返回 永久冲定向。
这个 301 和 302 的区别,在我们实际给真实的用户,我们用户去适用的时候其实是没有任何区别的,它都会跳转,然后这个 URL 都会发生变化。这个临时重定向和永久重定向,这是给我们的这个网络爬虫给它来看的。配置案例
访问http://localhost/2.html 通过转发返回http://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+负载均衡
#定义一组服务器
upstream 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而是域名(去掉http:// 前缀)
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 中本机域名某个匹配,则允许该请求访问
其他字符串类型:检测referer与字符串是否匹配,如果匹配则允许访问,可以采用通配符*
正则表达式:若 referer 的值匹配上了正则,就允许访问
invalid_referer 变量:允许访问时变量值为空,不允许访问时变量值为 1。
示例
server {
server_name ;
listen 80;
error_log logs/myerror.log debug;
root html;
location / {
valid_referers none server_names
*. /nginx/;
if ($invalid_referer) {
return 403; # 返回错误码
}
return 200 'valid\n';
}
}
# none:表示没有 referer 的可以访问
# server_names:表示本机 server_name 也就是 可以访问
# *.:匹配上了正则的可以访问
# /nginx/:该页面发起的请求可以访问九、keepalived
9.1 keepalived简介
keepalived观察其名可知,保持存活,在网络里面就是保持在线,也就是所谓的高可用或热备,是集群管理中轻量级的保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生
9.2 keepalived作用
keepalived主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
9.3 安装
9.3.1 yum方式安装
每台服务器都需要安装,例如
主: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
}
}keepalived命令
启动keepalived
systemctl start keepalived重启keepalived
systemctl restart keepalived查看状态
systemctl status keepalived测试
ping 192.168.2.161ping通即可
其他测试:停掉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文件路径
}
















