开发人员学Linux(5):CentOS7编译安装Nginx并搭建Tomcat负载均衡环境

1.前言
在上一篇讲述了JMeter的使用,在本篇就可以应用得上了。本篇将讲述如何编译安装Nginx并利用前面的介绍搭建一个负载均衡测试环境。
2.软件准备
Nginx-1.12.0,下载地址:https://nginx.org/download/nginx-1.12.0.tar.gz
Tomcat8(本系列已介绍过如何下载和安装)
JMeter(本系列已介绍过如何下载和使用)
注:VirtualBox宿主机IP为“192.168.60.16,虚拟机IP为:192.168.60.198,虚拟机通过桥接方式接入互联网。
3.安装Nginx-1.12.0
3.1安装前准备
3.1.1添加nginx用户及用户组
useradd nginx -s /sbin/nologin –M

上面的命令创建了名为nginx的用户和用户组,并且nginx用户无法登录系统(-s /sbin/nologin限制),可以通过id nginx命令查看:
[root@localhost ~]# id nginx
uid=1001(nginx) gid=1001(nginx) groups=1001(nginx)

3.1.2安装编译环境
在Linux下基本上都是用gcc或gcc-c++来编译的,所以这里通过如下命令来安装:
yum install gcc* -y

另外,编译nginx还需要安装一些依赖库,通过下面的命令来安装:
yum install pcre pcre-devel openssl openssl-devel zlib zlib-devel –y

3.1.3下载nginx-1.12.0
可以通过wget来下载,如果运行时提示找不到wget命令可通过yum install wget –y来安装,通过wget下载nginx-1.12.0的命令为:
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz

3.1.4编译并安装Nginx
我们假设运行/root目录运行wget来下载nginx-1.12.0.tar.gz,那么下载后的文件将存在/root目录下。
解压文件:
tar zxf ./nginx-1.12.0.tar.gz
cd ./nginx-1.12.0
./configure --user=nginx –group=nginx –prefix=/usr/local/nginx-1.12.0 –with-http_stub_status_module –with_http_ssl_module
make
make install

注:“./configure --user=nginx –group=nginx –prefix=/usr/local/nginx-1.12.0 –with-http_stub_status_module –with_http_ssl_module”表示Nginx将会以刚刚创建的nginx这个用户的权限来运行,安装目录在/usr/local/nginx-1.12.0,并附有http_stub_status和http_ssl模块。
如果不出错的话,将会在/usr/local/nginx-1.12.0安装Nginx。
3.1.5将nginx配置成服务
通过上面的操作,nginx可以通过命令行启动,但nginx服务未被加入到开机自启动列表,重启服务器后,未发现nginx服务,我们需要手动加入开机自启动。
通过vim /lib/systemd/system/nginx.service来添加nginx.service文件,并输入如下内容:
[Unit]
Description=nginx 1.12.0
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx-1.12.0/sbin/nginx
ExecReload=/usr/local/nginx-1.12.0/sbin/nginx -s reload
ExecStop=/usr/local/nginx-1.12.0/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

注意:如果不是安装在/usr/local/nginx-1.12.0/目录下,请根据实际安装路径修改ExecStart、ExecReload、ExecStop中的值。

更改nginx.service为可执行:
chmod 755 /lib/systemd/system/nginx.service

设置开机自启动
systemctl enable nginx.service


至此,已将nginx设置为随系统启动了,在这里使用systemctl start nginx来启动(如果不嫌麻烦也可以重启CentOS7)。
可以在浏览器中输入http://localhost来查看效果。为方便截图,我在宿主机中打开观看效果,虚拟机的IP我设置为:192.168.60.198,效果如下图所示:
开发人员学Linux(5):CentOS7编译安装Nginx并搭建Tomcat负载均衡环境_第1张图片
注:为防止我们编辑出错导致nginx无法启动,我们可以先用nginx –t来测试nginx.conf文件是否存在语法错误。在本篇中nginx程序安装在/usr/local/nginx-1.12.0目录,因此可执行如下命令:
/usr/local/nginx-1.12.0/sbin/nginx –t
执行效果如下图:

如果得到的不是测试成功的信息,那么需要对nginx.conf进行检查,否则无法启动成功。
4.Nginx负载均衡设置
4.1配置Tomcat双实例
为简单起见,我们将本系列中已经配置好的Tomcat拷贝一份出来,并做一些修改以当做第二个Tomcat服务器。在之前的介绍中我们将Tomcat8安装在/usr/local/apache-tomcat-8.5.15,并且配置为随系统启动,下面我们将其拷贝一份到/usr/lib目录:
cp /usr/local/apache-tomcat-8.5.15 /usr/lib
然后修改新位置的tomcat配置:
vim /usr/lib/ apache-tomcat-8.5.15/conf/server.xml
要修改的地方有几处:
中的”8005”改为”8006”;
中的"Catalina"改为"Catalina81";
中的”8009”改为”8010”;
同时要更改/usr/lib/ apache-tomcat-8.5.15/bin/setenv.sh中的配置,要更改的有几处:
export CATALINA_HOME=/usr/local/apache-tomcat-8.5.15
export CATALINA_BASE=/usr/local/apache-tomcat-8.5.15
分别改为:
export CATALINA_HOME=/usr/lib/apache-tomcat-8.5.15
export CATALINA_BASE=/usr/lib/apache-tomcat-8.5.15

因为监听8080端口的Tomcat已经随系统启动,只需运行/usr/local/apache-tomcat-8.5.15/bin/startup.sh启动监听8081端口的Tomcat即可。

同时为便于识别,修改监听8081端口的Tomcat的root目录下的index.jsp页面,将首页中的“
If you're seeing this, you've successfully installed Tomcat. Congratulations!”改为“If you're seeing this, you've successfully installed Tomcat. Congratulations!Server port:8081!”。
在宿主机中打开http://192.168.60.198:8080的界面如下:
开发人员学Linux(5):CentOS7编译安装Nginx并搭建Tomcat负载均衡环境_第2张图片
在宿主机中打开http://192.168.60.198:8081的界面如下:
开发人员学Linux(5):CentOS7编译安装Nginx并搭建Tomcat负载均衡环境_第3张图片
4.2Nginx负载均衡设置
对nginx.conf的改动如下:
开发人员学Linux(5):CentOS7编译安装Nginx并搭建Tomcat负载均衡环境_第4张图片
注意:我们配置了一个名为”tomcat_test”的upstream,然后注释了原来的location的内容,同时新增了一个,里面有一个proxy_pass的设置为http://tomcat_test,它们是相对应的。
至此,负载均衡配置成功,我们在宿主机中打开虚拟机对应的IP,会发现前文所展示的两个tomcat首页的都会出现。
如下图所示:

开发人员学Linux(5):CentOS7编译安装Nginx并搭建Tomcat负载均衡环境_第5张图片


开发人员学Linux(5):CentOS7编译安装Nginx并搭建Tomcat负载均衡环境_第6张图片
从图中可以看出,URL地址均为http://192.168.60.198,但响应被Nginx分发到两个Tomcat实例上了,也就是在这种情况下“Nginx并不响应请求,而是请求的传输工”。
5.Nginx配置反向代理
5.1名词解释
所谓反向代理,是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
这里也提一下正向代理,正向代理,也就是传说中的代理,他的工作原理就像一个跳板。某个用户不能访问某些网站(例如被墙),但是墙外的一台服务器可以访问那些被墙的网站,并且这个用户可以访问这个未被墙的服务器,于是每次用户需要访问被墙网站上的资源时先告诉这台服务器,服务器从被墙网站上下载下来后交给用户,上述的服务器就是代理服务器,通常也被简称代理。这种代理方式就是正向代理。
这里再举两个通俗一点的例子。
在某个大公司里由于经常出差的人比较多,所以公司安排了一个人专门来处理这些事情,每次大家要出差之前就把行程信息高速这个人,这个人就负责预定火车票、飞机票及酒店等,成功后就把相关信息告诉要出差的人。在未被告知之前,要出差的人对外部的列车时刻表、航班信息表及酒店价格表均不知情,在将要出差的人脑子里那些都是透明的。这种方式即为正向代理。
在某个大公司里业务专业化程度很高,外部经常有客户需要咨询,为了便于更快捷地服务和响应客户公司成立了一个客户支持部门,一旦有客户需求过来,客户支持部门立即快速定位到需要响应的部门并将响应传递过去,响应完成后技术支持部门将响应反馈给客户,在客户那里甚至都不知道公司内部到底有哪些部门。这种方式即为反向代理。
简单地说,正向代理是内部不知道、不关心外部细节,反向代理是外部不知道、不关心内部细节。
5.2nginx配置
为了保险起见,我们将nginx.conf做一下备份。
首先进入到nginx的安装目录:
cd /usr/local/nginx-1.12.0
cp ./conf/nginx.conf ./conf/nginx_bak.conf

在真实的环境中,通常一个nginx会有多个站点的配置,如果所有站点的配置信息都放在nginx.conf中那将非常不便于管理和维护,为此我们可以将每个站点的配置信息放在单独的文件中,然后在nginx中include进来。在本次演示中我们将创建两个虚拟站点:www.goodapp.net及bbs.goodapp.net,这两个站点分别以上一节的两个Tomcat实例对应,及端口号8080和8081。
创建目录以存放站点的配置信息:
mkdir ./conf/vhosts

然后编辑nginx.conf为如下内容:
#user nginx;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

gzip on;

include vhosts/www.goodapp.net.conf;
include vhosts/bbs.goodapp.net.conf;
}


www.goodapp.net的配置文件www.goodapp.net.conf的内容:
upstream tomcat8081jsp {
server 127.0.0.1:8081;
}

server {
listen 80;
server_name www.goodapp.net;
access_log logs/www.access.log main;
error_log logs/www.error.log;
#root html;
#index index.html index.htm index.jsp index.php;

location / {
proxy_pass http://tomcat8081jsp;

#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}


bbs.goodapp.net的配置文件bbs.goodapp.net.conf的内容:
upstream tomcat8080jsp {
server 127.0.0.1:8080;
}

server {
listen 80;
server_name bbs.goodapp.net;
access_log logs/bbs.access.log main;
error_log logs/bbs.error.log;
#root html;
#index index.html index.htm index.jsp index.php;

location / {
proxy_pass http://tomcat8080jsp;

#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}


三个文件的存放位置:
nginx.conf:位于/usr/local/nginx-1.12.0/conf下
www.goodapp.net.conf:位于/usr/local/nginx-1.12.0/conf/vhosts下
bbs.goodapp.net.conf:位于/usr/local/nginx-1.12.0/conf/vhosts下
5.3Tomcat配置
检查一下两个Tomcat实例是否启动:
netstat -ntlp |grep 80
在本人机器上结果如下:
[root@localhost nginx-1.12.0]# netstat -ntlp |grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1037/nginx: master
tcp6 0 0 :::8080 :::* LISTEN 1553/java
tcp6 0 0 :::8081 :::* LISTEN 4071/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1553/java
tcp6 0 0 127.0.0.1:8006 :::* LISTEN 4071/java
tcp6 0 0 :::8009 :::* LISTEN 1553/java
tcp6 0 0 :::8010 :::* LISTEN 4071/java

可以看出nginx在监听80端口,而两个Tomcat实例分别监听8080和8081端口,其中监听8080端口的Tomcat被设置成随系统启动,如果发现没有进程监听此端口可以通过systemctl start tomcat.service来启动;监听8081端口的Tomcat实例是我们手动设置的,如果没有进程监听此端口可以通过/usr/lib/apache-tomcat-8.5.15/bin/startup.sh来启动。
5.4host配置
由于www.goodapp.net和bbs.goodapp.net两个网站相应的域名解析不正确(我知道的原因是因为goodapp.net这个域名是我注册的,因为国外VPS响应时间太长而国内需要备案,所以最近没怎么用),我们需要在host文件进行配置,在输入网站域名时它的解析优先级是高于任何DNS服务器的。
在CentOS7中这个hosts文件位于/etc目录下,在Windows中这个hosts文件位于C:\Windows\System32\drivers\etc目录下。
在hosts文件中添加如下内容并保存:
192.168.60.198 www.goodapp.net
192.168.60.198 bbs.goodapp.net

5.5结果检查
上述工作完成后,通过systemctl reload nginx来重新加载配置文件,在宿主机打开浏览器输入网址http://www.goodapp.net/,效果如下:
开发人员学Linux(5):CentOS7编译安装Nginx并搭建Tomcat负载均衡环境_第7张图片
在宿主机打开浏览器输入网址http://bbs.goodapp.net/,效果如下:
开发人员学Linux(5):CentOS7编译安装Nginx并搭建Tomcat负载均衡环境_第8张图片
至此,Nginx反向代理配置成功。

总结:Nginx是高负载Web网站中常用的软件之一,它不仅体积小,而且开源免费、功能强大。在本篇讲述了如何编译安装Nginx,以及如何设置负载均衡和反向代理。Nginx上手容易,但是要用好还是需要一番功夫的。

更多资讯,请关注本人微信订阅号:


你可能感兴趣的:(Linux&Open,Source,工具及系统,开发人员学Linux)