Nginx是一款非常优秀的HTTP服务器软件,支持高达50,000个并发连接数的响应,拥有强大的静态资源处理能力。其运行稳定,且对内存、CPU等系统资源的消耗非常低。目前,很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,以提升整个站点的负载并发能力。
正向代理代理的是客户端去访问服务器,目的是加快访问速度。当客户端访问一台服务器有障碍时,可以通过一台可以访问到该服务器的代理服务器来实现访问。客户端发送请求给代理服务器,代理服务器再去访问目标服务器,并将返回数据传递给客户端。正向代理可以屏蔽或隐藏客户端的信息。
反向代理代理的是服务端,常用于负载均衡。反向代理服务器隐藏了服务器的信息,常用于多台服务器的分布式部署。客户端发来的请求先由反向代理服务器接收,然后按一定规则分发到具体的服务器,客户端无法知道具体是哪台服务器响应了请求。
轮询算法是Nginx的默认分流算法,按顺序将请求依次分配给每一台后端服务器,直到最后一台服务器,然后重新从第一台服务器开始。这种方法简单且均匀地分配流量。
配置示例:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
最少连接数算法将请求分配给当前活动连接数最少的服务器,适用于请求处理时间不均匀的情况,可以有效平衡服务器的负载。
配置示例:
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
IP 哈希算法通过计算客户端 IP 地址的哈希值,将请求始终分配给同一台服务器,适用于需要将特定客户端的请求固定在同一台服务器上的场景。
配置示例:
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
加权轮询算法允许为每台服务器设置权重,权重越大的服务器将会获得更多的请求,适用于服务器性能不均衡的情况。
配置示例:
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com weight=1;
server backend3.example.com weight=2;
}
最少时间算法基于请求的响应时间,将请求分配给响应时间最短的服务器。这种算法适用于需要最大化响应速度的场景。
配置示例:
upstream backend {
least_time header;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
一致性哈希算法保证当集群中某台服务器故障时,只有部分请求会重新分配到其他服务器,而不是全部重新分配,这在缓存等场景中非常有用。
配置示例:
upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
首先停止防火墙并关闭SELinux:
systemctl stop firewalld
setenforce 0
然后安装所需依赖,并创建Nginx用户:
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
接下来下载并解压Nginx源代码,进入目录进行配置:
cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/
cd nginx-1.20.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream --with-http_ssl_module
make && make install
创建Nginx服务:
vim /lib/systemd/system/nginx.service
内容如下:
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
启动Nginx服务并设置开机启动:
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
首先停止防火墙并关闭SELinux:
systemctl stop firewalld
setenforce 0
安装JDK:
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
配置环境变量:
vim /etc/profile
添加以下内容:
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
应用环境变量:
source /etc/profile
解压Tomcat并启动:
tar zxvf apache-tomcat-8.5.16.tar.gz
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
在Tomcat1服务器上创建动态页面:
mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
添加以下内容:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
JSP test1 page
<% out.println("动态页面 1,http://www.test1.com");%>
编辑server.xml文件:
vim /usr/local/tomcat/conf/server.xml
配置内容如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
Context>
Host>
重启Tomcat:
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
在Tomcat2服务器上创建动态页面:
mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test
vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
添加以下内容:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
JSP test2 page
<% out.println("动态页面 2,http://www.test2.com");
%>
编辑server.xml文件:
vim /usr/local/tomcat/tomcat1/conf/server.xml
配置内容如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
Host>
重启Tomcat:
/usr/local/tomcat/tomcat1/bin/shutdown.sh
/usr/local/tomcat/tomcat1/bin/startup.sh
创建静态页面和静态图片目录:
echo '这是静态页面
' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
cp /root/game.jpg /usr/local/nginx/html/img
编辑Nginx配置文件:
vim /usr/local/nginx/conf/nginx.conf
配置内容如下:
http {
upstream tomcat_server {
server 192.168.10.23:8080 weight=1;
server 192.168.10.22:8080 weight=1;
server 192.168.10.22:8081 weight=1;
}
server {
listen 80;
server_name www.kgc.com;
charset utf-8;
location ~ .*\.jsp$ {
proxy_pass http://tomcat_server;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/img;
expires 10d;
}
location / {
root html;
index index.html index.htm;
}
}
}
在浏览器中访问:
不断刷新浏览器访问:http://192.168.10.19/index.jsp,以测试负载均衡效果。