Nginx
发表于:2023-08-06 | 分类: 中间件
字数统计: 2.8k | 阅读时长: 11分钟 | 阅读量:

1. Nginx简介

流行的Nginx的版本有:

  • nginx:Nginx的官方开源版本
  • nginx plus:Nginx发型的付费版本,在整合第三方模块、运营监控以及技术支持上有很大的优势
  • Tengine:阿里基于nginx的开发版本
  • OpenResty:如需开发API服务器或防火墙可选

安装

配置好虚拟机的静态ip后解压tar包:

1
tar -zxvf nginx-1.25.1.tar.gz

安装依赖:

1
2
3
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel

进入解压的文件夹后编译安装:

1
2
3
./configure --prefix=/usr/local/nginx
make
make install

关闭防火墙后启动服务我们就可以直接通过浏览器访问:

1
2
3
4
5
6
//进入安装好的目录
cd /usr/local/nginx/sbin
./nginx 启动
./nginx -s stop 快速停止
./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload 重新加载配置

安装为系统服务:

1
vi /usr/lib/systemd/system/nginx.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[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

重新加载服务:

1
2
3
4
5
systemctl daemon-reload
//启动服务
systemctl start nginx.service
//开机启动
systemctl enable nginx.service

目录结构

nginx的主目录:/usr/local/nginx

2670d7c0d2b303a7aec36a8b84bd03b5.png

其中以_temp结尾的都是第一次运行时生成的用于存放临时文件的

  • conf:用来存放配置文件相关
  • html:用来存放静态文件的默认目录 html、css等
  • logs:用于存放日志文件
  • sbin:nginx的主程序

2. 基本使用

运行流程:

e84c8c3f7d6123fdceecb413fd8bb251.png

当我们reload进程时,Nginx会通知worker不再接收请求,并在处理完当前请求后销毁,同时创建新的worker接收请求。

最小配置

8c04fecc3be01e469c5be70484aa89c8.png

  • worker_processes:默认为1,表示开启一个业务进程
  • worker_connections 1024; 单个业务进程可接受连接数
  • include mime.types; 引入http mime类型
  • default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。
  • sendfile on; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
  • keepalive_timeout 65;

未开启sendfile:

d67c433a859b7827c85e018637eda585.png

开启:

17ec96d16653df5102e2b060ba3de1e8.png

HTTPDNS

传统的DNS(也称LocalDNS)原理:

19d3e6de96de5b2cbfd91c826b1206ff.png

HTTPDNS是使用HTTP协议向DNS服务器的进行请求,代替传统的DNS协议使用UDP协议向DNS服务器的进行请求,绕开了运营商的Local DNS,简化了请求的复杂性,避免了使用运营商Local DNS造成的劫持和跨网问题。

de83010910f6e78b69c6bae4cc2e9c25.png

虚拟主机

通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务,一个server就是一个虚拟主机:

1
2
3
4
5
6
7
8
9
10
11
12
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;
}
}

可以配置多个server(端口号和主机名不能都相同),但需要注意的servername匹配分先后顺序,Nginx会直接响应最先匹配的server。

可以在同一servername中匹配多个域名:

1
server_name vod.mmban.com www1.mmban.com;

通配符匹配:

1
2
server_name *.mmban.com #实现多用户二级域名
server_name vod.*;

短网址和多用户二级域名的实现有些类似,都是服务端在数据库中查询数据

正则匹配:

1
server_name ~^[0-9]+\.mmban\.com$;

反向代理

  • 正向代理:

2daff0cdf18d732803022a68f00a43e4.png

这里的代理服务器其实就是网关。

  • 反向代理:

6ee10e9724ea764e614600da21df9fba.png

这种网络的传输速度有代理服务器的带宽限制,称为隧道式代理

若在返回数据时直接返回给用户,称为DR模型,由LVS实现

传统公司系统架构

temp.png

但在一些互联网项目,需要传输音频等大体积的静态资源时,Nginx就会成为网络瓶颈,此时就需要创建多个Nginx组,引入负载均衡器。

配置反向代理

1
2
3
4
5
6
7
location / {
proxy_pass http://www.atguigu.com/;
#或
#proxy_pass http://192.168.3.100:8080;
#root html;
#index index.html index.htm;
}

ip地址和域名是一对多的关系。一个ip地址可以有多个域名,一个域名只能有一个ip地址。

配置负载均衡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
upstream temp {
server 192.168.64.102:80;
server 192.168.64.103:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass temp;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

负载均衡策略

配置好负载均衡后,默认使用的负载均衡策略是轮询,逐一转发,这种方式适用于无状态请求。

weight(权重):指定轮询几率,用于后端服务器性能不均的情况

1
2
3
4
5
6
upstream httpd {
#默认为80端口可以不指定
server 127.0.0.1:8050 weight=10 down;
server 127.0.0.1:8060 weight=1;
server 127.0.0.1:8060 weight=1 backup;
}
  • down:表示当前的server暂时不参与负载
  • weight:默认为1.weight越大,负载的权重就越大。
  • backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。

ip_hash:根据客户端的ip地址转发同一台服务器,可以保持回话(定向用户转发)

least_conn:优先向最少连接访问的服务器发起请求

url_hash:需要第三方组件,根据用户访问的url定向转发请求(定向流量转发)

fair:需要第三方组件,根据后端服务器响应时间转发请求

动静分离

将静态的资源放到Nginx中,Tomcat专门处理动态请求

1
2
3
4
5
6
7
8
9
10
11
12
location /css {
root /usr/local/nginx/static;
index index.html index.htm;
}
location /images {
root /usr/local/nginx/static;
index index.html index.htm;
}
location /js {
root /usr/local/nginx/static;
index index.html index.htm;
}

我们也可以使用正则表达式:

1
2
3
4
location ~*/(css|img|js) {
root /usr/local/nginx/html;
index index.html index.htm;
}

/通用匹配,任何请求都会匹配到;=精准匹配,不是以指定模式开头;~正则匹配,区分大小写;~*正则匹配,不区分大小写;^~非正则匹配,匹配以指定模式开头的location。

除了root,alias也可以指定路径:

1
2
3
4
location /css {
alias /usr/local/nginx/static/css;
index index.html index.htm;
}

alias在接受请求的时候在路径上不会加上location;有bug不建议使用

UrlRewrite

rewrite语法格式及参数语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,重定向到replacement,结尾是flag标记。

rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag标记

rewrite参数的标签段位置:
server,location,if

flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

301和302仅面向爬虫和浏览器,用户体验无差

实例:

1
2
3
4
location /css {
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
proxy_pass http://192.168.44.100:8080;
}

网关服务器

综合负载均衡器和反向代理服务器等功能。

首先开启应用服务器的防火墙:

1
2
3
4
5
6
7
8
9
10
#重启防火墙
systemctl restart firewalld
#重载规则
firewall-cmd --reload
#指定端口和ip访问
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.44.101" port protocol="tcp" port="8080" accept"
#查看已配置规则
firewall-cmd --list-all
#移除规则
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.44.101" port port="8080" protocol="tcp" accept"

网关配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream httpds {
server 192.168.44.102 weight=8 down;
server 192.168.44.103:8080 weight=2;
server 192.168.44.104:8080 weight=1 backup;
}
location / {
#UrlRewrite
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 redirect;
#反向代理+负载均衡
proxy_pass http://httpds ;
}
#动静分离
location ~*/(css|img|js) {
root /usr/local/nginx/html;
index index.html index.htm;
}

配置防盗链

为了防止其它网站随意引用我们页面的资源,可以使用Nginx进行url过滤。

使用规则:

1
valid_referers none | blocked | server_names | ....;
  • none, Referer 头域不存在时允许访问。
  • blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头。
  • server_names ,可以允许多个ip或域名访问,优先使用域名(如果域名下有外链图片只能用域名)

Referer 是请求头的一部分,显示来源地址。

外链图片就是非项目本地服务器的资源,通过网络使用其他网站图片

实例:

1
2
3
4
5
6
7
location ~*/(css|img|js) {
valid_referers 192.168.44.101;
if ($invalid_referer) {
return 403;
}
root html;
}

返回错误页面:

1
2
3
4
5
6
7
8
9
10
11
12
location ~*/(css|img|js) {
valid_referers 192.168.44.101;
if ($invalid_referer) {
return 401;
#return /401.html; 这个不用额外配置,更简洁
}
root html;
}
error_page 401 /401.html
location = /401.html{
root html;
}

结合rewrite返回报错图片:

1
2
3
4
5
6
7
8
location ~*/(css|img|js) {
valid_referers 192.168.44.101;
if ($invalid_referer) {
#图片在html/img目录下
rewrite ^/ /img/x.png break;
}
root html;
}

curl

一个非常实用的、用来与服务器之间传输数据的工具。

可以使用curl测试Nginx是否配置成功:

1
2
#-e表示带引用,即设置Rerferer,-I表示显示响应头信息
curl -e "http://baidu.com" -I http://192.168.44.101/img/logo.png

配置高可用

手动安装Keepalived:

[下载地址](Keepalived for Linux);使用 ./configure 编译安装

如报错需要安装依赖:

1
yum install openssl-devel

yum安装:

1
yum install -y keepalived

使用yum安装后配置文件在/etc/keepalived/keepalived.conf

最小配置(两台Nginx):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
! Configuration File for keepalived
global_defs {
#组中的id
router_id lb111
}
#名字随意
vrrp_instance atguigu {
state MASTER
#配置网卡信息,通过ip addr查看
interface ens33
virtual_router_id 51
#优先级
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
#虚拟ip(vip)用于接收请求
192.168.44.200
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
! Configuration File for keepalived
global_defs {
router_id lb110
}
#名字随意
vrrp_instance atguigu {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.44.200
}
}

Keepalived根据检测到多台机器上的Keepalived进程来判断机器是否宕机,不能查看Nginx是否出异常,我们可以写脚本将Nginx和Keepalived关联起来。

Https证书

服务器和CA机构以及https的关系:

  1. 服务器首先向CA机构提交资料,被承认后服务器返回客户端的公钥会被CA机构使用私钥进行加密包装为证书
  2. 客户端收到证书后会用操作系统绑定的CA公钥进行解锁,取得服务器发送的公钥
  3. 然后客户端使用服务器的公钥加密对称加密的密钥,之后服务器拿私钥解密,最终服务器与客户端便使用对称加密进行数据传输。

使用阿里云配置实践可以参照

配置环境可以使用OneinStack

BBS系统就是网络论坛,网上有许多优秀的开源项目。

上一篇:
RabbitMQ
下一篇:
速成MarkDown