废话不多说,直接正文。(重点介绍怎么通过nginx实现负载均衡和反向代理)
这个系统的简单架构如下:
动手前,您需要先准备一下环境:
域名
为了使网站能够通过域名进行访问,需要将域名解析指向部署的服务器IP地址。在域名管理控制台中添加A记录或修改现有的A记录,将域名指向服务器的公网IP地址。
服务器
需要选择多台适用的服务器来部署网站。根据网站的需求和预计的访问量,选择具备足够带宽、内存和处理器的服务器,并确保这些服务器能够相互通信。
ssl 证书
获取途径有很多。有免费的,也有付费的。建议直接在阿里云申请的免费证书,审核时间很快,1小时内通过。
tomcat
这个就不多说了,就是一个web容器,当然你也可以用其他的容器来替代
nginx
Nginx是一个高性能的Web服务器和反向代理服务器,可以通过负载均衡将请求分发给多个服务器,以提高网站的并发能力
以上东西准备好后,就可以开始部署网站了。
安装Tomcat
首先我们要安装Tomcat来作为网站的应用服务器,可以从官网下载对应版本的Tomcat,并解压到服务器目录中。在Tomcat目录下bin文件夹内可以找到startup.bat(Windows)或startup.sh(Linux)文件,运行该文件即可启动Tomcat。(具体怎么安装和配置请自行搜索。😄)
在浏览器中输入http://localhost:8080/ 即可访问Tomcat的欢迎页面。
部署Web应用
接下来我们需要将网站的Web应用部署到Tomcat的webapps目录下。
可以将war包或者其他可运行的项目(比如静态html网页)直接上传到webapps目录下,或者使用Tomcat的管理控制台进行部署。
安装Nginx
不同的系统,安装方式也不一样,具体怎么安装请自行搜索。
安装好了,验证一下是否安装成功。
以linux为例:
进入到nginx安装目录,进入sbin 目录,执行命令
bash
./nginx -v
出现一下内容,则为安装成功
启动 nginx
启动ngxin前先验证下nginx配置是否正确,输入以下命令
bash
./nginx -t
test is successful 说明配置没问题
如果没问题 则执行启动命令
bash
./nginx -s -reload
这个命令是在nginx不停止的情况下,重新加载最新的配置。
停止nginx
arduino
./nginx -s stop
通过nginx实现负载均衡和反向代理
负载均衡
业务量大了,一台服务已经满足不了系统要求了,这个时候就出现了服务器集群。
在服务器集群中,Nginx 可以将接收到的客户端请求可以通过设置权重分配到这个集群中所有的服务器上。这个就叫做负载均衡。
负载均衡的示意图如下:
负载均衡的作用:
1.提高并发处理能力:
Nginx作为反向代理服务器,可以将客户端请求分发给多个后端服务器。
通过负载均衡,Nginx可以平衡和分散请求流量,提高网站的并发处理能力。当有大量用户同时访问网站时,Nginx可以将请求分发给不同的服务器,避免单一服务器过载,提高整体性能和响应速度。
2.实现高可用性:
通过将请求转发到多个后端服务器,Nginx负载均衡可以实现高可用性。
当某台服务器出现故障或不可用时,Nginx可以自动将请求转发到其他可用的服务器上,从而保证网站的连续性和可靠性。这种冗余的部署方式可以有效地减少单点故障的影响,提高系统的稳定性和可靠性。
负载均衡配置:
以下是一个简单的示例
ini
http {
upstream backend {
server backend1.example.com; # 这里也可以是服务器IP加端口,比如 127.0.0.1:8080 127.0.0.1:8081
server backend2.example.com;
server backend3.example.com;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
upstream块定义了后端服务器列表,其中包含了三个后端服务器(backend1.example.com, backend2.example.com, backend3.example.com)。这些服务器可以是真实的服务器IP地址或域名。
然后,在server块中,我们监听80端口并指定服务器名为example.com。location /指令用于匹配所有请求路径。proxy_pass指令将请求转发给backend,即上面定义的后端服务器列表。proxy_set_header指令用于设置代理请求头,以便正确传递客户端的主机和真实IP信息。
通过以上配置,当用户访问example.com 域名时,Nginx会将请求分发给后端服务器列表中的一台服务器,实现负载均衡。
在上文我们提到过,可以通过配置权限来实现不同服务器之间的负载均衡。具体来说,可以在upstream块中使用weight指令来为每个服务器设置权重值,如下所示:
ini
http {
upstream backend {
server backend1.example.com weight=2; # 权重为2
server backend2.example.com weight=3; # 权重为3
server backend3.example.com weight=1; # 权重为1
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
当用户发起请求时,Nginx会根据所有服务器的权重值和当前负载状态,选择合适的服务器进行转发。例如,如果所有服务器的权重值之和为6,则backend2.example.com将获得50%的请求,而其他两个服务器将各获得25%的请求。
当然,在我们配置多个服务器的情况下,有时候我们需要保持session会话来确保同一个用户多次请求都发送到同一台服务器上,这个时候我们就需要用到nginx中的ip_hash指令.
以下为代码示例:
ini
http {
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
在upstream块中使用了ip_hash指令。这将使得Nginx根据客户端的IP地址计算哈希值,并使用该哈希值将同一客户端的请求固定转发到同一个后端服务器。
这样一来,当同一客户端连续发送多个请求时,Nginx会根据其IP地址将这些请求转发到相同的后端服务器,从而保持会话的连续性。
nginx反向代理
nginx反向代理是指使用nginx作为代理服务器,来接受internet上的连接请求,然后将请求转发到内部网络的上游服务器。
nginx反向代理工作原理:
-
用户向nginx发出访问请求
-
nginx根据配置的规则判断请求应该发送到哪台上游服务器
-
nginx将请求转发到上游服务器,上游服务器处理完后返回响应内容到nginx
-
nginx将上游服务器的响应返回给最初发出请求的用户通过这个过程,反向代理服务器掩盖了内部服务器的信息,外界只能看到反向代理服务器,从而起到了隐藏和保护上游服务器的作用。
示意图如下:
添加图片注释,不超过 140 字(可选)
nginx 就是充当图中的 proxy。左边的3个 client 在请求时向 nginx 获取内容,用户是感受不到3台 server 存在的。
配置ssl访问
获取到证书后下载到本地,然后上传到服务器。
添加图片注释,不超过 140 字(可选)
准备好证书后,找到nginx的安装目录
添加图片注释,不超过 140 字(可选)
进入 config/nginx.conf
编辑conf文件命令:
vim nginx.conf
在修改配置文件之前,最好做一个备份,防止修改错误,也能及时回退错误
在配置文件中找到 HTTPS server
这里除了HTTPS server这行之外,其他的 # 删除,启动https模块
markdown
# HTTPS server
server {
listen 443 ssl;
server_name example.com; # 这里不需要加https
ssl on;
ssl_certificate /usr/local/ssl/app/app.pem; #这里是ssl key文件存放的绝对路径,根据自己的文件名称和路径来写
ssl_certificate_key /usr/local/ssl/app/app.key; #这里是ssl key文件存放的绝对路径,根据自己的文件名称和路径来写
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://backend;
}
}
强制https访问:
perl
server {
listen 80;
server_name example.com;
# 强制重定向到HTTPS
return 301 https://$host$request_uri;
}
所有的配置都完成后,执行以下命令启动 nginx
进入nginx安装目录的sbin文件夹下
执行:
bash
./nginx -t # 这个命令是为了测试配置文件是否正确 如果没问题 执行如下命令,启动nginx
./nginx -s reload
希望本文能对您有所帮助。如有任何问题或建议,请随时私信我。
如果对你有帮助,欢迎点赞~支持~😄