Linux环境下Nginx及负载均衡

Nginx简介Nginx是一个高性能的HTTP和反向代理Web服务器,同时也提供了IMAP/POP3/SMTP服务。前向代理作为客户端的代理,服务端只知道代理的IP地址而不知道客户端的IP地址。Nginx安装推荐使用LNMP一键安装包,Ubuntu/CentOS等各平台都有提供,省去自己配置的过程。如果需要单独安装Nginx,可以去找各平台的安装包名称。以UbuntuDesktop19.04为例,...

Linux环境下Nginx及负载均衡

Nginx 简介

Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。
前向代理作为客户端的代理,服务端只知道代理的 IP 地址而不知道客户端的 IP 地址。
1557749097576

Nginx 安装

推荐使用 LNMP 一键安装包,Ubuntu/CentOS 等各平台都有提供,省去自己配置的过程。

如果需要单独安装 Nginx,可以去找各平台的安装包名称。以 Ubuntu Desktop 19.04 为例,单独安装 Nginx 的命令如下:

sudo apt install nginx

1557750229828
Nginx 安装后默认启动,打开浏览器输入 http://127.0.0.1 检查是否安装成功。
1557750269605

练习 1

使用 tail -f /path/to/nginx/log/access.log 实时监控文件变化,再分别本地访问 127.0.01 和远程访问服务器 IP 地址,比较两次访问的日志有什么不同?

Tips: Ubuntu Server 版默认没有桌面,通过 SSH 连接到服务器

  1. 打开新终端,通过 SSH 连接到服务器,再使用 curl 127.0.0.1 命令返回页面源文件
  2. 打开客户端浏览器,输入服务器 IP 地址
  3. 比较上面两步对应的操作日志有什么区别
    刚才在 Ubuntu 默认的火狐浏览器打开 127.0.0.1 时的访问日志如图。
    1557750357418
    接下来换一台电脑访问 192.168.23.129。
    1557750398919
    1557750411791
    首先可以看到,UA 是不一样的,这是因为我用了不同的浏览器,当然,访问时间等也是不一样的。
    最关键的一点,第一次访问的 IP 是 127.0.0.1,是环回地址,而后一次访问的 IP 是 192.168.23.1,这个是我 Windows 10 的 IP 地址。
    最后看一点实战的内容——我的博客的访问日志:
    1557750709656
    1557750722075
    从中可以看到类似的日志记录,不仅记录了访问者的 IP、UA,还记录了访问资源 URL 以及一些附加的信息。
    同样的,还有错误日志,例如看一下 gitlab.error.log
    1557750810498
    有了这些日志,管理员就方便排查问题了。

    Nginx 默认配置

    配置文件:/etc/nginx/nginx.conf(如果是 LNMP 安装的,则可能在 /usr/local/nginx/conf/nginx.conf)。
    可以用 less 查看配置文件,配置文件默认的环境是全局环境,即一个 main{},后面会定义用户、工作进程等,以及 HTTP 服务、邮件服务。
    1557817139159
    下面主要讲一下 HTTP 配置文件。
    1557817159052
    首先在 HTTP{} 会有一些全局的配置,包括访问日志、连接超时等信息,随后会给出一个或多个 server 表示多个虚拟主机。
    来看一下实战的配置文件。
    1557817278775
    1557817334696
    用户和用户组都是 www,配置了错误日志的访问路径,工作模式是 epoll、IO 多路复用,单个进程的最大连接数是 51200。
    1557817394587
    配置了 fastcgi 相关信息。

    Nginx 作为 HTTP 服务器的配置

    Nginx 默认的静态资源文件夹为 /var/www/html(不同的安装包可能有不同的默认路径,例如可能为 /usr/local/nginx/www/html/default 或者其他目录,也可以自己指定)。
    在默认目录下,新建一个叫做 jxtxzzw.html 的文件,随便写一点东西。
    1557817758381
    1557817709063
    然后在 nginx.conf 的 HTTP 结点中新增一个虚拟服务器,并 sudo nginx -s reload 重新加载。
    1557817875799
    如图,在 80 端口监听,当用户访问的服务器是 jxtxzzwtest.com 的时候,就定位到 /var/www/html/ 下,并当用户没有指定访问的路径的时候,默认访问 jxtxzzw.html
    为了模拟域名解析的过程,修改 /etc/hosts 文件,增加 jxtxzzwtest.com 的 IP 为 127.0.0.1
    1557818114250
    修改之后打开浏览器访问 jxtxzzwtest.com,可以看到刚才的页面。
    1557818165684
    如何不购买新的二级域名和服务器,利用该服务器和已有的域名再做一个个人主页呢?
    这就可以添加一个新的虚拟服务器。
    重复上面的步骤,只是注意添加虚拟服务器的时候取一个新的 server_name,例如 new.jxtxzzwtest.com,至于 location 写什么,就看个人主页放在了哪个文件夹下面了。这些都可以根据自己需要修改。
    server {listen 80;server_name new.jxtxzzwtest.com;location / {  index a_new_page.html;  root /home/jxtxzzw/web/;}}
    随后,在 hosts 模拟 DNS 解析,添加 127.0.0.1 new.jxtxzzwtest.com 之后就可以在浏览器访问 new.jxtxzzwtest.com 来看到个人主页了。

    练习 2

  4. 在配置文件 nginx.conf 的 http 节点内新增一个虚拟服务器,新建 /var/www/EXAMPLE.com 文件夹,该文件夹下新建 index.html 文件写入文字,重加载配置 sudo nginx -s reload (注:将本页中的 EXAMPLE 替换成自己的名字拼音)
  5. 浏览器输入 IP 地址,检查是否生成 /var/log/nginx/EXAMPLE.access.log 文件,同时检查 /var/log/nginx/access.log 文件是否有变化
  6. 修改自己客户端电脑上的 hosts 文件,添加两行解析到服务器 IP 地址
  7. 浏览器输入 www.EXAMPLE.com,检查是否生成 /var/log/nginx/EXAMPLE.access.log,同时监测 /var/log/nginx/access.log 和 /var/log/nginx/EXAMPLE.access.log 文件的变化
    server {listen 80;server_name www.zzw.com;access_log /var/log/nginx/zzw.access.log;location / {  index index.html;  root /var/www/html/zzw.com/;}}
    1557818970811
    输入 IP 地址,不论是本机访问 127.0.0.1 还是另一台电脑访问 192.168.23.129,发现都只访问了 Nginx 默认的安装成功页面,没有进入 zzw.com。
    显然的,只有 access.log 会有变化,记录了本次访问信息。
    1557819148817
    而在添加了 hosts 以后,访问 www.zzw.com 就会看到刚才输入的信息。
    1557819224946
    需要注意的是,在配置文件中只定义了 www.zzw.com,没有定义 zzw.com,所以,在访问 zzw.com 的时候还是会跳转到 Nginx 安装成功的那个页面。
    解决这个办法可以在 server_name 后面增加一个别名。
    server_name www.zzw.com zzw.com;
    看到 zzw.access.log 和 access.log 都有了新的记录。
    来看一些实战的内容。
    1557819404635
    我的博客,监听了 80 端口,同时处理 www.jxtxzzw.comjxtxzzw.com 两个服务器名字,并对 80 端口的请求全部转发到 443 端口。
    443 端口配置了一些关于 SSL 相关的信息,并且导入了 PHP 相关的配置。
    1557819497443
    同时,还有一个 gitlab.jxtxzzw.com 的虚拟主机,这个配置文件将在下面详述。

    负载均衡简介

    1557900464912
    1557900479572
    1557900487750
    负载均衡转发算法:
    • 轮询(Round Robin):为第一个请求选择列表中的第一个服务器,然后按顺序向下移动列表直到结尾,然后循环
    • 最小连接(Least Connection):优先选择连接数最少的服务器,在普遍会话较长的情况下推荐使用
    • 散列(Hash):根据请求源的 IP 的散列来选择要转发的服务器,这种方式可以一定程度上保证特定用户能链接到相同的服务器
      负载均衡算法:
    • round:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,能自动删除
    • weight:指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况
    • fiar(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配
    • ip_hash:每个请求按访问 IP 的散列结果分配,每个访客固定访问一个后端服务器,可以解决 session 的问题
    • url_hash(第三方):每个请求按 URL 的散列结果分配,不同访客访问相同的服务器
      1557900812070
      预备 Web 服务器环境:
    1. 配置两台 Apache(httpd) 作为 Web 服务器,例如可以使用 XAMPP
    2. XAMPP 的访问日志在 /opt/lampp/logs/access.l
    源文地址:http://www.guoxiongfei.cn/cntech/17058.html