文章目录
Linux云计算架构-使用nginx进行反向代理、负载均衡、动静分离
nginx下载地址:http://nginx.org/en/download.html
tomcat下载地址:https://tomcat.apache.org/download-90.cgi
实验版本:nginx1.19.2
tomcat9.0.37
1. 下载并启动tomcat
[root@master ~]# cd /usr/local/
[root@master local]# rz
[root@master local]# ll apache-tomcat-9.0.37.tar.gz
-rw-r--r-- 1 root root 11211292 8月 27 20:35 apache-tomcat-9.0.37.tar.gz
[root@master local]# tar xzf apache-tomcat-9.0.37.tar.gz
# 对解压包重命名,是因为在生产环境中可能需要多个tomcat进行负载均衡。
[root@master local]# mv apache-tomcat-9.0.37 tomcat0
[root@master local]# cd tomcat0/
[root@master tomcat0]# ll
总用量 124
drwxr-x--- 2 root root 4096 8月 27 20:40 bin
-rw-r----- 1 root root 18982 7月 1 04:14 BUILDING.txt
drwx------ 2 root root 238 7月 1 04:14 conf
-rw-r----- 1 root root 5409 7月 1 04:14 CONTRIBUTING.md
drwxr-x--- 2 root root 4096 8月 27 20:40 lib
-rw-r----- 1 root root 57092 7月 1 04:14 LICENSE
drwxr-x--- 2 root root 6 7月 1 04:09 logs
-rw-r----- 1 root root 2333 7月 1 04:14 NOTICE
-rw-r----- 1 root root 3255 7月 1 04:14 README.md
-rw-r----- 1 root root 6898 7月 1 04:14 RELEASE-NOTES
-rw-r----- 1 root root 16262 7月 1 04:14 RUNNING.txt
drwxr-x--- 2 root root 30 8月 27 20:40 temp
drwxr-x--- 7 root root 81 7月 1 04:12 webapps
drwxr-x--- 2 root root 6 7月 1 04:09 work
# 启动tomcat,默认端口号是8080
[root@master tomcat0]# ./bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat0
Using CATALINA_HOME: /usr/local/tomcat0
Using CATALINA_TMPDIR: /usr/local/tomcat0/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat0/bin/bootstrap.jar:/usr/local/tomcat0/bin/tomcat-juli.jar
Tomcat started.
[root@master tomcat0]# ps aux | grep 8080
root 10840 0.0 0.0 112724 988 pts/0 S+ 20:46 0:00 grep --color=auto 8080
[root@master tomcat0]# firewall-cmd --permanent --zone=public --add-port=8080/tcp
success
[root@master tomcat0]# firewall-cmd --reload
success
2. nginx反向代理
正向代理:用户和服务器之间的连接桥梁【用户做的桥梁】
反向代理:用户和服务器之间的连接桥梁【服务器做的桥梁】
举例:
用户A想访问微博,不能直接访问微博,所以用户A找了用户B,通过用户B去访问微博。这叫正向代理
用户A想访问微博,不能直接访问微博,只能直接访问百度,微博把其上的资源放到了百度上,当用户访问微博的资源时,百度就给予回应。这叫反向代理。
而Nginx反向代理,即是指用户访问nginx,而nginx把资源放到tomcat上,用户请求nginx的资源时,tomcat就会回应用户,并返回相应资源。
nginx是一个web服务器,速度快,但是不能作为Servlet 容器独立运行。所以通常的工作方式是Nginx配合Tomcat来协同工作。 这就是为什么要单独提供Tomcat,以方便配合Nginx进行工作。
直接访问192.168.8.184
,即是访问nginx服务的80端口号。
访问192.168.8.184:8080
,即是访问tomcat服务的8080端口号。
反向代理:访问192.168.8.184
上的资源,而nginx把请求资源存放到了tomcat上,故会访问到192.168.8.184:8080
上面的资源。
# 配置代码
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
45 location / {
46 root html;
47 proxy_pass http://192.168.8.184:8080/; # proxy_pass反向代理
48 index index.html index.htm;
49 }
[root@master ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@master ~]# nginx -s reload
# 再次访问192.168.8.184,可以看到如下内容,而不再是haha
3. nginx负载均衡
nginx的upstream负载有5种方式:
①轮询(默认)
②按weight分配
③ip_hash,同一客户端访问同一后端服务器。
④fair,按后端服务器的响应时间分配请求,响应时间短的先分配。
⑤url_hash,相同url请求分配到同一后端服务器。常用于后端服务器为缓存服务器的场景。
为了达到负载均衡的效果,这里使用2个tomcat来提供服务。
# 查看下8081端口号是否被占用,发现没有,那么tomcat可以使用8081端口号。
[root@master webapps]# netstat -antup | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 10736/java
[root@master webapps]# netstat -antup | grep 8081
# 查看下8086端口号是否被占用,发现没有,那么tomcat可以使用8086端口号作为关闭服务的端口。
[root@master webapps]# netstat -antup | grep 8086
# 部署tomcat1
[root@master ~]# cd /usr/local/
[root@master local]# ll apache-tomcat-9.0.37.tar.gz
-rw-r--r-- 1 root root 11211292 8月 27 20:35 apache-tomcat-9.0.37.tar.gz
[root@master local]# tar xzf apache-tomcat-9.0.37.tar.gz
[root@master local]# mv apache-tomcat-9.0.37 tomcat1
[root@master local]# vim ./tomcat1/conf/server.xml
22 <Server port="8006" shutdown="SHUTDOWN"> # 停止tomcat服务端口号,默认8005
69 <Connector port="8081" protocol="HTTP/1.1" # 访问http端口号,默认8080
70 connectionTimeout="20000"
71 redirectPort="8443" />
[root@master ~]# /usr/local/tomcat1/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat1
Using CATALINA_HOME: /usr/local/tomcat1
Using CATALINA_TMPDIR: /usr/local/tomcat1/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat1/bin/bootstrap.jar:/usr/local/tomcat1/bin/tomcat-juli.jar
Tomcat started.
[root@master local]# firewall-cmd --permanent --zone=public --add-port=8081/tcp
success
[root@master local]# firewall-cmd --reload
success
# 可以看到8080和8081都已经开启了。
[root@master local]# netstat -antup | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 10736/java
[root@master ~]# netstat -antup | grep 8081
tcp6 0 0 :::8081 :::* LISTEN 12533/java
访问http://192.168.8.184:8081/,结果如下:
# 部署nginx负载均衡
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
35 upstream tomcat_local{
# upstream负载均衡器
36 server 192.168.8.184:8080 weight=1;
37 server 192.168.8.184:8081 weight=2;
38 }
39
40 server {
41 listen 80;
42 server_name localhost;
43
44 #charset koi8-r;
45
46 #access_log logs/host.access.log main;
47
48 location / {
49 root html;
50 proxy_pass http://tomcat_local;
51 index index.html index.htm index.jsp;
52 proxy_set_header Host $host:$server_port;
53 proxy_set_header X-Real-IP $remote_addr;
54 proxy_set_header REMOTE-HOST $remote_addr;
55 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
56 }
[root@master ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@master ~]# nginx -s reload
# 我这里换了个局域网,IP地址换了,不影响测试。
通过访问一次页面产生的访问日志可以看出,tomcat1的日志多余tomcat0,就是说nginx把比较多请求交给了tomcat1处理,而tomcat0比较少,比例即为weight的比值。
4. nginx动静分离
静态资源: 当用户多次访问这个资源,资源的源代码基本不会发生改变的资源。【图片、css、js】
动态资源:当用户多次访问这个资源,资源的源代码可能会发生改变。【jsp】
动静分离:静态资源交由nginx直接处理,而nginx不好处理的动态资源反代到tomcat处理,从而达到动静分离的效果。
①修改nginx服务的主配置文件,要重启nginx服务。将静态资源交由nginx处理,tomcat只处理动态资源。
# 动静分离配置
location / {
# root html;
proxy_pass http://192.168.137.7:8080; # 把请求的所有资源都反代到tomcat上
# index index.html index.htm index.jsp;
# proxy_set_header Host $host:$server_port;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header REMOTE-HOST $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ .*\.(css|js|png) {
# 如果是该类型的资源,直接在nginx上处理
root /usr/local/tomcat0/webapps/ROOT/; # 静态资源nginx直接处理,其余的反代到tomcat上处理。要声明nginx直接处理的静态资源存放目录,并授予755权限。
}
# 动静分离思想:
①由于请求是先经过nginx的,静态资源在经过nginx的时候就会被直接处理,不会反向代理到tomcat上,而动态资源nginx不处理,会被反向代理到tomcat上进行处理。【如上述配置,这种方法适合做负载均衡】
②由于请求是先经过nginx的,可以判断该资源是否是动态资源,是的话反向代理到tomcat上处理。【如下配置,这种方法不适合做负载均衡】
location / {
root /usr/local/tomcat0/webapps/ROOT/; # 请求资源目录
index index.html index.htm index.jsp; # 允许请求的资源类型
}
location ~ .*\.(jsp|css)$ {
# 筛选出jsp和css类型
proxy_pass http://192.168.137.7:8080; # 把这些类型反代到tomcat上处理
# proxy_set_header Host $host:$server_port;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header REMOTE-HOST $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
②输入网址http://192.168.137.7/
,并查看tomcat的访问情况,可以看到tomcat提供的是动态资源。
nginx服务在处理静态文件的吞吐量上优于tomcat,故nginx直接处理静态资源,而nginx不好处理的动态资源交由tomcat直接处理,从而达到动静分离的效果。
5. nginx动静分离和负载均衡、反向代理结合
- 若使用了Nginx动静分离,则请求中所有的静态资源都由nginx处理,tomcat则不再处理静态资源。
- 若使用了Nginx负载均衡,则请求的所有资源按权重进行分配给相应的tomcat处理。
- 若同时使用了Nginx动静分离和负载均衡,则静态资源由nginx处理,动态资源按权重分配给tomcat处理。
upstream tomcat_local {
server 192.168.8.186:8080 weight=1;
server 192.168.8.186:8081 weight=2;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# 资源都反向代理到tomcat上分发处理
root html;
proxy_pass http://tomcat_local;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ .*\.(css|js|png) {
# 静态资源单独获取
root /usr/local/tomcat0/webapps/ROOT/;
}
# 在生产环境中,要做到真正的动静分离,要把动态资源和静态资源分开存放。静态资源一般存放在nginx的网站数据目录下。