Glittering's blog Glittering's blog
Home
  • 学习手册

    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)

Glitz Ma

前端开发工程师
Home
  • 学习手册

    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)
  • 技术文档

    • Nginx使用手册
      • nginx相关知识
        • 系统
        • nginx优势
        • nginx版本
        • 配置文件及用途
        • cgi配置文件
        • 编码转换映射转化文件
        • 扩展名文件
        • 守护进程管理
        • nginx模块目录
        • nginx的手册和帮助文件
        • nginx服务的启动管理的可执行文件
        • nginx内容配置
        • nginx配置语法
        • 全局和服务配置
        • 事件配置
        • http配置
        • server配置
        • Systemd配置
        • 配置目录
        • systemctl
        • 启动和重新加载
        • 日志相关
        • 核心模块
        • 静态资源Web服务
        • CDN
        • 配置语法
        • 浏览器缓存
        • 跨域
        • 防盗链
        • 代理服务
        • 负载均衡
        • 缓存
        • rewrite
    • shell基础知识
    • linux常用命令
    • HTTP协议详解
    • Markdown使用教程
    • npm常用命令
    • Git使用手册
    • npm packageJson属性详解
    • yaml语言教程
    • 现代前端技术解析读后感
    • nodejs学习日记1
    • nodejs学习日记2
  • 算法

  • 工作总结

  • 实用技巧

  • 收藏夹

  • 技术
  • 技术文档
mamingjuan
2017-12-07
目录

Nginx使用手册

# nginx相关知识

# 系统

CENTOS>=7.0,位数 X64 CENTOS 7.2

# nginx优势

  • IO多路复用 多个描述符的IO操作都能在一个线程里并发交替顺序完成,复用线程.
    Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。
    接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理这个连接。
    master 进程能监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。
    worker 进程数,一般会设置成机器 cpu 核数。因为更多的worker 数,只会导致进程相互竞争 cpu,从而带来不必要的上下文切换。
    使用多进程模式,不仅能提高并发率,而且进程之间相互独立,一个 worker 进程挂了不会影响到其他 worker 进程。

  • CPU亲和 把CPU内核和nginx的工作进程绑定在一起,让每个worker进程固定在一个CPU上执行,从而减少CPU的切换并提高缓存命中率,提高 性能

  • sendfile 零拷贝传输模式
    默认配置下,Nginx 读取本地文件后,在进行网络传输时会先将硬盘文件从硬盘中读取到 Nginx 的文件缓冲区中,操作流程为:硬盘 → 内核文件缓冲区 → 应用缓冲区。然后将 Nginx 文件缓冲区的数据写入网络接口,操作流程:应用缓冲区 → 内核网络缓冲区 → 网络接口。

    Nginx 的本地文件在进行网络传输的过程中,经历了上述读取与写入两个操作过程,两次操作都在内核缓冲区中存储了相同的数据。为了提高文件的传输效率,内核提供了零复制技术,该技术支持文件在内核缓冲区内直接交换打开的文件句柄,无须重复复制文件内容到缓冲区,则上述两个操作的流程变为:硬盘 → 内核文件缓冲区 → 内核网络缓冲区 → 网络接口。

    零复制技术减少了文件的读写次数,提升了本地文件的网络传输速度。内核缓冲区的默认大小为 4096B。

# nginx版本

  • Mainline version 开发版
  • Stable version 稳定版
  • Legacy versions 历史版本

nginx下载地址 (opens new window) nginx linux package (opens new window)

CentOS下YUM安装
路径:/etc/yum.repos.d/nginx.repo
文件内容:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
1
2
3
4
5

命令:

yum install nginx -y
nginx -v
nginx -V
1
2
3

# 配置文件及用途

查看配置文件和目录

rpm -ql nginx
1

配置文件及用途

类型 路径 用途
配置文件 /etc/logrotate.d/nginx 用于logrotate服务的日志切割
配置文件 /etc/nginx /etc/nginx/nginx.conf /etc/nginx/conf.d /etc/nginx/conf.d/default.conf 主配置文件
配置文件 /etc/nginx/fastcgi_params /etc/nginx/scgi_params /etc/nginx/uwsgi_params cgi配置,fastcgi配置
配置文件 /etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/win-utf 编码转换映射转化文件
配置文件 /etc/nginx/mime.types 设置http协议的Content-Type与扩展名对应关系
配置文件 /usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service /etc/sysconfig/nginx /etc/sysconfig/nginx-debug 用于配置系统守护进程管理器管理方式
配置文件 /etc/nginx/modules /usr/lib64/nginx/modules nginx模块目录
命令 /usr/share/doc/nginx-1.14.0 /usr/share/doc/nginx-1.14.0/COPYRIGHT nginx的手册和帮助文件
目录 /var/cache/nginx nginx的缓存目录
目录 /var/log/nginx nginx的日志目录

安装目录和路径

--prefix=/etc/nginx # 安装目录
--sbin-path=/usr/sbin/nginx # 可执行文件
--modules-path=/usr/lib64/nginx/modules # 安装模块
--conf-path=/etc/nginx/nginx.conf  # 配置文件路径
--error-log-path=/var/log/nginx/error.log  # 错误日志
--http-log-path=/var/log/nginx/access.log  # 访问日志
--pid-path=/var/run/nginx.pid # 进程ID
--lock-path=/var/run/nginx.lock # 加锁对象
1
2
3
4
5
6
7
8

执行对应模块时,nginx所保留的临时性文件

--http-client-body-temp-path=/var/cache/nginx/client_temp # 客户端请求体临时路径
--http-proxy-temp-path=/var/cache/nginx/proxy_temp # 代理临时路径
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 
--http-scgi-temp-path=/var/cache/nginx/scgi_temp 
1
2
3
4
5

设置nginx进程启动的用户和用户组

--user=nginx   # 指定用户
--group=nginx  # 指定用户组
1
2

设置额外的参数将被添加到CFLAGS变量,CFLAGS变量用来存放C语言编译时的优化参数

--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong 
1

设置链接文件参数,链接系统库。
定义要传递到C链接器命令行的其他选项。
PCRE库,需要指定–with-ld-opt="-L /usr/local/lib"

--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
1

其它参数

--with-compat 
--with-file-aio 
--with-threads 
--with-http_addition_module 
--with-http_auth_request_module 
--with-http_dav_module 
--with-http_flv_module 
--with-http_gunzip_module 
--with-http_gzip_static_module 
--with-http_mp4_module 
--with-http_random_index_module 
--with-http_realip_module 
--with-http_secure_link_module 
--with-http_slice_module 
--with-http_ssl_module 
--with-http_stub_status_module 
--with-http_sub_module 
--with-http_v2_module 
--with-mail 
--with-mail_ssl_module 
--with-stream 
--with-stream_realip_module 
--with-stream_ssl_module 
--with-stream_ssl_preread_module 
--param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' 
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

主要的配置文件

/etc/nginx/nginx.conf # 核心配置文件
/etc/nginx/conf.d/*.conf # 包含conf.d目录下面的所有配置文件
/etc/nginx/conf.d/default.conf # 默认http服务器配置文件
1
2
3

# cgi配置文件

  • CGI是common gateway interface(通用网关接口)
  • Web Server 通过cgi协议可以把动态的请求传递给如php、jsp、python和perl等应用程序
  • FastCGI 实际上是增加了一些扩展功能的 CGI ,是 CGI 的改进,描述了客户端和Web服务器程序之间传输数据的一种标准。
  • SCGI协议是一个CGI(通用网关接口)协议的替代品· 它是一个应用与HTTP服务器的接口标准,类似于FastCGI,但是它设计得更为容易实现
  • uwsgi是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议
路径 用途
/etc/nginx/fastcgi_params fastcgi配置
/etc/nginx/scgi_params scgi配置
/etc/nginx/uwsgi_params uwsgi配置

# 编码转换映射转化文件

  • 这三个文件都是与编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码
  • koi8-r是斯拉夫文字8位元编码,供俄语及保加利亚语使用。在Unicode未流行之前,KOI8-R 是最为广泛使用的俄语编码,使用率甚至起ISO/IEC 8859-5还高。这3个文件存在是因为作者是俄国人的原因。
路径 用途
/etc/nginx/koi-utf koi8-r <--> utf-8
/etc/nginx/koi-win koi8-r <--> windows-1251
/etc/nginx/win-utf windows-1251 < -- > utf-8

# 扩展名文件

/etc/nginx/mime.types 设置http协议的Content-Type与扩展名对应关系

# 守护进程管理

用于配置系统守护进程管理器管理方式

路径
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
systemctl restart nginx.service
1

# nginx模块目录

/etc/nginx/modules最基本的共享库和内核模块。
目的是存放用于启动系统和执行root文件系统的命令的如/bin和/sbin的二进制文件的共享库,或者存放32位,或者64位(file命令查看) /usr/lib64/nginx/modules 64位共享库

# nginx的手册和帮助文件

路径 用途
/usr/share/doc/nginx-1.14.2 帮助文档
/usr/share/doc/nginx-1.14.0/COPYRIGHT 版权声明
/usr/share/man/man8/nginx.8.gz 手册

# nginx服务的启动管理的可执行文件

路径 用途
/usr/sbin/nginx 可执行命令
/usr/sbin/nginx-debug 调试执行可执行命令

# nginx内容配置

# nginx配置语法

# 使用#可以添加注释,使用$符号可以使用变量
# 配置文件由指令与指令块组成,指令块以{}将多条指令组织在一起
http {
# include语句允许把多个配置文件组合起来以提升可维护性    
    include       mime.types;
# 每条指令以;(分号)结尾,指令与参数之间以空格分隔
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
# 有些指令可以支持正则表达式        
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 全局和服务配置

分类 配置项 作用
全局 user 设置nginx服务的系统使用用户
全局 worker_processes 工作进程数,一般和CPU数量相同
全局 error_log nginx的错误日志
全局 pid nginx服务启动时的pid

# 事件配置

分类 配置项 作用
events worker_connections 每个进程允许的最大连接数 10000
events use 指定使用哪种模型(select/poll/epoll),建议让nginx自动选择,linux内核2.6以上一般能使用epoll,提高性能。

# http配置

配置的文件/etc/nginx/nginx.conf,一个HTTP下面可以配置多个server。

user  nginx;   # 设置nginx服务的系统使用用户  
worker_processes  1;  # 工作进程数,一般和CPU数量相同 

error_log  /var/log/nginx/error.log warn;   # nginx的错误日志  
pid        /var/run/nginx.pid;   # nginx服务启动时的pid

events {
    worker_connections  1024; # 每个进程允许的最大连接数 10000
}

http {
    include       /etc/nginx/mime.types; # 文件后缀和类型类型的对应关系
    default_type  application/octet-stream; # 默认content-type

    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; # 默认访问日志

    sendfile        on; # 启用sendfile
    #tcp_nopush     on; # 懒发送

    keepalive_timeout  65; # 超时时间是65秒

    #gzip  on;gzip压缩

    include /etc/nginx/conf.d/*.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

# server配置

文件为/etc/nginx/conf.d/default.conf,一个server下面可以配置多个location。

server {
    listen       80;  # 监听的端口号
    server_name  localhost;  # 用域名方式访问的地址

    #charset koi8-r; # 编码
    #access_log  /var/log/nginx/host.access.log  main;  # 访问日志文件和名称

    location / {
        root   /usr/share/nginx/html;  # 静态文件根目录
        index  index.html index.htm;  # 首页的索引文件
    }

    #error_page  404              /404.html;  # 指定错误页面

    # redirect server error pages to the static page /50x.html
    # 把后台错误重定向到静态的50x.html页面
    error_page   500 502 503 504  /50x.html; 
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    # 代理PHP脚本到80端口上的apache服务器
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    # 把PHP脚本9000端口上监听的FastCGI服务
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    # 不允许访问.htaccess文件
    # location ~ /\.ht {
    #     deny  all;
    # }
}
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

# Systemd配置

系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其他进程,根据管理,字母d是守护进程(daemon)的缩写。

# 配置目录
配置目录 用途
/usr/lib/systemd/system 每个服务最主要的启动脚本设置,类似于之前的/etc/initd.d
/run/system/system 系统执行过程中所产生的服务脚本,比上面的目录优先运行
/etc/system/system 管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行,在三者之中,此目录优先级最高
# systemctl

配置nginx的systemctl命令 (opens new window)

  • 监视和控制systemd的主要命令是systemctl
  • 该命令可用于查看系统状态和管理系统及服务
命令:systemctl  command name.service
启动:service name start –> systemctl start name.service
停止:service name stop –> systemctl stop name.service
重启:service name restart –> systemctl restart name.service
状态:service name status –> systemctl status name.service
1
2
3
4
5

# 启动和重新加载

systemctl restart nginx.service
systemctl reload nginx.service
nginx -s reload
1
2
3

# 日志相关

/var/log/nginx/access.log 访问日志 /var/log/nginx/error.log 错误日志

  • log_format
类型 用法
语法 log_format name [escape=default[json] string]
默认 log_format combined ...
Context http

log_format例子 (opens new window)
ngx_http_log_module (opens new window) 内置变量

名称 含义
$remote_addr 客户端地址
$remote_user 客户端用户名称
$time_local 访问时间和时区
$request 请求行
$status HTTP请求状态
$body_bytes_sent 发送给客户端文件内容大小
  • HTTP请求变量

注意要把-转成下划线,比如User-Agent对应于$http_user_agent

名称 含义 例子
arg_PARAMETER 请求参数 $arg_name
http_HEADER 请求头 $http_referer $http_host $http_user_agent $http_x_forwarded_for(代理过程)
sent_http_HEADER 响应头 sent_http_cookie

IP1->IP2(代理)->IP3 会记录IP地址的代理过程

http_x_forwarded_for=Client IP,Proxy(1) IP,Proxy(2) IP

定义日志格式

 # 定义一种日志格式 
 log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

 log_format  zfpx  '$arg_name $http_referer sent_http_date"';
 # 指定写入的文件名和日志格式
 access_log  /var/log/nginx/access.log  main;    
1
2
3
4
5
6
7
8

查看日志

tail -f /var/log/nginx/access.log

221.216.143.110 - - [09/Jun/2018:22:41:18 +0800] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36" "-"
1
2
3

# 核心模块

  • 监控ngin客户端的状态 模块名:--with-http_stub_status_module
Syntax: stub_status on/off;
Default: -
Context: server->location
1
2
3

实战
文件:/etc/nginx/conf.d/default.conf

server {
+    location /status{
+       stub_status  on;
+    }
1
2
3
4
systemctl reload nginx.service

http://192.171.207.104/status

Active connections: 2            
server accepts handled requests  
 3 3 10 
Reading: 0 Writing: 1 Waiting: 1 
1
2
3
4
5
6
7
8
参数 含义
Active connections
accepts 总共处理的连接数
handled 成功创建握手数
requests 总共处理请求数
Reading 读取到客户端的Header信息数
Writing 返回给客户端的Header信息数
Waiting 开启keep-alive的情况下,这个值等于 active – (reading + writing)
  • 在根目录里随机选择一个主页显示

模块名:--with-http_random_index_module

Syntax: random_index on/off;
Default: off
Context: location
1
2
3

实战
/etc/nginx/conf.d/default.conf

+    location / {
+       root /opt/app;
+       random_index on;
+    }
1
2
3
4
  • 内容替换
    模块名:--with-http_sub_module
文本替换
Syntax: sub_filter string replacement;
Default: --
Context: http,service,location

只匹配一次
Syntax: sub_filter_once on|off;
Default: off
Context: http,service,location
1
2
3
4
5
6
7
8
9

实战
文件位置:/etc/nginx/conf.d/default.conf

location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
+        sub_filter 'world' 'mamingjuan';
+        sub_filter_once off;
    }
1
2
3
4
5
6
  • 请求限制
    模块名
    --with-limit_conn_module 连接频率限制
    --with-limit_req_module 请求频率限制
    一次TCP请求至少产生一个HTTP请求
    SYN > SYN,ACK->ACK->REQUEST->RESPONSE->FIN->ACK->FIN->ACK

ab

Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx、lighthttp、IIS等其它Web服务器的压力。 其中-n 总共的请求数、-c 并发的请求数。

ab -n 40 -c 20 http://127.0.0.1/
1

请求限制
模块:limit_req_zone

# 可以以IP为key zone为空间的名称 size为申请空间的大小
Syntax: limit_req_zone key zone=name:size rate=rate;   
Default: --
Context: http(定义在server以外)
1
2
3
4

模块:limit_req

# zone名称 number限制的数量
Syntax: limit_req  zone=name [burst=number] [nodelay];
Default: --
Context: http,server,location
1
2
3
4

案例

limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
server {
  location /{
      limit_req req_zone;
      # 缓存区队列burst=3个,不延期,即每秒最多可处理rate+burst个.同时处理rate个
      limit_req zone=req_zone burst=3 nodelay;
  }
}
1
2
3
4
5
6
7
8

$binary_remote_addr 表示远程的IP地址
zone=req_zone:10m 表示一个内存区域大小为10m,并且设定了名称为req_zone
rate=1r/s 表示请求的速率是1秒1个请求

zone=req_zone 表示这个参数对应的全局设置就是req_zone的那个内存区域

burst=3 表示请求队列的长度
nodelay 表示不延时

连接限制

模块:limit_conn_zone

# 可以以IP为key zone为空间的名称 size为申请空间的大小
Syntax: limit_conn_zone key zone=name:size;   
Default: --
Context: http(定义在server以外)
1
2
3
4

模块:limit_conn

# zone名称 number限制的数量
Syntax: limit_conn  zone number;
Default: --
Context: http,server,location
1
2
3
4

案例

limit_conn_zone $binanry_remote_addr zone=conn_zone:1m;
server {
  location /{
      limit_conn conn_zone 1;
  }
}
1
2
3
4
5
6

表明以ip为key,来限制每个ip访问文件时候,最多只能有一个在线,否则其余的都要返回不可用

  • 访问控制
    基于IP的访问控制 -http_access_module
    基于用户的信任登录 -http_auth_basic_module

模块:http_access_module

Syntax: allow address|all;
Default: --
Context: http,server,location,limit_except


Syntax: deny address|CIDR|all;
Default: --
Context: http,server,location,limit_except
1
2
3
4
5
6
7
8
server {
+ location ~ ^/admin.html{
+      deny 192.171.207.100;
+      allow all;
+    }
}    

server {
+ location ~ ^/admin.html{
+    if ($http_x_forwarded_for !~* "^8\.8\.8\.8") {
+       return 403;
+    }
}  
1
2
3
4
5
6
7
8
9
10
11
12
13
符号 含义
= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。
~ 为区分大小写匹配(可用正则表达式)
!~ 为区分大小写不匹配
~* 为不区分大小写匹配(可用正则表达式)
!~* 为不区分大小写不匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。

模块:http_auth_basic_module

Syntax: auth_basic string|off;
Default: auth_basic off;
Context: http,server,location,limit_except

Syntax: auth_basic_user_file file;
Default: -;
Context: http,server,location,limit_except
1
2
3
4
5
6
7
htpasswd -c /etc/nginx/users.conf zhangsan
1
server {
+    auth_basic '请登录';
+    auth_basic_user_file /etc/nginx/users.conf;
1
2
3

# 静态资源Web服务

静态资源:一般客户端发送请求到web服务器,web服务器从内存在取到相应的文件,返回给客户端,客户端解析并渲染显示出来。
动态资源:一般客户端请求的动态资源,先将请求交于web容器,web容器连接数据库,数据库处理数据之后,将内容交给web服务器,web服务器返回给客户端解析渲染处理。

类型 种类
浏览器渲染 HTML、CSS、JS
图片 JPEG、GIF、PNG
视频 FLV、MPEG
下载文件 Word、Excel

# CDN

CDN的全称是Content Delivery Network,即内容分发网络。
CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

# 配置语法

sendfile不经过用户内核发送文件

类型 种类
语法 sendfile on / off
默认 sendfile off;
上下文 http,server,location,if in location

tcp_nopush 在sendfile开启的情况下,提高网络包的传输效率

类型 种类
语法 tcp_nopush on / off
默认 tcp_nopush off;
上下文 http,server,location

tcp_nodelay 在keepalive连接下,提高网络包的传输实时性

类型 种类
语法 tcp_nodelay on / off
默认 tcp_nodelay on;
上下文 http,server,location

gzip 压缩文件可以节约带宽和提高网络传输效率

类型 种类
语法 gzip on / off
默认 gzip off;
上下文 http,server,location

gzip_comp_level 压缩比率越高,文件被压缩的体积越小

类型 种类
语法 gzip_comp_level level
默认 gzip_comp_level 1;
上下文 http,server,location

gzip_http_version 压缩HTTP版本

类型 种类
语法 gzip_http_version 1.0/1.1
默认 gzip_http_version 1.1;
上下文 http,server,location

http_gzip-static_module 先找磁盘上找同名的.gz这个文件是否存在,节约CPU的压缩时间和性能损耗

类型 种类
语法 gzip_static on/off
默认 gzip_static off;
上下文 http,server,location
    location ~ .*\.(jpg|png|gif)$ {
        gzip off;# 关闭压缩
        root /data/www/images;
    }

    location ~ .*\.(html|js|css)$ {
        gzip on; # 启用压缩
        gzip_min_length 1k;    # 只压缩超过1K的文件
        gzip_http_version 1.1; # 启用gzip压缩所需的HTTP最低版本
        gzip_comp_level 9;     # 压缩级别,压缩比率越高,文件被压缩的体积越小
        gzip_types  text/css application/javascript;# 进行压缩的文件类型
        root /data/www/html;
    }

    location ~ ^/download {
        gzip_static on; # 启用压缩
        tcp_nopush on;  # 不要着急发,攒一波再发
        root /data/www; # 注意此处目录是`/data/www`而不是`/data/www/download`
    } 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 浏览器缓存

校验本地缓存是否过期

类型 种类
检验是否过期 Expires、Cache-Control(max-age)
Etag Etag
Last-Modified Last-Modified

expires
添加Cache-Control、Expires头

类型 种类
语法 expires time
默认 expires off;

上下文 http,server,location

location ~ .*\.(jpg|png|gif)$ {
        expires 24h;
}
1
2
3

# 跨域

类型 种类
语法 add_header name value
默认 add_header --;
上下文 http,server,location
location ~ .*\.json$ {
        add_header Access-Control-Allow-Origin http://localhost:3000;
        add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
        root /data/json;
    }
1
2
3
4
5
let xhr = new XMLHttpRequest();
xhr.open('GET', 'http://47.104.184.134/users.json', true);
xhr.onreadystatechange = function () {
    if (xhr.readyState == 4 && xhr.status == 200) {
        console.log(xhr.responseText);
    }
}
xhr.send();
1
2
3
4
5
6
7
8

# 防盗链

防止网站资源被盗用、保证信息安全、防止流量过量、区别哪些请求是非正常的用户请求 使用http_refer防盗链

类型 种类
语法 valid_referers none block server_names string...
默认 -
上下文 server,location








 
 
 
 


location ~ .*\.(jpg|png|gif)$ {
        expires 1h;
        gzip off;
        gzip_http_version 1.1;
        gzip_comp_level 3;
        gzip_types image/jpeg image/png image/gif;
        # none没有refer blocked非正式HTTP请求 特定IP
+       valid_referers none blocked 47.104.184.134;
+       if ($invalid_referer) { # 验证通过为0,不通过为1
+           return 403;
+       }
        root /data/images;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
-e, --referer       Referer URL (H)
curl -e "http://www.baidu.com" http://192.171.207.104/girl.jpg
curl -e "192.171.207.100" http://192.171.207.104/girl.jpg
1
2
3

# 代理服务

正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端.
反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端.

配置

类型 种类
语法 proxy_pass URL
默认 -
上下文 server,location

反向代理
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理的作用:
(1)保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网

(2)负载均衡,通过反向代理服务器来优化网站的负载

resolver 8.8.8.8;# 谷歌的域名解析地址
location ~ ^/api {
    # $http_host 要访问的主机名 $request_uri请求路径
    proxy_pass http://127.0.0.1:3000;
}
1
2
3
4
5

按Win+R系统热键打开运行窗口,输入ipconfig /flushdns命令后按回车,就可以清空电脑的DNS缓存

正向代理

正向代理类似一个跳板机,代理访问外部资源。
正向代理的用途:
(1)访问原来无法访问的资源,如google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

location / {
        proxy_pass http://$http_host$request_uri;
    }
1
2
3

# 负载均衡

使用集群是网站解决高并发、海量数据问题的常用手段。
当一台服务器的处理能力、存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求。
这种情况下,更恰当的做法是增加一台服务器分担原有服务器的访问及存储压力。通过负载均衡调度服务器,将来自浏览器的访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多的用户,就在集群中加入更多的应用服务器,使应用服务器的负载压力不再成为整个网站的瓶颈。

upstream

nginx把请求转发到后台的一组upstream服务池
Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用。

  1. 轮询(weight)

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。默认当weight不指定时,各服务器weight相同,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream bakend {
    server 192.168.1.10 weight=1;
    server 192.168.1.11 weight=2;
}
1
2
3
4
  1. ip_hash
类型 种类
语法 upstream name {}
默认 -
上下文 http
upstream mamingjuan {
  ip_hash;
  server localhost:3000;
  server localhost:4000;
  server localhost:5000;
}

server {
    location / {
        proxy_pass http://mamingjuan;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

后端服务器调试状态

状态 描述
down 不参与负载均衡
backup 备份的服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后,服务暂停的时间
max_conns 限制最大的接收的连接数
upstream mamingjuan {
  server localhost:3000 down;
  server localhost:4000 backup;
  server localhost:5000 max_fails=1 fail_timeout=10s;
}
1
2
3
4
5

分配方式

类型 种类
轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
weight(加权轮询) 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
url_hash(第三方) 按访问的URL地址来分配 请求,每个URL都定向到同一个后端 服务器上(缓存)
fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
least_conn 最小连接数,哪个连接少就分给谁
自定义hash hash自定义key
upstream mamingjuan{
  ip_hash;
  server 127.0.0.1:3000;
}


upstream mamingjuan{
  least_conn;
  server 127.0.0.1:3000;
}


upstream mamingjuan{
  url_hash;
  server 127.0.0.1:3000;
}


upstream mamingjuan{
  fair;
  server 127.0.0.1:3000;
}


upstream mamingjuan{
  hash $request_uri;
  server 127.0.0.1:3000;
}
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

# 缓存

nginx代理缓存 (opens new window)

http{  
    # 缓存路径 目录层级 缓存空间名称和大小 失效时间为7天 最大容量为10g
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache:100m inactive=60m max_size=10g; 
} 
1
2
3
4
  • proxy_cache_path 缓存文件路径
  • levels 设置缓存文件目录层次;levels=1:2 表示两级目录
  • keys_zone 设置缓存名字和共享内存大小
  • inactive 在指定时间内没人访问则被删除
  • max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
    if ($request_uri ~ ^/cache/(login|logout)) {
      set $nocache 1;
    }
    location / {
       proxy_pass http://mamingjuan;
    }
    location ~ ^/cache/ {
        proxy_cache cache;
        proxy_cache_valid  200 206 304 301 302 60m;   # 对哪些状态码缓存,过期时间为60分钟
        proxy_cache_key $uri;  # 缓存的维度
        proxy_no_cache $nocache;
        proxy_set_header Host $host:$server_port;  # 设置头
        proxy_set_header X-Real-IP $remote_addr;   # 设置头
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;   # 设置头
        proxy_pass http://127.0.0.1:6000;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • proxy_cache tmp-test 使用名为tmp-test的对应缓存配置
  • proxy_cache_valid 200 206 304 301 302 10d; 对httpcode为200…的缓存10天
  • proxy_cache_key $uri 定义缓存唯一key,通过唯一key来进行hash存取
  • proxy_set_header 自定义http header头,用于发送给后端真实服务器。
  • proxy_pass 指代理后转发的路径,注意是否需要最后的/

# rewrite

可以实现url重写及重定向。用途包括URL页面跳转、兼容旧版本、SEO优化(伪静态)、维护(后台维护、流量转发)、安全(伪静态)

语法	rewrite regex replacement [flag]
默认	-
上下文	server,location,if
1
2
3

解释: regex 正则表达式指的是要被改写的路径
replacement 目标要替换成哪个URL
flag 标识

实战

rewrite ^(.*)$ /www/reparing.html break;
1

正则表达式就不在细讲了与javascript正则内容差不多。

if($http_user_agent ~ MSIE){
  rewrite ^(.*)$ /msie/$1 break;
}
1
2
3

pcretest

wget https://ftp.pcre.org/pub/pcre/pcre-8.13.tar.gz
tar -xzvf  pcre-8.13.tar.gz
cd pcre-8.13
./configure --enable-utf8  
make
make install
pcretest
1
2
3
4
5
6
7

flag
标志位是标识规则对应的类型

flag 含义
last 先匹配自己的location,然后通过rewrite规则新建一个请求再次请求服务端
break 先匹配自己的location,然后生命周期会在当前的location结束,不再进行后续的匹配
redirect 返回302昨时重定向,以后还会请求这个服务器
permanent 返回301永久重定向,以后会直接请求永久重定向后的域名
location ~ ^/break {
     rewrite ^/break /test break;
     proxy_pass http://127.0.0.1:3000;
}

location ~ ^/last {
      rewrite ^/last /test last;
}

location /test {
      default_type application/json;
      return 200 '{"code":0,"msg":"success"}';
}

curl -vL http://192.168.20.150/redirect

location ~ ^/redirect {
 rewrite ^/redirect http://www.baidu.com redirect;
 rewrite ^/redirect http://www.baidu.com permanent;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

rewrite优先级

  • 先执行server中的rewrite指令
  • 执行location匹配
  • 再执行location中的rewrite

location中的优先级

  • 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
  • ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
  • 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
  • 常规字符串匹配类型按前缀匹配
上次更新: 2025/04/07, 01:42:58
shell基础知识

shell基础知识→

Copyright © 2015-2025 Glitz Ma
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式