Nginx知识梳理(二)

nginx主配置文件存放在/etc/nginx中。所有的虚拟主机配置文件(也就是 server 配置块的内容)存放在 /etc/nginx/conf.d/ 文件目录中,在主配置文件中已经默认声明了会读取 /etc/nginx/conf.d/ 文件下所有 *.conf 文件。

这样做的目的是为了方便维护我们 server 相关配置,不会让某一个配置文件过于庞大。

补充:更多的执行指令说明可以参考官方说明

nginx实现负载均衡

负载均衡是优化资源的利用率、最大化吞吐量、减少延迟以及确保容错配置的常用技术。通过配置 Nginx 实现负载均衡,提高了 Web 应用程序的可伸缩性和可靠性。

负载均衡的实现主要依赖于反向代理与 upstream 相关模块。

反向代理是指用当前的服务器(一般称为代理服务器)来接受用户的连接请求,然后将请求转发给内部网络中的其它服务器(一般称为上游服务器),并从上游服务器上获得结果返回给用户。

Nginx 有着很强大的高并发、高负载的能力。当客户端发出静态文件请求(例如前端页面)时,Nginx 会作为一个静态 web 服务器直接向客户端提供静态文件服务。当客户端发出不适合 Nginx 提供服务的动态请求时,Nginx 会作为一个反向代理服务器,将请求转发到上游服务器中处理,处理后返回的动态应答再由 Nginx 转发给客户端。

  1. 我们可以先配置一个最简单的负载均衡,如下:
# 如果没有启动 nginx 的话,可以先启动 nginx
$ sudo service nginx start
$ sudo vim /etc/nginx/conf.d/LoadBalance.conf
upstream shiyanlounode {
    # 2 个不同端口的服务地址来模拟多节点运行相同的服务。这里配置了负载均衡的权重,也就是将流量分配的权重设置为 1:10,平均而言在 11 条访问中,会将 1 条访问分配给 8080 端口,剩下的 10 条访问分配给 8081 端口。
     server 127.0.0.1:8080 weight=1;
     server 127.0.0.1:8081 weight=10;
}
# 设置虚拟主机
server {
    # 监听 81 端口
     listen 81;

    # location 块
     location / {
       # 反向代理指令,将所有的请求都发送给 shiyanlounode 机器组中的机器
       proxy_pass http://shiyanlounode;
     }
}

# 创建多个节点来模拟上游服务器
server {
    listen 8080; # 监听 8080 端口,展示 nginx 默认页面
    root /usr/share/nginx/html;
    location / {
        try_files $uri $uri/ =404;
    }
}

server {
    listen 8081; # 监听 8081 端口,展示自定义的页面
    root /home/shiyanlou/html;
    location / {
        try_files $uri $uri/ =404;
    }
}

proxy_pass 便是 HTTP proxy module 中重要配置项,通过该配置项我们可以配置将请求转发给哪一台服务节点、或者哪一个服务群。

当设置转发给某一个节点时,其格式为 proxy_pass http://ip或者域名:端口,例如:

proxy_pass http://192.168.100.2:8080

当需要转发给某一个服务器群时,需要结合 upstream 使用,如上文所示,其格式如下:

upstream 群名字 {
    server ip或者域名:端口;
    server ip或者域名:端口;
    ......
    ......
}

server {
    ...
    ...
    location / {
        proxy_pass 群名字
    }
}

在 /home/cnbugs 目录下创建 html 目录,并在这个目录下新建 index.html 页面:

mkdir /home/cnbugs/html
echo "cnbugs Louplus" > /home/cnbugs/html/index.html

在让配置生效之前检查配置文件是否有误:

# 该命令可以简单检查配置文件中的语法问题
sudo nginx -t

若是无误、会输出 successful 的提示,若是有误、则会提示语法错误的位置,以便于我们根据需求修改。

  1. 在确认配置文件无误之后我们便让配置文件生效:
sudo nginx -s reload

reload 是一个优雅的重新加载配置文件的做法,在不用中断 nginx 服务的情况下使得配置文件生效。

下面首先在浏览器上访问 localhost:81,效果如下:(多次访问地址,应该会轮流出现 nginx 首页和我们自定义的页面,由于浏览器缓存导致效果不明显的话,可以使用 curl 的方式)

如果在浏览器上效果不明显,使用 curl localhost:81 进行访问:

可以看到 nginx 将我们的访问按照一定的比例在 8080 端口和 8081 端口进行分配。

在默认的负载均衡上,nginx 还支持一些调度算法来配置:

  • 最少连接负载均衡:下一个请求被分配给连接数最少的服务器。

配置如下所示:

upstream shiyanlounode {
     least_conn;
     server 127.0.0.1:8080;
     server 127.0.0.1:8081;
    }

加权负载均衡:通过使用权重,来实现负载均衡。

upstream shiyanlounode {
     server 127.0.0.1:8080 weight=3;
     server 127.0.0.1:8081;
    }

ip-hash 负载均衡:将客户端的 IP 地址用作哈希键,以决定服务器组中应该为客户端请求选择什么服务器。此方法可确保来自同一客户端的请求将始终定向到同一服务器,除非此服务器不可用。

upstream shiyanlounode {
     ip_hash;
     server 127.0.0.1:8080;
     server 127.0.0.1:8000;
     server 127.0.0.1:8001;
     server 127.0.0.1:8002;
     server 127.0.0.1:8003;
}

Nginx与PHP搭建服务

Nginx 一般为用户提供静态文件服务,动态的页面服务本身无法提供,Nginx 不像 Apache 默认加载了 php/python 等解释器模块,所以 Nginx 该如何结合 PHP 搭建服务呢?

首先 Nginx 无法解析 PHP,所以必然需要第三方模块,通常 Nginx 通过 fastcgi 将相关的请求发送给 php-fpm,通过 php-fpm 解析后将数据返回,Nginx 再将获取的数据返回给客户端。

注:CGI 是为了保证 web server 传递过来的数据是标准格式,而 fastcgi 是一个提高 cgi 性能的协议,而 php-fpm 是一个实现了该协议,并能够调度 php-cgi 解释器的程序。

$ sudo vim /etc/nginx/conf.d/php.conf

# 添加如下内容
server {
    listen 801;

    root /usr/share/nginx/html;
    index index.php;
    server_name localhost;

    location / {
        try_files $uri $uri/ =404;
    }

    # 用于处理访问的所有 php 页面
    location ~ \.php?.*$ {
        fastcgi_index index.php;

        # 将相关的请求发送给 php7.0-fpm 处理
        fastcgi_pass   unix:/run/php/php7.0-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

发表评论

后才能评论