出于好记性不如烂笔头的想法,我开启这篇文章(笔记)。

Nginx使用场景一般有静态资源WEB服务代理服务负载均衡缓存服务

快速查找nginx.conf文件位置

1
locate nginx.conf

查找Nginx.conf文件位置,并检验配置文件是否合法

1
nginx -t

得到如下:

1
2
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重启Nginx

1
nginx -s reload

指定配置文件启动Nginx

1
nginx -c /etc/nginx/nginx.conf
Nginx ssl证书配置
1
2
3
4
5
6
7
8
9
10
11
12
http {
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
server {
# ssl参数
listen 443 ssl;
server_name zouyifeng.xyz;
# 证书文件
ssl_certificate /etc/nginx/ssl/zouyifeng.nginx.crt;
# 私钥文件
ssl_certificate_key /etc/nginx/ssl/zouyifeng.nginx.key;
#...

证书文件会作为公用实体發送到每台连接到服务器的客戶端,私钥文件作为安全实体,应该被存放在具有一定权限限制的目录文件,并保证 Nginx 主进程有存取权限。

Nginx端口转发

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
// 当通过 a.zouyifeng.xyz:80 端口访问这个服务器时
// 该请求会被转发到 127.0.0.1:8080
server {
listen 80;
server_name a.zouyifeng.xyz;
// 通过访问的路径来处理转发 ...
location / {
proxy_pass http://127.0.0.1:8080;
}
}

// 当通过 b.zouyifeng.xyz:80 端口访问这个服务器时
// 该请求会被转发到 127.0.0.1:8081

# 负载均衡池
upstream movie_pool{
server 127.0.0.1:8081;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
server 127.0.0.1:8084;
}

server {
listen 80;
server_name b.zouyifeng.xyz;
// 通过访问的路径来处理转发 ...
location / {
proxy_pass http://movie_pool;
}
}
减少 CPU 运算量

SSL的运行计算需要消耗额外的CPU资源,一般多核处理器系统会运行多个工作进程(worker processes ),进程的数量不会少于可用的CPU核数。SSL通讯过程中「握手」阶段的运算最占用CPU资源,有两个方法可以减少每台客户端的运算量:

· 激活keepalive长连接,一个连接发送更多个请求

· 复用SSL会话参数,在并行并发的连接数中避免进行多次SSL『握手』

这些会话会存储在一个SSL会话缓存里面,通过命令ssl_session_cache配置,可以使缓存在机器间共享,然后利用客戶端在「握手」阶段使用的seesion id去查询服务端的session cathe(如果服务端设置有的话),简化「握手」阶段。

1M 的会话缓存大概包含4000個会话,默认的缓存超时时间为 5 分钟,可以通过使用ssl_session_timeout命令设置缓存超时时间。下面是一個拥有10M共享会话缓存的多核系统优化配置。

日志轮转配置文件,Nginx日志轮转,用于logrotate服务的日志切割

1
/etc/logrotate.d/nginx

配置文件,设置http协议的Content的Content-type与扩展名对应关系

1
/etc/Nginx/mime.types

Nginx缓存目录

1
/var/cache/Nginx

Nginx的日志目录

1
/var/log/Nginx

配置过期时间

1
2
3
4
location ~ .*\.(html|htm)$ {
expires 24h;
root /etc/app;
}

添加过期属性设置后,报文头信息新增cache-control:max-age=86400,不过浏览器可能会有不一样的request header,例如忽略cache-control:max-age=86400,再次请求服务器,选择协商缓存的形式

配置访问控制

基于ip的访问控制 http_access_module

location ~ ^/index.html {
deny 119.128.189.17;
allow all;
}
禁止119.128.189.17的访问并允许其他ip访问

location ~ ^/index.html {
allow 119.128.189.0/24;
deny all;
}
允许119.128.189.0/24的IP段的访问并拒绝其他IP访问

局限:无法真正限制客户端IP,可能只限制住客户端的代理IP,所以Nginx记录中remote_addr不准确

http_x_forward_for = Client IP,Proxy(1),IP,Proxy(2)IP,则可以记录整个请求经过的代理服务器的IP

基于用户的信任登录 http_auth_basic_module

跨站访问

1
2
3
4
5
location ~ .*\.(html|htm)$ {
add_header Access-Control-Allow-Origin http://www.zouyifeng.xyz;
add_header Access-Control-Allow-Methods GET,POST,PUT;
root /etc/app;
}

防盗链

1
2
3
4
5
6
location ~ .*\.(jpg|gif)$ {
valid_referers none blocked 119.128.189.0;
if ($invalid_referer) {
return 403
}
}

none 表示允许没有referer信息的
blocked 表示允许没有协议信息的
IP 允许固定的IP访问

如果满足valid_referer,$invalid_referer则为0,反之则为1

代理服务

Nginx可实现http server、mail server、http server、media server等代理服务

正向代理和反向代理的区别在对象不一样

正向代理代理的对象是客户端,如翻墙,
反向代理代理的对象是服务端,代理服务设置在服务器中,客户端也无需关心实际访问的哪台服务器

Nginx中实现代理主要利用proxy_pass

netstat -luntp | grep nginx

proxy_buffering 打开缓冲区,减少io损耗

proxy_set_header Nginx代理往后端服务发送请求时添加代理的头信息

负载均衡

根据地域模型划分

  1. 全局负载均衡 GSLB (Global Server Load Balance),实现CDN的全局负载均衡的调度机制,最常用的基于DNS的GSLB,
  2. 负载均衡 SLB (Server Load Balance),包含用户节点调度节点服务节点,Nginx是典型的SLB

cdn要确保传输延时的最小化,cdn实际上就是通过DNS智能域名解析,请求解析到最近的静态服务器节点
cdn

DNS、cdn、Nginx



DNS工作流程
DNS工作流程

域名解析
域名解析

Nginx 通过proxy_pass,对upstream里的服务进行轮询
负载均衡调度状态:
Nginx

1
2
3
4
5
upstream movie_pool{
server 127.0.0.1:8081 down;
server 127.0.0.1:8082 backup;
server 127.0.0.1:8083 max_fails=1 fail_timeout=10s;
}

调度算法,包括静态算法(轮询,加权轮询,ip hash)和动态算法(最小连接,加权最小连接)

缓存

大致分为三类型缓存:服务端缓存代理缓存客户端缓存

如Nginx中涉及的缓存是代理缓存,浏览器中的缓存是客户端缓存,客户端缓存则是指redis

利用Nginx的proxy_cacheproxy_cache_pathproxy_cache_valid,指定缓存位置,空间等,缓存时间,对于静态文件进行缓存处理,减少服务器请求压力

哈希得到的目录路径

可以看出此处缓存了的是HTML文件

Nginx此处把URL以及相关组合当做key,用MD5算法对key进行哈希,得出硬盘上对应的哈希目录路径,且将缓存内容(动态或静态)保存到该目录。