1、产生背景
老生常谈,互联网项目的架构演变。
当项目很小,访问量很小时,一台服务器足以支撑,模型如下:
当项目的访问量增多,大量的请求都打到同一台服务器上,导致服务器无法承担,容易崩溃。这种情况下,一般的思路是将对服务器进行横向扩展,即由原来的一台服务器变成多台服务器。此时会产生很多问题,比如Session不能跨服务器存储,那么用户请求具体应该打到哪台服务器上?
这个时候就可以在客户端和服务器之间加一层进行转发。
2、Nginx简介
Nginx 是⼀款⾼性能的 http 服务器/反向代理服务器及电⼦邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师伊⼽尔·⻄索夫(Igor Sysoev)所开发,官⽅测试 nginx 能够⽀⽀撑 5 万并发链接,并且cpu、内存等资源消耗却⾮常低,运⾏⾮常稳定。而tomcat只能支撑5、600左右的连接。
Nginx的主要作用:
(1)http 服务器。Nginx 是⼀个 http 服务可以独⽴提供 http 服务。可以做⽹⻚静态服务器。在软件开发中,有些请求是请求静态资源的,比如bootstrap、css、js等文件,这些请求可以不通过后台处理。根据一定规则把不变的资源和经常变的资源区分开,动静资源拆分以后,可以把静态资源放到一个服务器上,静态资源就专门访问这个服务器。根据静态资源的特点将其做缓存操作,提高资源响应的速度。
(2)反向代理。当⽹站的访问量达到⼀定程度后,单台服务器不能满⾜⽤户的请求时,需要⽤多台服务器集群可以使⽤ nginx 做反向代理。
插一句:正向代理是代理客户端的,比如客户端请求访问某个网页,可能会通过运营商的服务器访问,那么运营商的服务器就是正向代理。反向代理是代理服务器的,比如一个域名对应了多个服务器,客户端发送请求,通过一个中间服务器转发到具体的服务器上,这个中间服务器是反向代理服务器。
(3)负载均衡。多台服务器可以平均分担负载,不会出现某台服务器负载⾼宕机⽽某台服务器闲置的情况。
常见的负载均衡算法:
- 轮询算法:所有服务器轮着来,第一个请求来了给服务器1,第二个请求来了给服务器2,第三个请求来了给服务器3,所有服务器轮完了以后又从第一个服务器开始。
- 轮询权重算法:给每个服务器一个权重,根据权重决定每个服务器服务的次数
- iphash算法,根据每个ip地址设计一个hash值,每个hash值对应一个服务器,一个服务器可以对应多个hash值,这样每个ip地址每次请求的时候都会访问同一个服务器,可以解决session共用的问题,但是也有安全问题,如果这个服务器瘫了,那么这个ip地址就获取不到任何服务了。
3、安装
3.1、windows安装
(1)官网下载安装包,标注了windows的版本
(2)解压到不含中文的路径下
(3)cd到项目路径中,cmd运行nginx.exe,访问localhost:80,看到welcome to nginx即为成功
3.2、Linux安装
安装前先确认是否以前是否安装过,安装过要删除旧版本。
(1)官网下载压缩包
在官网上,windows版本的nginx标注了windows,linux版本是默认的,没有标注
(2)把压缩包上传到服务器
(3)解压, tar -zxvf nginx-1.20.1
(4)安装,进入nginx目录,看到 configure 文件,然后执行configure文件,再make、make install即可。
./configure
make
make install
(5)查看安装目录
whereis nginx
(6)cd到nginx目录的sbin目录,运行nginx
./nginx
访问nginx主页,能访问到表示已经安装成功。
Linux安装过程中出现的问题:
(1)在执行 ./configure
命令时,报错,没有安装PCRE library
补安装:yum -y install pcre-devel
(2)安装 pcre 后,报错,没有安装zlib
补安装zlib:
zlib安装包下载地址:http://www.zlib.net/zlib-1.2.11.tar.gz
下载完毕后上传到虚拟机上,解压,然后cd到zlib目录中,安装zlib
./configure
make
make install
zlib安装完成后就可以继续安装nginx啦。
3.3、docker安装
在安装linux版的nginx的过程中,会发现缺少某些依赖而不能安装,这时就体现出docker安装的好处了。
(1)拉取镜像
docker pull nginx
(2) 创建容器,设置端⼝映射、⽬录映射
这一步根据具体需要设置目录映射、端口映射
# 在/root⽬录下创建nginx⽬录⽤于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
启动容器:
docker run -id --name=c_nginx \
-p 80:80 \
-p 81:81 \
-p 82:82 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/conf.d:/etc/nginx/conf.d \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
到这里,nginx镜像也可以使用了。
4、常用命令
Linux环境中,nginx的常用命令如下:
# 启动nginx
./nginx
# 停止nginx
./nginx -s stop
# 安全退出nginx
./nginx -s quit
# 当配置文件修改以后,要重新加载配置文件改动才生效
./nginx -s reload
# 查看进程
ps aux | grep nginx
如果是用的docker,可以按照docker的命令使用nginx。
5、Nginx配置文件
nginx配置文件的结构大致如下:
全局配置
events配置
http{
http全局配置
upstream xx{
负载均衡配置
}
server{
listen 80;
server_name localhost;
location /{
root html;
index index.html;
proxy_pass http://xxxx
}
}
server{
listen 443;
server_name localhost;
location /{
root html;
index index.html;
proxy_pass http://xxxx
}
}
}
有多个server在http里配置即可,每个server中listen是指监听的端口号,server_name是域名,location是请求,location中的root是存放静态资源的目录,index是当前请求访问的静态资源,proxy_pass是反向代理。
upstream是实现负载均衡的,放在http里面,server外面。
示例:
upstream myProxy{
192.168.127.131:81
}
server{
listen 81; # nginx监听的端口号
server_name www.port81.com;
location /{
root html/port81;
index index.html;
proxy_pass http://myProxy
}
}
当前nginx监听了81端口号,域名是www.port81.com,当请求 www.port81.com:81 发送过来,首先走到了myProxy这个代理中,然后找到了 upstream,最后实际访问的地址是 192.168.127.131:81,最后访问到 html/port81 目录里的 index.html 。
6、部署静态资源
了解了配置文件以后,就可以部署静态资源。部署静态资源可以通过端口部署,也可以通过域名部署。
6.1、通过端口部署
在html目录中准备port81和port82目录,分别在port81和port82里准备不同内容的index.html用于测试。
修改nginx.conf中server部分的内容:
server{
listen 81; # nginx监听的端口号
server_name localhost;
location /{
root html/port81;
index index.html;
}
}
server{
listen 82; # nginx监听的端口号
server_name localhost;
location /{
root html/port82;
index index.html;
}
}
修改完配置文件以后要记得reload nginx,配置文件才会生效。
现在访问 192.168.127.131:81 会访问到 html/port81/index.html 这个文件,访问 192.168.127.131:82 会访问到 html/port82/index.html 这个文件。(因为nginx是部署在虚拟机上的,这里的ip地址是虚拟机的ip)
6.2、通过域名部署
通过域名部署的方式就是把nginx.conf中的server里的server_name改为自己配置的域名,比如 www.port81.com, 然后修改本机上的host文件,将域名和ip绑定。
本机host文件地址:C:/Windows/System32/driver/etc/host
在host文件中加上:
192.168.127.131 www.port81.com
这样配置以后在本机访问 www.port81.com 相当于访问 192.168.127.131
nginx.conf内容如下:
server{
listen 81; # nginx监听的端口号
server_name www.port81.com;
location /{
root html/port81;
index index.html;
}
}
server{
listen 82; # nginx监听的端口号
server_name www.port82.com;
location /{
root html/port82;
index index.html;
}
}
这样通过 www.port81.com:81 和 www.port82.com:82 也能访问到对应的静态资源。
7、反向代理和负载均衡
反向代理和负载均衡放在一起测试,修改nginx.conf内容如下:
upstream myProxy{
192.168.127.131:81 weight=1;
192.168.127.132:81 weight=1;
}
server{
listen 81; # nginx监听的端口号
server_name www.port81.com;
location /{
root html/port81;
index index.html;
proxy_pass http://myProxy
}
}
设置一个反向代理 myProxy,请求过来以后会通过myProxy,选择 192.168.127.131:81 或者 192.168.127.132:81 中的一台服务器服务,在upstream中通过weight可以设置两台服务器的权重,weight越大权重越高,比如有一台服务器性能比较好,希望更多请求能让这个服务器处理,那么就可以把这台服务器的weight设置得高一点。
以上就是Nginx的简单入门。如有不正确的,欢迎讨论。