中间件-nginx

下面是nginx的基本使用。原理以后再学。未完待续。。。

一、nginx环境搭建

1、nginx运行环境-虚拟机联网

创建虚拟机的步骤就不再说了。创建完成之后,如何使虚拟机联网。

ip addr查看虚拟机的网卡配置

lo即本地回环,ens33即虚拟出来的网卡,但是还没有IP地址。

  • 修改配置网卡配置文件

vi /etc/sysconfig/network-scripts/ifcfg-ens33

下图说明这个IP地址是采取dhcp协议分配的,将会被随机分配,并且每次联网IP地址都可能不同。

  • 修改ONBOOT=yes
  • 重启网络服务

systemctl restart network

现在虚拟机就有IP地址了192.168.4.129

现在使用xshell连接这台虚拟机

2、配置静态IP地址

之前的网络配置是使用dhcp方式分配ip地址,这种方式会在系统每次联网的时候分配一个ip给我们用,也就是说有可能系统下次启动的时候ip会变,这样非常不方便我们管理。

DNS服务器配置的是阿里云的DNS解析服务器。

到现在,虚拟机就可以联网了。

3、下载nginx

http://nginx.org/en/download.html

官网下载tar.gz压缩包。选择Mainline version版本的中间那个。使用FTP工具将文件上传到虚拟机中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
tar -zxvf  nginx-1.21.6.tar.gz #解压到当前目录
cd nginx-1.21.6 #进入解压后的文件夹
#安装下载前的依赖

#安装C编译器
yum install -y gcc
#安装pcre库
yum install -y pcre pcre-devel
#安装zlib
yum install -y zlib zlib-devel

#开始安装
./configure --prefix=/usr/local/nginx #使用prefix选项指定安装的目录
make
make install

#启动
cd /usr/local/nginx/sbin
ls # 里面是一个nginx的可执行文件
./nginx # 启动这个可执行

nginx其他命令(在sbin目录下)

1
2
3
4
./nginx -s stop #快速停止
./nginx -s quit #完成已接受的请求后,停止
./nginx -s reload #重新加载配置
./nginx -t #检查nginx配置是否正确

配置nginx服务器开机自启动

1
2
3
4
5
6
#查看nginx状态
ps -ef|grep nginx
#快速停止
./nginx -s stop
systemctl start nginx
systemctl status nginx

注册系统服务

通过系统服务的方式启动nginx

1
vi usr/lib/systemd/system/nginx.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit] 
Description=nginx
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
systemctl enable nginx.service #启动

关闭防火墙

1
systemctl stop firewalld

二、nginx目录结构

1
2
3
4
5
6
7
8
9
10
11
conf #配置文件
|-nginx.conf # 主配置文件
|-其他配置文件,会被引入到了nginx.conf
html #静态页面
logs
|-access.log #访问日志(每次访问都会记录)
|-error.log #错误日志
|-nginx.pid #进程号
sbin
|-nginx #主进程文件
*_temp #运行时,生成临时文件

1、nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
worker_processes  1; # 启动的worker进程数,一般与主机的CPU个数相同

events {
worker_connections 1024; #每个worker进程的最大连接数
}


http {
include mime.types;#include是引入关键字,可以引入相同目录下的文件,mime.types是用来定义,请求返回的content-type)
default_type application/octet-stream;#mime.types未定义的,使用默认格式application/octet-stream

sendfile on;

keepalive_timeout 65; #长链接超时时间

#多个域名被解析到同一个服务器上,用nginx来分配显示的首页,servername就是不同的域名
server {
listen 80; #监听端口80
server_name localhost; #接收的域名

location / {
root html; #根目录指向html目录
index index.html index.htm; #http://域名/index 指向 index.html index.htm文件
}

error_page 500 502 503 504 /50x.html;# 服务器错误码为500 502 503 504,转到"域名/50x.html"
location = /50x.html {
root html;
}

}


}

修改完配置文件后,需要重启nginx

1
systemctl reload nginx

1、server_name匹配规则

可以在同一个server_name中配置多个域名。中间用空格隔开。

匹配方式:

  • 完整匹配。server_name haha.cn huhu.cn;
  • 通配符匹配。server_name *.haha.cn; 说明sdaidj.haha.cn都会配匹配到这个域名。精确匹配的优先级大于通配符匹配和正则匹配。
  • 通配符结束匹配。server_name www.xzj520520.*;
  • 正则匹配。即域名可以写成正则表达式。正则匹配格式,必须以~开头,比如:server_name ~^www\d+\.example\.net$;。如果开头没有~,则nginx认为是精确匹配。
  • 特殊匹配。server_name ""; 匹配Host请求头不存在的情况。

三、基本使用

1、配置内网域名

配置内网域名,暂时先不配置公网域名。

本机要想能解析这个域名,需要在C:\Windows\System32\drivers\etc中的hosts文件中添加域名的对应信息,其实这个文件也相当于本机的DNS服务器的功能,本地去解析这个域名时首先会看hosts文件中有没有对应IP地址,如果没有,才会继续往上层的DNS服务器去查询。

192.168.4.101 vickkkyz.com

这样访问vickkkyz.com就可以指定到这个IP地址了,然后nginx会将其转到index.html

注意:这个域名只有在这个主机上才可以转成这个IP地址,换一个主机就不可以了。

2、配置虚拟主机

可以配置不同域名,同一个IP地址。也可以配置不同端口号。

配置不同域名

现在给192.168.4.101配置两个域名。

192.168.4.101 abc.vickkkyz.com
192.168.4.101 def.vickkkyz.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server {
listen 80;
server_name abc.vickkkyz.com;

location / {
root /www/test01;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

server {
listen 80;
server_name def.vickkkyz.com;

location / {
root /www/test02;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

同理,也可以根据访问不通过端口号,来显示不同的资源。

我发现如果现在还有一个域名对应这个IP地址,但是现在nginx.conf文件中server没有配置,那么会直接匹配第一个server中配置的页面。

3、反向代理

代理:nginx帮用户把请求传到指定的业务服务器上,比如Tomcat服务器,即代理用户发送用户的请求。

反向代理:即用户不能直接访问到tomcat服务器,所以作为服务器方,提供了nginx供用户来访问,就类似于提供一个访问接口。因为是服务器端提供的,所以是反向代理。

有性能瓶颈,因为所有的数据都经过Nginx,所以Nginx服务器的性能至关重要。

nginx将请求转发给指定服务器,服务器返回的数据再返回给nginx,由nginx返回给用户。或者是服务器直接返回给用户。

需要在配置文件中加一个proxy_pass字段,后面的值是你要让nginx代理的地址(具体的网址),可以写多个。一旦加上这个字段,location中的root和index就失效了。

下面是ngin01的nginx.conf的部分配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name abc.vickkkyz.com;

location / {
#代理到 http://192.168.4.102,不支持https
proxy_pass http://192.168.4.102;
root /www/test01;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}

4、负载均衡

把请求,按照一定算法规则,分配给多台业务服务器(即使其中一个坏了/维护升级,还有其他服务器可以继续提供服务)

负载均衡的算法:

  • 轮询。请求到来后按顺序选择服务器。如果选中的服务器故障,会启动retry机制,尝试分配给下一个服务器。
  • 配置权重。

5、反向代理+负载均衡

同一个域名的反向代理,配置多组服务器域名。**需要定义地址别名 **

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
upstream httpds{
server 192.168.4.102:80; #如果是80端口,可以省略不写
server 192.168.4.103:80;
}

server {
listen 80;
server_name abc.vickkkyz.com;


location / {
proxy_pass http://httpds;
root /www/test01;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}

weight配置服务器的不同权重。

1
2
3
4
upstream httpds{
server 192.168.4.102:80 weight=6; #如果是80端口,可以省略不写
server 192.168.4.103:80 weight=2;
}

down让某些服务器不参与负载均衡。

1
2
3
4
upstream httpds{
server 192.168.4.102:80 weight=6 down;
server 192.168.4.103:80 weight=2;
}

backup配置配用服务器,正常情况不会负载到这个服务器,当没有服务器可以负载时,才会使用这个备用服务器。

1
2
3
4
upstream httpds{
server 192.168.4.102:80 weight=6 backup;
server 192.168.4.103:80 weight=2;
}

6、动静分离

原来,当用户请求时,请求通过nginx转发到某个tomcat服务器,然后tomcat服务器将响应资源返回给nginx,nginx再返回给用户,而对于静态资源,比如图片,js,css,如果需要经常访问,那每次都需要tomcat返回,这样比较影响性能。考虑将静态资源放到nginx中,这样静态资源就不用经过那么多链路了。

即当用户请求时,动态请求分配到Tomcat业务服务器,静态资源请求放在Nginx服务器中。

也就是让nginx可以找到这些静态文件。

  • 如果请求的资源地址是location/css/*,就会被匹配到nginx的html目录下的css文件夹中(我们把css静态资源放在这个位置)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 80;
server_name localhost;

location / {
# /的优先级比较低,如果下面的location没匹配到,就会走http://xxx这个地址的机器
proxy_pass http://xxx;
}

location /css {
# root指的是html,location/css指的是root下的css,所以地址就是html/css
# root目录是:/usr/local/nginx
root html;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

使用正则可以同时配置多个静态资源目录

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

URL重写,使用正则,就是动态匹配url再重定向。

假设当前主机的IP地址为192.168.4.101,如果现在访问http://192.168.4.101/2.html则会被重定向到http://192.168.4.101//index.jsp?pageNum=$1目的是隐藏uri中的重要信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
server_name localhost;#localhost表示请求的域名是这个或请求的IP地址的域名是这个

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

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
rewrite    <regex>   <replacement>  [flag];
关键字 正则 替代内容 flagt标记

正则:per1森容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement

flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的1ocation URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则

redirect #返回302临重定向,游览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,测览器地址栏会显示跳转后的URL地址

7、nginx充当网关服务器

当业务中要求tomcat服务器不能被外网访问,用户想要访问其中的资源必须先通过nginx服务器,然后再由nginx服务器将请求转发给tomcat,这时候nginx的作用是反向代理,如果有多个tomcat,nginx还有负载均衡的作用。然后因为tomcat外网不能访问,但是需要被nginx访问,所以需要配置防火墙规则。

启动应用服务器的防火墙,设置其只能接受这台Nginx服务器的请求。

1
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.174.135" port protocol="tcp" port="8080" accept" #这里的192.168.174.135是网关 服务器地址

这是移除这个规则

1
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.174.135" port port="8080" protocol="tcp" accept"

移除和添加规则都要重启才能生效

1
firewall-cmd --reload

查看所有规则

1
firewall-cmd --list-all #所有开启的规则

8、防盗链

参考:https://heyingjiee.github.io/otherLanguage/Nginx%E5%AD%A6%E4%B9%A0.html#%E9%98%B2%E7%9B%97%E9%93%BE

9、高可用场景

10、配置证书


中间件-nginx
https://vickkkyz.fun/2022/09/24/中间件/nginx/
作者
Vickkkyz
发布于
2022年9月24日
许可协议