nginx之安装多虚拟主机反向代理和负载均衡

Posted tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx之安装多虚拟主机反向代理和负载均衡相关的知识,希望对你有一定的参考价值。

一、web服务器与web框架

1、web服务器简介


Web 网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的请求后才会响应,
最终用于提供服务程序的Web服务器会通过 HTTP(超文本传输协议)或 HTTPS(安全超文本传输协议)把请求的内容传送给用户。


目前能够提供 Web 网络服务的程序有 IIS、
nginx 和 Apache 等。
其中,IIS(Internet Information Services,互联网信息服务)是Windows系统中默认的Web服务程序
Nginx 程序作为一款轻量级的网站服务软件,因其稳定性和丰富的功能而快速占领服务器市场,
Nginx 最被认可的是系统资源消耗低且并发能力强,因此得到了国内诸如新浪、 网易、腾讯等门户站的青睐。


web服务器和web框架的关系
web服务器(nginx):接收HTTP请求(例如:www.baidu.com)并返回数据
web框架(django,flask):开发web应用程序,处理接收到的数据

 

 

二、Nginx安装详解

1、nginx介绍

nginx是一个开源的,支持高性能,高并发的www服务和代理服务软件。
nginx比它大哥apache性能改进许多,nginx占用的系统资源更少,支持更高的并发连接,有更高的访问效率。
nginx不但是一个优秀的web服务软件,还可以作为反向代理,负载均衡,以及缓存服务使用。

总的来说nginx:
  支持高并发,能支持几万并发连接
  资源消耗少
  可以做http反向代理和负载均衡
  支持异步网络i/o事件模型epoll

偷偷告诉你Tengine
Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。

从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护着它。Tengine团队的核心成员来自于淘宝、搜狗等互联网企业。Tengine是社区合作的成果,我们欢迎大家参与其中,贡献自己的力量。

 

2、编译安装

1. 下载依赖
yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y

2.下载源码包
cd /opt/
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz

3.解压缩源码
tar -zxvf nginx-1.12.0.tar.gz

4.配置,编译安装
cd nginx-1.12.0
./configure --prefix=/opt/nginx1.12/
make && make install

5.启动nginx进入sbin目录,找到nginx启动命令
cd /opt/nginx1.12
cd sbin
./nginx # 启动
ps -ef|grep nginx  # 查看nginx是否已经启动

./nginx -s stop # 关闭
./nginx -s reload # 平滑重启 ,修改了nginx.conf之后,可以不重启服务,加载新的配置

 

3、分析nginx的工作目录

1. 查看工作目录
cd /opt/nginx1.12/
ls  # 目录如下
client_body_temp  conf fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp

2. 目录分析
conf 存放nginx所有配置文件的目录,主要nginx.conf,是控制nginx所有功能的文件
html 存放nginx默认站点的目录,如index.html、error.html等
logs 存放nginx默认日志的目录,如error.log access.log
sbin 存放nginx主命令的目录,sbin/nginx

 

4、nginx.conf配置文件解析

# Nginx运行的work进程数量(建议与CPU数量一致或auto)
worker_processes  1;

# Nginx错误日志存放路径
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# Nginx服务运行后产生的pid进程号
#pid        logs/nginx.pid;

# 事件连接数
events {
    worker_connections  1024;
}


# http代码块,是控制nginx核心功能的代码块
# 公共的配置定义在http{},用的是c语言的语法
http {
    include       mime.types;
    default_type  application/octet-stream;
    
    # 定义nginx的访问日志功能
    # nginx会有一个accses.log功能,查看用户访问的记录
    log_format  main  \'$remote_addr - $remote_user [$time_local] "$request" \'
                      \'$status $body_bytes_sent "$http_referer" \'
                      \'"$http_user_agent" "$http_x_forwarded_for"\';
    # 开启accses.log功能(记录日志,会记录下remote_addr--请求的ip,remote_user--请求的用户等信息)
    access_log  logs/access.log  main;
    
    sendfile        on;
    
    keepalive_timeout  65;
    
    # 开启gzip压缩传输(在传输图片视频等资源的时候进行压缩)
    gzip  on;
    
    # server代码块是定义nginx的虚拟主机
    server {
        # 定义nginx的访问入口端口,访问地址就是:你的服务器ip:80
        listen       80;
        
        # 定义网站的域名
        # 如果没有域名,就填写服务器的ip地址
        server_name  192.168.3.16;
        
        # location定义nginx的路径匹配(最低级的匹配)
        # 就是说只要来自于192.168.3.16这个server_name的请求,都会走到这个location
        # 比如访问:192.168.3.16/ 就会去/opt/nginx1.12/html目录下找index.html
        location / {
            # 这个root参数,是关键字,定义网页的根目录
            # 以nginx安装的目录为相对路径,那么这里的html目录的路径就是:/opt/nginx1.12/html 
            # 可以自由修改这个root定义的网页根目录(这里的html是目录)
            root   html;
            
            # index参数定义网站的首页文件名,默认的文件名
            index  index.html index.htm;
        }
        # 错误页面的优化
        # /40x.html 这里的 / 代表的是上面loction 的 / 也就是 root 指定的 html目录
        # 意思就是出现以下错误码的时候,就去访问/opt/nginx1.12/html/40x.html页面
        error_page  400 401  402  403  404   /40x.html;
        
        # 跟上面的同理,访问的是/opt/nginx1.12/html/50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
}

 

5、location语法详解

大类型可以分为三种:

  location = patt {} [精准匹配]

  location patt {}     [普通匹配]

  location ~ patt {}  [正则匹配]

 

1. 具体的 location 后面跟的匹配符

匹配符 匹配规则 优先级
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
!~ 区分大小写不匹配的正则 5
!~* 不区分大小写不匹配的正则 6
/ 通用匹配,任何请求都会匹配到 7

 

2. 示例

server {

    listen 80; 

    server_name zzbj; 
    
    # 精准匹配,浏览器输入:http://zzbj/index.html,定位到服务器上的 /opt/project/html/index.html文件
    location =/index.html {
    
        root /opt/project/html;  # 这里是绝对路径
        index index.html;

    }
    
    # 普通匹配,浏览器输入:http://zzbj,定位到服务器上的/opt/nginx1.12/html/default.html文件
    location / {

        root html;  # 这里是相对路径,即相对于nginx安装的目录,我的nginx安装在/opt/nginx1.12

        index default.html;

    }

    # 正则匹配,浏览器输入:http://zzbj/image..,定位到/opt/project/image/image.html
    location ~ image {

        root /opt/project/image;

        index image.html;
    }
}

 

server {
    listen 80;
    server_name heiheihei.com;

    #优先级1,精确匹配,根路径
    location = / {
        return 400;
    }

    #优先级2,以a开头的,优先匹配这里,区分大小写
    location ^~ /a {
        root /data/a/;
    }

    #优先级3,区分大小写的正则匹配,匹配/media*****路径
    location ~ /media {
        alias /data/static/;
    }

    #优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
    location ~* .*\\.(jpg|gif|png|js|css)$ {
        root  /data/a/;
    }

    #优先7,通用匹配
    location / {
        return 403;
    }
}

 

3. root和alias区别

nginx指定文件路径有root和alias两种方法
区别在方法和作用域:
    root
    语法  root  路径;
    默认值 root   html;
    配置块  http{}   server {}   location{}

    alias
    语法: alias  路径
    配置块  location{}

root和alias区别在nginx如何解释location后面的url,这会使得两者分别以不同的方式讲请求映射到服务器文件上

root参数是root路径+location位置
root实例:
    location ^~ /a {
        root /data/a;   注意这里可有可无结尾的   /
    }
请求url是heiheihei.com/a/index.html时
web服务器会返回服务器上的/data/a/a/index.html

root实例2:
location ~* .*\\.(jpg|gif|png|js|css)$ {
    root  /data/static/;
}
请求url是heiheihei.com/beautiful.gif时
web服务器会返回服务器上的/data/static/beautiful.gif


alias参数是使用alias路径替换location路径
alias是一个目录的别名
注意alias必须有 "/"  结束!
alias只能位于location块中

alias实例:
location ^~ /a {
    alias /data/static/;
}
请求url是heiheihei.com/a/index.html时
web服务器会返回服务器上的/data/static/index.html

 

6、配置404错误页面

1. 进入配置目录
cd /opt/nginx1.12/html/

2. 新建40x页面
touch 40x.html

3. 编写页面
vim 40x.html
百度一个即可
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>404-对不起!您访问的页面不存在</title>

<style type="text/css">

.head404{ width:580px; height:234px; margin:50px auto 0 auto; background:url(https://www.daixiaorui.com/Public/images/head404.png) no-repeat; }

.txtbg404{ width:499px; height:169px; margin:10px auto 0 auto; background:url(https://www.daixiaorui.com/Public/images/txtbg404.png) no-repeat;}

.txtbg404 .txtbox{ width:390px; position:relative; top:30px; left:60px;color:#eee; font-size:13px;}

.txtbg404 .txtbox p {margin:5px 0; line-height:18px;}

.txtbg404 .txtbox .paddingbox { padding-top:15px;}

.txtbg404 .txtbox p a { color:#eee; text-decoration:none;}

.txtbg404 .txtbox p a:hover { color:#FC9D1D; text-decoration:underline;}

</style>
</head>
<body bgcolor="#494949">
       <div class="head404"></div>
       <div class="txtbg404">
  <div class="txtbox">
      <p>对不起,您请求的页面不存在、或已被删除、或暂时不可用</p>

      <p class="paddingbox">请点击以下链接继续浏览网页</p>

      <p><a style="cursor:pointer" onclick="history.back()">返回上一页面</a></p>
    </div>
  </div>
</body>
</html>
404页面

4. 重启nginx
/opt/nginx1.12/sbin/nginx  # 开启nginx
/opt/nginx1.12/sbin/nginx -s reload  # 重启
/opt/nginx1.12/sbin/nginx -s stop  # 停止

 

三、nginx多虚拟主机和常用的几个功能

1、多虚拟机概念

虚拟主机就是将一台服务器分割成多个“虚拟服务器”,每个站点使用各自的硬盘空间,由于省资源,省钱,众多网站都使用虚拟主机来部署网站。


虚拟主机的概念就是在web服务里的一个独立的网站站点,这个站点对应独立的域名(IP),具有独立的程序和资源目录,可以独立的对外提供服务。
这个独立的站点配置是在nginx.conf中使用server{}代码块标签来表示一个虚拟主机。
Nginx支持多个server{}标签,即支持多个虚拟主机站点。


虚拟主机类型:
  基于域名的虚拟主机
    通过不同的域名区分不同的虚拟主机,是企业应用最广的虚拟主机。

  基于端口的虚拟主机
    通过不同的端口来区分不同的虚拟主机,一般用作企业内部网站,不对外直接提供服务的后台。

  基于IP的虚拟主机
    通过不同的IP区分不同的虚拟主机,此类比较少见,一般业务需要多IP的常见都会在负载均衡中绑定VIP

 

2、多虚拟机配置步骤

1. 新建两个工作目录
cd /opt/nginx1.12/
mkdir jd
mkdir tb

2. 修改配置文件
vim /opt/nginx1.12/conf/nginx.conf

配置文件添加如下虚拟主机
server {
    listen       80;
    server_name  myjd.com;
    location / {
        root   jd;
        index  index.html index.htm;
    }
    error_page  404              /40x.html;
    error_page   500 502 503 504  /50x.html;
}

server {
    listen    80;
    server_name  mytb.com;
    location  /  {
        root  tb;
        index  index.html;
    }
    error_page  404              /40x.html;
    error_page   500 502 503 504  /50x.html;
}

注意:如果你所有虚拟主机都使用同一个404页面,你可以把
error_page  404   /40x.html; 这段代码放到跟 server外面同级的位置即可

3. 在jd和tb目录下新建index.html文件
vim /opt/nginx1.12/jd/index.html  # 自己随便写点东西测试
vim /opt/nginx1.12/tb/index.html

/opt/nginx1.12/sbin/nginx -t  # 测试你刚才写的内容有没有错误

4.重启nginx,加载新的配置
/opt/nginx1.12/sbin/nginx -s reload

5.修改windows的本地hosts解析文件,用于域名解析
windows的hosts文件路径
C:\\Windows\\System32\\drivers\\etc

写入如下配置
你服务器的ip  myjd.com
你服务器的ip  mytb.com

6.在windows浏览器中,查看两个域名对应到的虚拟主机
分别访问myjd.com 域名和mytb.com 域名,查看网站的资料的内容变化

 

3、开启日志

1. 配置方式
修改nginx.conf配置文件,打开如下配置注释(默认是被注释了的)
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;

 

4、拒绝访问功能

nginx拒绝访问功能使用 deny 关键字
在某一个虚拟主机下,定义一个deny参数,可以拒绝deny指定的ip地址对该虚拟主机的访问
server {
        listen       80;
        server_name  myjd.com;
        #禁止192.168.3.16这个ip访问myjd.com
        location / {
            deny  192.168.11.0/24;
            root   jd;
            index  index.html index.htm;
        }
        error_page  404              /40x.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

 

四、nginx反向代理

1、代理是什么

 

2、配置nginx的反向代理

1.实验准备,准备2台nginx机器
机器1  192.168.3.16    用作web应用,数据返回
机器2  192.168.3.115   用作nginx反向代理服务器 


在windows中访问代理服务器,然后让代理服务器去拿web应用的数据

windows   >   192.168.3.115   >   192.168.3.16


windows   <   192.168.3.115   <   192.168.3.16


2.准备机器1(web应用),只是对数据页面的一个返回
server {
    listen       80;
    server_name  192.168.3.16;

    #charset koi8-r;
    location / {
        root   html;
        index  index.html index.htm;
    }
}


3.准备机器2,用作nginx的反向代理服务器,这个机器不存数据,只转发请求
server {
        listen       80;
        server_name  192.168.3.115;
        # 在这里进行反向代理配置
        location / {
        proxy_pass http://192.168.3.16;
        # root   html;
        # index  index.html index.htm;
        }
}


4. 测试
你可以把两个服务器的日志功能都打开,都输入命令:tail -f logs/access.log 进行检测
然后你打开windows的浏览器,访问192.168.3.115,会发现最后显示的是192.168.3.16的内容
访问:windows浏览器 --> 192.168.3.115 --> 192.168.3.16
结果:192.168.3.16 --> 192.168.3.115 --> windows浏览器

 

五、nginx的负载均衡

1、什么是负载均衡

nginx的负载均衡,顾名思义,就是压力分担,试想一下,如果你的网站很受欢迎,每天都有几十万人访问,
但是你只有一台服务器,那么你的服务器是处理不了那么多的请求的,甚至会挂掉,服务器一挂,你的网站就访问不了了,
那么久而久之你的网站还有人去吗,人一多就访问不了。

就比如,百度,每天那么多人去访问,你见过百度的网站访问不了吗,百度肯定会有成千上万台服务器一起协同工作,分担压力的,
不然只有一台机器肯定承受不了那么大的压力的。

 

2、优点

1.集群是什么
一堆服务器做一件事

2.集群性能很高
比如:淘宝本来的核心支付服务器是小型机,非常昂贵,且难以维护
后来都将服务器更换为集群架构
一堆便宜的服务器,维护者一个功能运转

3.高可用性
单点机器很可能down机
集群单机机器down机,不会影响整体的运转

 

3、利用nginx实现负载均衡

Nginx要实现负载均衡需要用到proxy_pass代理模块配置
Nginx负载均衡与Nginx代理不同地方在于:
  Nginx代理仅代理一台服务器,而Nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池
  Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用

1.准备三台机器
nginx.conf配置如下:

机器1:作为nginx的负载均衡器  192.168.3.158

# 定义nginx负载均衡池,用关键字upstream定义,里面默认是轮训算法
# 也可以用weight 权重算法
# 也可以用ip_hash 算法
# upstream定义负载均衡池的关键字 nginx_pools是变量名(什么都可以)
# server是要代理的服务器ip upstream nginx_pools { server 192.168.3.16; server 192.168.3.115
; } server { listen 80; server_name 192.168.3.158; #charset koi8-r; #access_log logs/host.access.log main; # 在这里进行负载均衡代理配置 location / { proxy_pass http://nginx_pools; } } 机器2 准备nginx 返回页面数据 192.168.3.16 server { listen 80; server_name 192.168.3.16; location / { root html; index index.html index.htm; } error_page 404 /40x.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; index index.html index.htm; } } 机器3 也准备nginx 返回页面数据 192.168.3.115 server { listen 80; server_name 192.168.3.115; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } } 2.分别启动三台机器,三个nginx服务 3.在windows中访问负载均衡器的地址,查看请求分发, 访问 192.168.11.158 4. 如果想捉到爬虫的真实客户端的ip地址,就得如下配置 location / { #加上这2个参数,可以查看到用户的真实ip,也就是windows客户端的地址 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://nginx_pools; }

 

4、upstream分配策略

1. 轮询(默认的策略)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

2. weight 权重
upstream nginx_pools {
    server  192.168.3.16 weight=100;  # 这个地址的访问比率就会大于下面那个
    server 192.168.3.115 weight=20;

3. ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器
upstream nginx_pools {
    ip_hash;
    server 192.168.3.16;
    server 192.168.3.115;
}

4. backup
在非backup机器繁忙或者宕机时,请求backup机器,此机器默认压力最小
upstream nginx_pools {
    server 192.168.3.16;
    server 192.168.3.115;
    server 192.168.10.11 backup;
}

 

六、好玩的Linux屏保

1.下载屏保软件源码包
cd /opt
wget https://jaist.dl.sourceforge.net/project/cmatrix/cmatrix/1.2a/cmatrix-1.2a.tar.gz

2.解压缩源码包
tar -zxvf cmatrix-1.2a.tar.gz

3.进入源码包目录
cd cmatrix-1.2a/

4.释放编译文件
./configure --prefix=/opt/cmatrix/

5.编译且安装
make && make install 

6.进入安装屏保软件的目录
cd /opt/cmatrix/

7.执行屏保命令
./bin/cmatrix

 

以上是关于nginx之安装多虚拟主机反向代理和负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

nginx 配置反向代理和负载均衡

全面介绍 Nginx 的反向代理 负载均衡 虚拟主机配置

nginx 虚拟主机 反向代理 负载均衡

Nginx 反向代理负载均衡虚拟主机实践教程

Nginx的安装以及反向代理和负载均衡的配置

LNMP架构应用实战—Nginx反向代理负载均衡配置