avatar

28.Nginx学习之路之反向代理

Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务(摘自百度百科)。
Nginx在互联网项目中使用频繁,刚好最近在学习Nginx的知识,所以就用小本本记下学习成果,和诸君分享。

0x01 本篇学习目标

  1. 了解nginx;
  2. 了解反向代理;
  3. 如何使用nginx配置反向代理;

0x02 Nginx概念以及应用场景

  1. 正如上面所说,Nginx是一个高性能的HTTP和反向代理web服务器。支持在高并发情况下进行负债均衡,可以作为Apache服务器的替代品。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比同类产品好很多。
  2. 在这里,我们知道了Nginx是一个web服务器,那么它会应用到哪些地方呢?
    1. http服务器;Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
    2. 虚拟主机;可以实现在一台服务器虚拟出多个网站
    3. 反向代理,负载均衡;当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
    4. 安全管理;比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。

0x03 Nginx安装

  1. 这里首先简单说一下在windows上如何使用,Linux上面安装nginx后面在补上。
  2. windows平台
    • 到官网http://nginx.org/en/download.html中下载对应版本的windows平台的nginx。我这里下载的是1.14.2
    • 解压到目录。
      • 目录结构如下:
    • 双击nginx.exe运行
    • 黑框会一闪而过,这时候怎样判断nginx是否启动成功了呢?或者说启动有没有报错呢?
      • 打开logs目录
      • 查看error.log中是否有错误信息。如果没有,则说明启动没有报错。
    • 浏览器输入http://127.0.0.1如果看到如下界面,则说明启动成功
    • 总体来说,在windows平台上使用Nginx还是挺简单的,但是在Linux上可就不一定。下面就来说说如何在Linux上安装Nginx。
  3. Linux平台(以centos7作为例子)
    1. 首先如果我们Linux上面没有gcc环境,则需要通过下面的命令安装。因为nginx是C语言写的,编译需要依赖 gcc 环境。
      • yum install gcc-c++
    2. 安装PCRE pcre-devel,nginx 的 http 模块使用 pcre 来解析正则表达式。所以我们通过下面命令进行安装即可
      • yum install -y pcre pcre-devel
    3. 安装zlib.zlib提供许多解压和压缩的方式,nginx通过zlib对 http 包的内容进行 gzip。安装命令如下:
      • yum install -y zlib zlib-devel
    4. 安装OpenSSL.OpenSSL 是一个强大的安全套接字层密码库.拥有ssl、常见的密码算法、常见的密钥和证书等。因为nginx不仅支持http,还支持https。所以需要安装一下OpenSSL.命令如下:
      • yum install -y openssl openssl-devel
    5. 接下来我们去Nginx官网的下载页面下载对应版本的.tar.gz包。或者直接使用wget命令下载。wget下载命令如下(这里下的是1.16.0版) :
      • wget -c https://nginx.org/download/nginx-1.16.0.tar.gz
    6. 下载完后,使用tar -zxf nginx-16.0.tar.gz命令解压
    7. 进入解压目录。执行如下命令:
      • ./configure
      • make && make install
    8. 使用where nginx命令查找nginx安装目录。
    9. cd到指定目录,使用./nginx启动nginx。
    10. nginx常用命令
      • nginx -s stop:退出nginx
      • nginx -s reload:重新加载nginx配置文件而不重启nginx

0x04 Nginx虚拟主机配置

  1. Nginx的配置全部都在conf这个文件夹下面的nginx.conf文件中。我稍微的处理了下,把注释的全部都删了
  2. nginx.conf结构如下(图是网上找的,原图链接:https://www.imydl.tech/lnmp/527.html):
  3. 让我们对照上面的图来一一对 默认的配置进行解析吧。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #在nginx配置文件中‘#’用作注释
    #这是全局块
    #worker_processes是指定Nginx进程最多可以产生的worker process数(即进程数)
    worker_processes 1;
    # events{}包含的就是events块
    events {
    #配置允许每一个worker process可以同时开启的最大连接数
    worker_connections 1024;
    }
    #被http{}包裹的就是http块
    http {
    #http全局块
    #include命令是包含的意识。这里是引入mime.types文件。该文件在conf目录下
    #MIME-Type指的是网络资源的媒体类型,也即前端请求的资源类型
    include mime.types;
    default_type application/octet-stream;
    #用于开启或关闭使用sendfile()传输文件,默认off
    sendfile on;
    #server端对连接的保持时间
    keepalive_timeout 65;
    #被server{}包裹的是server块,一个http块中可以有多个server块
    server {
    #server全局块
    #listen表示监听的端口,可以配置成地址形式
    listen 80;
    #server_name表示可接收请求的域名,可使用正则。
    server_name localhost;
    # 以上配置表明该server块只处理localhost:80的请求

    #使用location{}包裹的是location块 /代表所有请求
    location / {
    #配置根路径
    root html;
    #配置主页
    index index.html index.htm;
    }
    #以上配置说明:只要是localhost:80下的请求。
    #不管是localhost:80/aaa/bbb还是localhost:80/ccc都会映射到html路径下的对应文件
    #主页的路径是html/index.html

    #server全局块
    #error_page配置的是错误页地址
    error_page 500 502 503 504 /50x.html;

    # location块,‘=’表示严格匹配。即只要是/50x.html都会映射到html路径中
    location = /50x.html {
    root html;
    }
    }

    }
  4. 下面让我们在在根目录建立一个test目录,来演示下如何配置请求不同,访问的目录也不同(即虚拟主机)
    1. 我们复制一下html中的index.html到test目录中。然后简单修改下。即在标题中加一个test以作区分。
    2. 修改配置文件nginx.conf。修改好的配置如下(假设我们访问localhost:81/index会访问到test目录中的index.html文件):
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      worker_processes  1;
      events {
      worker_connections 1024;
      }

      http {
      include mime.types;
      default_type application/octet-stream;
      sendfile on;
      keepalive_timeout 65;
      # 这是原先的server
      server {
      listen 80;
      server_name localhost;

      location / {
      root html;
      index index.html index.htm;
      }

      error_page 500 502 503 504 /50x.html;
      location = /50x.html {
      root html;
      }
      }
      #这是新加的server
      server {
      #监听81端口
      listen 81;
      #域名匹配为localhost
      server_name localhost;
      #所有请求
      location / {
      #根路径为test,这里的路径是相对路径,相对于nginx根路径,即最上层路径
      root test;
      #主页为index.html如果index.html找不到,则会找index.htm
      index index.html index.htm;
      }
      #错误页配置
      error_page 500 502 503 504 /50x.html;
      location = /50x.html {
      root html;
      }
      }
      }
      可以看到要配置多个虚拟主机,只需要在http块中多添加几个server块就行了。然后监听不同的端口,指向不同的路径。
    3. 重启nginx。注意:在windows平台上面不能使用命令去重启nginx,只能在任务管理器中把nginx进程kill掉,在重新打开。
    4. 访问localhost:81.效果如下:
    5. 到此,我们配置虚拟主机已经成功了。下面我们来看看反向代理。

0x05 反向代理概念&如何使用Nginx配置反向代理

  1. 反向代理概念:
  • 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。nginx使用proxy_pass转发请求。下面就让我们看看怎么配置吧。
  1. 使用Nginx配置反向代理
    1. 这里需要我们启动1个服务器。我这里以tomcat作为服务器,运行两个java项目,里面都只有1个html文件。
    2. 配置nginx.conf,内容如下:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      worker_processes  1;
      events {
      worker_connections 1024;
      }

      http {
      include mime.types;
      default_type application/octet-stream;
      sendfile on;
      keepalive_timeout 65;
      #还是两个不同的server块
      server {
      #监听的端口都是80,但server_name不同。
      listen 80;
      server_name www.zyzling.top;

      location / {
      #使用server_pass对请求到www.zyzling.top的所有请求都转发给127.0.0.1:8080/test1
      #注意一定要以‘;’结束。
      proxy_pass 127.0.0.1:8080/test1/;
      }
      }

      server {
      listen 80;
      server_name bbs.zyzling.top;

      location / {
      proxy_pass 127.0.0.1:8080/test2/;
      }
      }
      }
    3. 因为我们是本地玩,没有域名。所以我们需要改host文件。修改如下:
      1
      2
      127.0.0.1 www.zyzling.top
      127.0.0.1 bbs.zyzling.top
    4. 重启nginx
    5. 效果如下:
      • www.zyzling.top
      • bbs.zyzling.top
    6. 反向代理到此也告一段落了。我们来总结下。

0x06 总结

  1. 该篇只是Nginx的第一篇,所以内容很简单,当然也会有很多错误之处,望大家不吝赐教。
  2. 需要注意的是,每句非块配置后面一定要加’;'作为结束,不然启动会报错。
  3. 反向代理其实配置很简单,命令为proxy_pass.这个在我前面的从jekyl到Hexo一文中有用过。我的博客就是通过该方法转发的。
  4. 后面我将学习怎样用Nginx做负载均衡,等我学完,再记下笔记,与诸位大佬分享。
  5. 参考资料:
  6. 感谢观看~~

评论