前言
还记得第一次接触Nginx是好几个月以前为了部署一个前端网站,当时简单的学了学Nginx的基本操作,到现在有挺长一段时间,回过头发现学过的早已忘了个干净。老话说的好,好记性不如烂笔头,这篇文章就总结一下Nginx的一些基础入门知识。
Nginx 简介
Nginx 是一个高性能的 HTTP 和反向代理服务器,以高稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
Nginx 进程间的关系
部署 Nginx 都是使用一个 master 进程来管理多个 worker 进程。如图所示(摘自《深入理解Nginx》):
一般情况下 work 进程的数量与服务器上的 CPU核心数相同。比如我的阿里云学生机的CPU 核数为1:1
2[root@iZm5e0f6iuu51nhx8oi2j6Z ~]# cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores : 1
那么对应我在学生机上装的Nginx的 work进程数量也为1,下面查看 Nginx 的运行状态:1
2
3
4
5
6
7
8
9
10
11[root@iZm5e0f6iuu51nhx8oi2j6Z ~]# systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2018-11-15 15:12:20 CST; 27min ago
Process: 2072 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
Process: 2069 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
Process: 2068 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
Main PID: 2075 (nginx)
CGroup: /system.slice/nginx.service
├─2075 nginx: master process /usr/sbin/nginx
└─2076 nginx: worker process
从上面可以看出我启动 的Nginx的work进程数只有一个,此时一个 master进程管理一个 worker进程。当然我们也可以通过 ps -ef
命令来查看 nginx服务,得到的结果是一样的,进程ID为 2075的master进程,进程ID为 2076的work进程1
2
3
4[root@iZm5e0f6iuu51nhx8oi2j6Z ~]# ps -ef | grep nginx
root 2075 1 0 15:12 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 2076 2075 0 15:12 ? 00:00:00 nginx: worker process
root 2261 1871 0 15:40 pts/0 00:00:00 grep --color=auto nginx
总结一下 work进程和master进程的作用:
- master进程: 负责监控管理 work进程,同时为管理员提供命令服务,比如启动服务,停止服务等,通常利用root用户启动 master进程
- work进程: 真正提供互联网服务
Nginx 配置
Nginx服务器的功能主要是由一些官方模块或者第三方模块来实现的。Nginx提供了一些核心模块,比如ngx_http_module
模块等。
在安装Nginx的过程找那个,我们已经把很多模块编译进 Nginx中了,但是否启用这些模块,一般取决于配置文件中相应的配置项。
下面来解读下Nginx中的配置文件 nginx.conf
1 | user nginx; |
Nginx主要应用场合
1. 静态HTTP服务器
Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端,一个简单配置如下:1
2
3
4
5
6server {
listen 80; # 端口号
location / {
root /usr/share/nginx/html; # 静态文件路径
}
}
有时候我们会遇到nginx部署好了,但是却无法访问css/js/图片等资源,这个时候我们需要再加一个 location配置:1
2
3
4
5
6
7
8location ~ .*\.(js|css|png|jpg|gif)$
{
root /usr/share/nginx/html; #站点根目录
if (-f $request_filename) {
expires 1d;
break;
}
}
2. 反向代理
反向代理方式是 指用代理服务器来接收Internet 上的连接请求,然后将请求转发给内部网络中的上游服务器,并将上从上游服务器上得到的结果返回给 Internet上请求连接的客户端,此时代理服务器对外的表现就是一个 Web服务器,如下图所示(摘自《深入理解Nginx》)
配置示例如下:1
2
3
4
5
6server {
listen 80;
location / {
proxy_pass http://192.168.20.1:8080; # 应用服务器HTTP地址
}
}
发送到Nginx上的HTTP请求将转发到上游服务器 http://192.168.20.1:8080
2. 负载均衡
如果一个网站访问量非常大,一台服务器不够用了,简单的方法是将相同的应用部署在多台服务器上,将大量的用户请求分配给多台机器处理,这就是所谓的负载均衡。
Nginx可以通过反向代理来实现负载均衡:
Nginx的负载均衡是通过 upstream
模块来实现的,内置了三种负载策略,官网负载均衡配置说明地址: https://nginx.org/en/docs/http/load_balancing.html
- 轮询(round-robin 默认):Nginx根据请求次数,将每个请求均匀分配到每台服务器上
1 | upstream myapp { |
- 最少连接(least-connected): 将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。
1 | upstream myapp1 { |
IP Hash: 绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理
1
2
3
4
5
6
7
8
9
10
11
12upstream myapp2 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp2;
}
}权重负载均衡: 轮询的加强版,每台服务器指定权重参数,进而指定了每台服务器的轮询比率
1
2
3
4
5
6
7
8
9
10
11upstream myapp3 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp3;
}
}