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 转发给客户端。
- 我们可以先配置一个最简单的负载均衡,如下:
# 如果没有启动 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
的提示,若是有误、则会提示语法错误的位置,以便于我们根据需求修改。
- 在确认配置文件无误之后我们便让配置文件生效:
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;
}
}