nginx的介绍
上一讲,我们已经简单介绍和使用过nginx了,咱是将它作为Http服务器来用的,这一讲,我们将会详细介绍它。
为什么需要nginx?
目前我们访问各个系统是存在问题的,访问后台管理系统需要在浏览器地址栏中输入http://localhost:8081/
,如下图所示。
访问首页系统需要在浏览器地址栏中输入http://localhost:8082/
,如下图所示。
访问商品搜索结果页面时,可以看到浏览器地址栏中有http://localhost:8085/
字样。
而且,在搜索结果页面(即search.jsp)中,写死了其他的系统的全路径。
问题来了,localhost只能访问本地,不能访问其他的服务器,但是将来我们的系统应当是要部署在测试环境和生产环境中的,这个时候该怎么办呢?你这时可能想到可以使用ip地址啊?可以吗?这是不可以的,因为开发环境的ip地址和测试环境的ip地址是不一样的,每次环境变化的时候,我们都需要修改访问的ip地址。而且,页面加载资源或者请求其他系统的URL时,如果使用了全路径,那么一旦环境发生改变,资源将无法加载,请求也无法访问。最关键的一点是,ip地址没有意义,不容易记忆,用户不会通过ip地址进行访问,一般是通过域名访问。
如果使用域名来访问,就比方说我们使用www.baidu.com
这个域名来访问百度,那么你知道使用域名访问百度的流程吗?
就拿访问本地开发环境下的商品详情页面这件事来说,如果真是要通过域名来访问的话,那么浏览器地址栏中就得输入http://item.taotao.com:8086/item/{商品id}.html
这样的url,如下图所示。
要想做到这一点,我们只须修改一下本机的hosts文件即可。
但是这样访问又会存在一个问题,那就是访问时域名后还需要加上端口。一般我们用户去访问的时候,有这个端口吗?没有,如果没有端口的话,那么他用的是哪个端口呢?其实就是80端口。
我们这么多系统,而开发环境中80端口就只有一个,每个系统又都要用这个80端口,这个时候该怎么办呢?反正咱们以前学的技术是没办法解决的。这个时候,就可以使用nginx进行配置了,很容易就能达到只使用域名(不使用端口)访问的目的。只要nginx配置了一个反向代理,大家就都可以使用80端口了。
什么是nginx?
nginx是一款高性能的Http服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支撑5万并发链接,并且cpu、内存等资源消耗都非常低,运行也非常稳定。
nginx的应用场景
nginx的应用场景主要有三处。
Http服务器
nginx是一个Http服务器,可以独立提供http服务,所以可以做网页静态服务器。
虚拟主机
虚拟主机其实就是虚拟出多个虚拟的主机。
nginx可以实现在一台服务器中虚拟出多个网站,例如个人网站使用的虚拟主机。这里我举一个例子来进行说明,前几年流行自己创建个人网站来娱乐,如果要是每个人都买一台服务器来维护网站的话,费用是比较高的,很划不来,为了降低费用便催生出了虚拟主机,就是在一台服务器上虚拟出多个"主机"出来,大家可以共用这一台服务器,费用当然就很低了,但是有个问题,我们知道nginx默认的端口是80,使用nginx访问静态网页的时候,是不用输入80端口就可以访问的,如果nginx的端口修改为别的端口号(如81),那么访问的时候便需要输入端口号81才能访问。多个人共用一台服务器,访问地址不能以端口号作为区分网站的标志,因为谁也不想在输入访问地址的时候还带个端口号,大家掏的钱都是一样的,那么怎么让大家都使用80端口而且区分出不同的个人网站呢?这就需要用到域名了,不同的用户输入自己的域名就可以访问自己的网站,比如aaaa.com、bbbb.com等域名,这两个域名都对应着同一台服务器并且共用80端口。
反向代理,负载均衡
当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器搭建集群,这时便可以使用nginx做反向代理,这样多台服务器就可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。关于这点我们后面会再详细介绍。
nginx的安装与使用
写在前面
新建一台虚拟机
首先,新建一台虚拟机,而且最好设置为固定IP地址,别跟我说你不知道怎么做,要是你真不晓得,那么可以参考我下面的两篇文章。
下载nginx的源码包
大家可以从nginx的官方网站(即http://nginx.org/)下载nginx的源码包,我下载的nginx源码包是nginx-1.18.0.tar.gz
。
要求的安装环境
由于我们是在Linux系统上安装nginx,而我们拿到的又是nginx的源码包,所以还需要重新编译,这与redis是一个道理。下面我们使用yum install gcc-c++
命令来安装gcc的环境,如下图所示。
接下来我们还需要安装第三方的开发包。
PCRE
PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括perl兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在Linux上安装pcre库,安装命令为yum install -y pcre pcre-devel
,如下图所示。
注意,pcre-devel是使用pcre开发的一个二次开发库,nginx也需要此库。
zlib
zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在Linux上安装zlib库,安装命令为yum install -y zlib zlib-devel
,如下图所示。
openssl
OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
nginx不仅支持http协议,还支持https协议(即在ssl协议上传输http),所以需要在Linux上安装openssl库,安装命令为yum install -y openssl openssl-devel
,如下图所示。
安装nginx
首先,将nginx的源码包上传到Linux系统上,关于怎样将文件上传到Linux系统上,我想我已经说的要吐了,所以这儿不再浪费口舌。与以往一样,我把nginx-1.18.0.tar.gz
上传到了用户主目录(即root)下,如下图所示。
然后,我们使用tar zxf nginx-1.18.0.tar.gz
命令将nginx的源码包解压缩到用户主目录下,解压完之后,可以看到解压后的nginx-1.18.0目录。
进入到解压好的nginx-1.18.0目录下,如下图所示。
接着,我们使用configure命令创建一个makeFile文件,具体命令如下:
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
这里,我还截了图,如下所示。
执行完configure命令后,可以看到nginx-1.18.0目录下多了一个Makefile文件,如下图所示。
注意:启动nginx之前,上边将临时文件目录指定为/var/temp/nginx,故需要在/var下创建temp及nginx目录。
紧接着,使用make命令编译nginx的源码,如下图所示。
再接着使用make install
命令进行安装,如下图所示。
安装完后,进入到/usr/local目录下,可以看到多了一个nginx的目录。
进入到nginx目录中,可以看到有三个目录,如下图所示。其中conf中存放的都是配置文件,html目录下放置的是欢迎页等相关文件,sbin目录下只有nginx文件,它是用来启动nginx的。
启动nginx
安装完了nginx,我们就要来启动nginx了,如下图所示。
启动完之后,我们可以使用ps aux | grep nginx
命令来查看进程,如下图所示,看到master和worker这两个进程就代表nginx启动成功了。
如果要停止nginx,那么可以使用./nginx -s stop
命令,停止后,再查看进程发现nginx进程已经没有了。
注意,关闭nginx,推荐使用./nginx -s quit
命令。
如果修改了配置文件,想要使用新的配置文件,那么就需要使用热启动了,即动态地刷新配置文件,使用的命令是./nginx -s reload
。简单一点说,就是修改了nginx.conf文件之后,可以不用重启nginx,就能马上生效。
访问nginx
安装完nginx,并成功启动了nginx之后,在浏览器地址栏中输入nginx所在虚拟机的IP地址进行访问,如下图所示,发现可以正常访问nginx首页。这里之所以不用输入端口号是因为nginx默认使用的是80端口,80端口不用输入,如果使用别的端口号的话,访问nginx首页的时候就要输入端口号才能正常访问了。
注意:是否关闭了防火墙。