Nginx入门小结

前言

还记得第一次接触Nginx是好几个月以前为了部署一个前端网站,当时简单的学了学Nginx的基本操作,到现在有挺长一段时间,回过头发现学过的早已忘了个干净。老话说的好,好记性不如烂笔头,这篇文章就总结一下Nginx的一些基础入门知识。

Nginx 简介

Nginx 是一个高性能的 HTTP 和反向代理服务器,以高稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

Nginx 进程间的关系

部署 Nginx 都是使用一个 master 进程来管理多个 worker 进程。如图所示(摘自《深入理解Nginx》):

nginx_process

一般情况下 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
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
user nginx;
# work 进程个数设置,这里为自动,即为当前CPU的核心数
worker_processes auto;
# 错误日志的设置
error_log /var/log/nginx/error.log;
# 保存 master进程 ID的pid文件存放路径
pid /run/nginx.pid;

# include配置项可以将其他配置文件嵌入到当前的 nginx.conf文件中
include /usr/share/nginx/modules/*.conf;

# 事件模块配置
events {
# 每个work进程可以同时处理的最大连接数
worker_connections 1024;
}
# http 模块
http {
# 定义日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;
# 启用Linux 上的 sendfile 系统调用来发送文件
sendfile on;

tcp_nopush on;
tcp_nodelay on;
# keepalive 超时时间
keepalive_timeout 65;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/vhost/*.conf;

# 虚拟主机
server {
# 监听端口,default_server的意思是将所在的server块作为整个 Web服务的默认Server块,即默认虚拟主机
listen 80 default_server;
# 如果是 IPv6地址,使用如下
listen [::]:80 default_server;
# 主机名称
server_name _;
# 设置资源路径,比如存在网页的路径
root /home/web;

include /etc/nginx/default.d/*.conf;
# location 可以根据用户请求中的URI来匹配 /uri 表达式,如果可以配置,就选择location {} 块中的配置来处理请求
# 下面这个 location / 表示会匹配所有的HTTP请求
location / {
}
# 根据HTTP返回码重定向页面,比如 404 重定向到 /404.html
error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}

Nginx主要应用场合

1. 静态HTTP服务器

Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端,一个简单配置如下:

1
2
3
4
5
6
server {
listen 80; # 端口号
location / {
root /usr/share/nginx/html; # 静态文件路径
}
}

有时候我们会遇到nginx部署好了,但是却无法访问css/js/图片等资源,这个时候我们需要再加一个 location配置:

1
2
3
4
5
6
7
8
location ~ .*\.(js|css|png|jpg|gif)$   
{
root /usr/share/nginx/html; #站点根目录
if (-f $request_filename) {
expires 1d;
break;
}
}

2. 反向代理

反向代理方式是 指用代理服务器来接收Internet 上的连接请求,然后将请求转发给内部网络中的上游服务器,并将上从上游服务器上得到的结果返回给 Internet上请求连接的客户端,此时代理服务器对外的表现就是一个 Web服务器,如下图所示(摘自《深入理解Nginx》)

nginx_proxy

配置示例如下:

1
2
3
4
5
6
server {
listen 80;
location / {
proxy_pass http://192.168.20.1:8080; # 应用服务器HTTP地址
}
}

发送到Nginx上的HTTP请求将转发到上游服务器 http://192.168.20.1:8080

2. 负载均衡

如果一个网站访问量非常大,一台服务器不够用了,简单的方法是将相同的应用部署在多台服务器上,将大量的用户请求分配给多台机器处理,这就是所谓的负载均衡。

Nginx可以通过反向代理来实现负载均衡:

nginx_load_balance

Nginx的负载均衡是通过 upstream模块来实现的,内置了三种负载策略,官网负载均衡配置说明地址: https://nginx.org/en/docs/http/load_balancing.html

  1. 轮询(round-robin 默认):Nginx根据请求次数,将每个请求均匀分配到每台服务器上
1
2
3
4
5
6
7
8
9
10
11
12
upstream myapp {
# server指定上游服务器的名字
server 192.168.20.1:8080; # 应用服务器1
server 192.168.20.2:8080; # 应用服务器2
}
server {
listen 80;
location / {
# 反向代理的配置,将请求反向代理到指定的服务器上
proxy_pass http://myapp;
}
}
  1. 最少连接(least-connected): 将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。
1
2
3
4
5
6
7
8
9
10
11
12
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
  1. IP Hash: 绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    upstream myapp2 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
    }
    server {
    listen 80;
    location / {
    proxy_pass http://myapp2;
    }
    }
  2. 权重负载均衡: 轮询的加强版,每台服务器指定权重参数,进而指定了每台服务器的轮询比率

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    upstream myapp3 {
    server srv1.example.com weight=3;
    server srv2.example.com;
    server srv3.example.com;
    }
    server {
    listen 80;
    location / {
    proxy_pass http://myapp3;
    }
    }

参考资料 & 鸣谢

Bagikan Komentar