本篇文章我们来学习一下nginx,那么首先摆在我们面前的问题就是:何为nginx?nginx能做什么?
nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,特点是占有内存少,并发能力强。nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,如:perl、php等,但不支持java,java程序只能通过与tomcat配合完成。nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验。
为了能够更深刻地认识到nginx,这里介绍其几个十分重要的概念:
在了解反向代理之前,我们可以来看看何为正向代理。
如果把局域网外的Internet想象成一个巨大的资源库,局域网中的用户要想访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
举个很简单的例子,你现在想要访问google,然后你直接在浏览器的网址里输入www.google.com能访问到吗?我们知道,因为一些原因,在国内是访问不到google的,所以这个时候你通过代理服务器间接地访问到了google,这个过程称为正向代理。
那么何为反向代理呢?
在反向代理中,其实客户端对代理是无感的,因为客户端不需要任何配置就能可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的ip地址。
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
这种架构模式对于早期的系统相对单一、并发请求相对较少的情况下是比较适合的,成本也低,但是随着数据的逐渐增大,目前服务器已经无法应对高并发的情况,该怎么办呢?
最简单的办法当然就是升级服务器的配置,但这种方式成本太高,倘若服务器的配置已经到达顶峰,却仍然无法抗住巨大的并发请求,这个时候该如何解决呢?
回顾刚才的反向代理,客户端发送的请求会通过反向代理服务器,而反向代理服务器会去选择目标服务器,假设现在同时有30条请求,我们有三台服务器,那么负载均衡要做的事情就是将这30条请求平均分配到三台服务器中,使得每台服务器处理的请求趋近于10条。
为了加快网站的解析速度,通常把动态页面和静态页面由不同的服务器来解析,以此加快解析速度,降低原来单个服务器的压力。
概念说完了,该讲讲如何安装nginx了,这里以centos6环境为例。
先来到官网下载好nginx:http://nginx.org/
随便下载一个版本就好了,这里以nginx-1.19.0版本为例。
下载完成后把它放到一边,我们先下载nginx所需的依赖。
执行如下指令下载pcre:
wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
下载完成后对其进行解压,执行指令:
tar -xvf pcre-8.37.tar.gz
解压完成后需要进入到该目录中:
cd pcre-8.37.tar.gz
接着执行指令对其进行编译和检查:
./configure
有些同学在进行编译检查的时候可能会遇到这个问题:
产生这个问题是因为缺少gcc编译器,安装一下就好了,执行如下指令安装:
yum install gcc-c++
最后执行安装指令:
make && make install
到这里pcre就安装好了,接着安装一下zlib,执行指令:
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
所有依赖安装完成,就可以开始安装nginx了,还记得我们前面下载好的nginx压缩包吗,通过连接软件将压缩包放到linux环境中,或者也可以通过指令直接下载:
wget https://nginx.org/download/nginx-1.19.1 tar.gz
下载好后解压一下:
tar -xvf nginx-1.19.1 tar.gz
然后进入解压目录,执行指令:
./configure
最后执行安装指令:
make && make install
在正式启动nginx之前,我们还需要设置一下防火墙,执行指令:
vi /etc/sysconfig/iptables
将文件修改为如下内容:
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT
-A INPUT -j REJECT –reject-with icmp-host-prohibited
-A FORWARD -j REJECT –reject-with icmp-host-prohibited
COMMIT
nginx的端口为80,所以我们让80端口开放即可,然后重启防火墙:
service iptables restart
此时我们来到nginx目录下的sbin:
cd /usr/local/nginx/sbin/
执行指令:
./nginx
nginx就启动了,如果遇到这个问题:
Nginx: error while loading shared libraries: libpcre.so.
只需执行这条指令即可:
ln -s /usr/local/lib/libpcre.so.1 /lib64/
此时打开浏览器,在地址栏上输入192.168.124.7,访问成功。
nginx常用命令
使用nginx命令的前提是我们当前处在nginx目录中,即:/usr/local/nginx/sbin,下面介绍一些十分常用的nginx命令:
./nginx -v
./nginx
./nginx -s stop
./nginx -s reload
下面来具体实现一下nginx的配置,分为:
在实现之前,先提出一个要求:打开浏览器,在地址栏输入www.test.com,跳转至tomcat主页面。
先来分析一下运行流程,我们在浏览器地址栏输入www.test.com之后,需要将本次请求交给nginx服务器,再由nginx服务器转向tomcat服务器,因为涉及到一个域名,所以还需要在windows系统下的hosts文件中进行配置。
首先对hosts文件进行配置,来到该目录下C:\Windows\System32\drivers\etc找到hosts文件,并做如下修改:
前面是ip地址,后面是域名,让二者做一个映射关系。
接下来就是在nginx中进行请求转发的配置,来到/usr/local/nginx/conf目录下,对nginx.conf文件进行修改:
修改完成后使用./nginx指令重新启动一下nginx,千万记得要在nginx的sbin目录下执行该指令。
最后我们测试一下,在浏览器地址栏输入www.test.com,访问成功。
下面来具体实现一下负载均衡的效果,先提出一个要求,在浏览器地址栏中输入http://192.168.124.7/test.html,将该请求分发至8080和8081端口中。
并对tomcat8081目录下的tomcat进行配置,将其配置成8081端口,最后分别在两个tomcat的webapps目录下存放一个html文件:
然后分别启动两个tomcat,这样准备工作就完成了,下面就要对nginx进行负载均衡的配置:
到这里就完成了负载均衡的操作,但效果如何体现呢?看下面的演示:
因为nginx服务器监听的是80端口,所以我们可以省略端口号直接通过ip访问,会发现当不停地刷新页面进行请求的时候,页面有时会显示8080,有时会显示8081,这说明负载均衡已经成功实现了,nginx服务器每次都将请求平均分配给两个服务器进行处理才会出现这样的现象。
动静分离说得通俗一点就是将所有静态请求交给nginx处理,将所有动态请求通过nginx再交给tomcat处理。
先做准备工作,在linux根目录下创建data文件夹,并在该文件夹下创建html和image文件夹,其中分别有一个test.html文件和test.png文件。