简介

​ Nginx是一个开源的轻量级HTTP服务器,主要功能包括反向代理,负载均衡,HTTP服务器和争相代理。其具有占用内存少,并发能力强,可扩展性好等特点

运行架构

​ Nginx 采用多进程模型,由一个主进程和多个工作进程组成。这种设计不仅提高了系统的稳定性,还充分利用了多核 CPU 的性能。

master进程

  1. 启动时检查配置是否正确
  2. 根据配置文件创建并监控wroker进程
  3. 监听端口,接收http请求,并转发给worker进程响应请求
  4. 监听运维命令,并将命令转发给worker

worker进程

  1. 处理master进程接收的http请求
  2. worker进程数量根据又nginx.conf决定
  3. worker进程之间会进行竞争,获胜者处理请求
  4. 接收master进程发送来的命令

编译安装

依赖

1
yum install pcre pcre-devel openssl openssl-devel zlib zlib-devel gzip

编译

1
2
./configure --prefix=/opt/nginx
make && sudo make install

Nginx常用命令

命令 说明
nginx -t 检测nginx.conf语法
nginx -s reload 重新读取nginx.conf(master进程ID不变,worker改变)
nginx -s stop 停止Nginx

Nginx配置说明

区块 说明
events{} nginx性能配置
http{} 用户请求与响应整体功能
server{} 用于响应具体某一个域名
location{} 用于匹配网站具体URL

mime.types

​ 定义可以被Nginx识别处理的媒体文件类型,其他文件类型Nginx默认不解析,直接下载

虚拟主机

​ 通过Nginx实现一台服务器同一个Nginx上运行多个网站

1
2
3
4
5
6
7
8
server {
listen 80; # 监听端口
server_name blog.way.com; # 匹配域名
location / {
root /www/blog/; # 站点存放根目录(绝对路径)
index index.html index.htm; # 主页文件
}
}

反向代理

HTTP反向代理

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
server {
listen 80; # 监听端口
server_name blog.way.com; # 匹配域名
proxy_connect_timeout 180; #与后端建立连接超时时间
proxy_send_timeout 180; #向后端发送请求超时时间
proxy_read_timeout 180; #从后端读取响应超时时间
proxy_set_header Host $host #设置请求头信息(roxy_set_header 选项 内容)
proxy_set_header X-Forwarder-For $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

location /api/ {
proxy_pass http://baidu.com;
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
root /www/blog/;
#过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
expires 30d;
}

#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}

#禁止访问 .htxxx 文件
location ~ /\.ht {
deny all;
}

}

通过location下的proxy_pass参数设置代理目标服务器,同时会将接收到的uri中/api/后面的路径拼接到目标域名上

HTTPS反向代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80; # 监听端口
server_name blog.way.com; # 匹配域名
ssl_certificate cert.pem; #ssl证书文件位置(常见证书文件格式为:crt/pem)
ssl_certificate_key cert.key; #ssl证书key位置

#ssl配置参数(选择性配置)
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
#数字签名,此处使用MD5
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /root; #定义服务器的默认网站根目录位置
index index.html index.htm; #定义首页索引文件的名称
proxy_pass http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表
}
}

负载均衡

1
2
3
4
5
6
7
8
9
10
11
12
13
upstream server{
server 192.168.122.101 weight=5; # weight为权重,越大优先级越高
server 192.168.122.102 weight=1;

}
# 虚拟主机配置, 用于响应具体网站
server {
listen 80;
server_name master.com;
location / {
proxy_pass http://server;
}
}

负载均衡策略

轮询

不设置权重,默认所有服务器权重都为1

1
2
3
4
5
upstream bck_testing_01 {
# 默认所有服务器权重为 1
server 192.168.122.101
server 192.168.122.102
}

加权轮训

通过IP后面通过weight添加权重,权重越大优先级越高

1
2
3
4
upstream bck_testing_01 {
server 192.168.122.101 weight=1
server 192.168.122.102 weight=5
}

最少连接

优先将请求分配给活跃连接数最少的服务器

1
2
3
4
5
upstream bck_testing_01 {
least_conn;
server 192.168.122.101
server 192.168.122.102
}

加权最少连接

结合权重和最少连接数,优先分配给(连接数/权重)最小的服务器

1
2
3
4
5
upstream bck_testing_01 {
least_conn;
server 192.168.122.101 weight=1
server 192.168.122.102 weight=5
}

IP Hash

将请求IP地址计算为哈希值,将同一IP请求分配给同一服务器

1
2
3
4
5
upstream bck_testing_01 {
ip_hash;
server 192.168.122.101
server 192.168.122.102
}