我也来总结一下nginx知识点

最近想深入学习研究一下nginx相关知识,所以总结了以下内容。

什么是nginx?

Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。

nginx优势

1、可以高并发连接

官方测试Nginx能够支撑5万并发连接,实际生产环境中可以支撑2~4万并发连接数。

原因,主要是Nginx使用了最新的epoll(Linux2.6内核)和kqueue(freeBSD)网路I/O模型,而Apache使用的是传统的Select模型,其比较稳定的Prefork模式为多进程模式,需要经常派生子进程,所以消耗的CPU等服务器资源,要比Nginx高很多。

2、内存消耗少

Nginx+PHP(FastCGI)服务器,在3万并发连接下,开启10个Nginx进程消耗150MB内存,15MB10=150MB,开启的64个PHP-CGI进程消耗1280内存,20MB64=1280MB,加上系统自身消耗的内存,总共消耗不到2GB的内存。
如果服务器的内存比较小,完全可以只开启25个PHP-CGI进程,这样PHP-CGI消耗的总内存数才500MB。

3、成本低廉

购买F5BIG-IP、NetScaler等硬件负载均衡交换机,需要十多万到几十万人民币,而Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费试用,并且可用于商业用途。

BSD开源协议是一个给使用者很大自由的协议,协议指出可以自由使用、修改源代码、也可以将修改后的代码作为开源或专用软件再发布。

4、配置文件非常简单

网络和程序一样通俗易懂,即使,非专用系统管理员也能看懂。

5、支持Rewrite重写

能够根据域名、URL的不同,将http请求分到不同的后端服务器群组。

6、内置的健康检查功能

如果NginxProxy后端的某台Web服务器宕机了,不会影响前端的访问。

7、节省带宽

支持GZIP压缩,可以添加浏览器本地缓存的Header头。

8、稳定性高

用于反向代理,宕机的概率微乎其微。

9、支持热部署

Nginx支持热部署,它的自动特别容易,并且,几乎可以7天*24小时不间断的运行,即使,运行数个月也不需要重新启动,还能够在不间断服务的情况下,对软件版本进行升级。

nginx配置参数

参考Nginx 配置常用参数,看这一篇就够了

以我查看宝塔中的nginx.conf配置为例

## 主模块
# 配置用户或者组
user  www www;

#Nginx开启的worker进程数,建议为CPU的核数
worker_processes auto;

#指定日志路径,级别。这个设置可以放入全局块、http块、server块,级别以此为:#debug|info|notice|warn|error|crit|alert|emerg
error_log  /www/wwwlogs/nginx_error.log  crit;

#指定nginx进程运行文件存放地址
pid        /www/server/nginx/logs/nginx.pid;

#配置Nginx worker进程最大打开文件数
worker_rlimit_nofile 51200;

##事件模块
events
    {
        #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport,不建议设置,nginx会自行选择
        use epoll;

        #最大连接数,默认为512
        worker_connections 51200;

        #设置一个进程是否同时接受多个网络连接,默认为off
        multi_accept on;

        #设置网路连接序列化,防止惊群现象发生,默认为
        #on accept_mutex on;

        #默认: 500ms 如果一个进程没有互斥锁,它将延迟至少多长时间。默认情况下,延迟是500ms。 
        #accept_mutex_delay 100ms;
    }

#http模块
http
    {
        #文件扩展名与文件类型映射表
        include       mime.types;

        #include luawaf.conf;

        #引入proxy.conf配置为nginx代理相关配置,配置内容如下
        include proxy.conf;

        # 默认文件类型,默认为text/plain
        default_type  application/octet-stream;

        #保存服务器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的
        server_names_hash_bucket_size 512;

        #设定请求缓冲
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;

        #上传文件的大小限制 默认1m
        client_max_body_size 50m;

        #允许sendfile方式传输文件,默认为off
        sendfile   on;
        #数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。当使用sendfile函数时,tcp_nopush才起作用
        tcp_nopush on;

        #连接超时时间,默认为75s
        keepalive_timeout 60;

        #使缓冲区中的数据立即发送
        tcp_nodelay on;

        #指定连接到后端FastCGI的超时时间
        fastcgi_connect_timeout 300;

        #指定向FastCGI传送请求的超时时间,这个值是已经完成两次握手后向FastCGI传送请求的超时时间
        fastcgi_send_timeout 300;

        #指定接收FastCGI应答的超时时间,这个值是已经完成两次握手后接收FastCGI应答的超时时间
        fastcgi_read_timeout 300;

        #指定读取FastCGI应答第一部分需要用多大的缓冲区
        fastcgi_buffer_size 64k;

        #指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求
        fastcgi_buffers 4 64k;

        fastcgi_busy_buffers_size 128k;
        #表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍。
        fastcgi_temp_file_write_size 256k;

        #是否传递4xx和5xx错误信息到客户端,或者允许nginx使用error_page处理错误信息
        fastcgi_intercept_errors on;

        ##开启gzip资源压缩
        gzip on;

        #当返回内容大于此值时才会使用gzip进行压缩,K为单位,当值为0时,所有页面都进行压缩。
        gzip_min_length  1k;

        #设置用于处理请求压缩的缓冲区数量和大小
        gzip_buffers     4 16k;

        #用于识别http协议的版本,早期的浏览器不支持gzip压缩,用户会看到乱码,所以为了支持前期版本加了此选项。默认在http/1.0的协议下不开启gzip压缩。
        gzip_http_version 1.1;

        #设置gzip压缩级别,级别越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大
        gzip_comp_level 2;

        #设置需要压缩的MIME类型,如果不在设置类型范围内的请求不进行压缩
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;

        #增加响应头"Vary: Accept-Encoding"
        gzip_vary on;

        #Nginx做为反向代理的时候启用:
        #off – 关闭所有的代理结果数据压缩
        #expired – 如果header中包含”Expires”头信息,启用压缩
        #no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩
        #no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩
        #private – 如果header中包含”Cache-Control:private”头信息,启用压缩
        #no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩
        #no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩
        #auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩
        #any – 无条件压缩所有结果数据
        gzip_proxied   expired no-cache no-store private auth;

        #通过表达式,表明哪些UA头不使用gzip压缩
        gzip_disable   "MSIE [1-6]\.";

        #请求限制,对单个ip、单个会话同时存在的连接数的限制。这里定义一个存储区conn_zone,conn_zone的容量是1m,该存储区针对于变量$binary_remote_add生效,这里是针对单个IP生效。
        limit_conn_zone $binary_remote_addr zone=perip:10m;

        #针对域名限制
        limit_conn_zone $server_name zone=perserver:10m;

        #隐藏版本号
        server_tokens off;

        #关闭access_log,即不记录访问日志
        access_log off;

#server{} 包含在http{}内部,每一个server{}都是一个虚拟主机(站点)
server
    {
        #监听端口为888,可以自定义其他端口,也可以加上IP地址
        listen 888;

        #定义网站域名,可以写多个,用空格分隔
        server_name phpmyadmin;

        #默认访问文件
        index index.html index.htm index.php;

        #定义网站根目录,目录可以是相对路径也可以是绝对路径
        root  /www/server/phpmyadmin;

        #定义404页面
        #error_page   404   /404.html;
        include enable-php.conf;

        #匹配以gif,jpg,jpeg,png,bmp,swf结尾的请求
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            #控制页面使用缓存,缓存时间为30天
            expires 30d;
        }

        #匹配以js,cssf结尾的请求
        location ~ .*\.(js|css)?$
        {
            #控制页面使用缓存,缓存时间为12小时
            expires 12h;
        }

        #匹配禁止访问
        location ~ /\.
        {
            deny all;
        }

        #定义访问日志,可以针对每一个server(即每一个站点)设置它们自己的访问日志
        access_log  /www/wwwlogs/access.log;
    }
#引入该目录下所有以.conf结尾的配置文件    
include /www/server/panel/vhost/nginx/*.conf;
}

proxy.conf内容如下

#存储从代理服务器接收到的数据的临时文件定义目录
proxy_temp_path /www/server/nginx/proxy_temp_dir;

#表示缓存文件存放的路径,该路径是预先就要创建好的
#(levels=1:2 :   设置在相对于path指定目录的第几级hash目录中缓存数据,levels=1,表示一级hash目录,levels=12,表示两级hash目录,目录的名称是基于请求URL通过哈希算法得到的)
#(keys_zone=cache_one:500m : 设置缓存名字)
#(inactive=1d   : 强制更新时间,在指定时间内没人访问,就删除缓存)
#(max_size=30g  : 设置硬盘中缓存数据的大小限制,最大缓存空间)
proxy_cache_path /www/server/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:20m inactive=1d max_size=5g;

#处理客户端请求体buffer大小,用来处理POST提交数据,上传文件等。client_body_buffer_size 需要足够大以容纳如果需要上传POST数据
client_body_buffer_size 512k;

#设置与upstream server的连接超时时间,有必要记住,这个超时不能超过75秒。
proxy_connect_timeout 60;

#设置与代理服务器的读超时时间。它决定了nginx会等待多长时间来获得请求的响应。
proxy_read_timeout 60;

#设置了发送请求给upstream服务器的超时时间。超时设置不是为了整个发送期间,而是在两次write操作期间。如果超时后,upstream没有收到新的数据,nginx会关闭连接
proxy_send_timeout 60;

#Nginx使用该大小申请read_buf,即大小指定了 upstream header 最大长度,如果响应头超过了这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502。
proxy_buffer_size 32k;

#设置存储被代理服务器响应的body所占用的buffer个数和每个buffer大小。具体的意思是说,开辟4个长度为64k大小的read_buf用来存储body,当然不是连接建立初始化时就开辟4个,而是当当前buf不够存响应body时才会新申请一个,最多申请4个buf。
proxy_buffers 4 64k;

#nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2),然后它继续从后端取数据。proxy_busy_buffer_size参数用来设置处于busy状态的buffer有多大。
proxy_busy_buffers_size 128k;

#一次访问能写入的临时文件的大小,默认是proxy_buffer_size和proxy_buffers中设置的缓冲区大小的2倍
proxy_temp_file_write_size 128k;

#指定method在转发到代理服务器的请求中使用的HTTP 
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;

## 使用缓存区 cache_one
proxy_cache cache_one;

laravel项目的nginx配置

server
{
    #监听80端口
    listen 80;

    #监听443端口,使用ssl协议
    listen 443 ssl http2;

    #定义网站域名
    server_name test.com;

    #默认访问文件
    index index.php index.html index.htm default.php default.htm default.html;

    #根目录
    root /www/wwwroot/test/public;

    #强制使用https,当监听端口不为443时,重写路由
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }

    #配置ssl证书
    ssl_certificate    /www/server/panel/vhost/cert/test.com/fullchain.pem;

    #配置ssl秘钥
    ssl_certificate_key    /www/server/panel/vhost/cert/test.com/privkey.pem;

    #用于限制连接,使其仅包括SSL / TLS的强版本和密码
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

    ssl_prefer_server_ciphers on;

    #设置存储会话参数的缓存的类型和大小
    ssl_session_cache shared:SSL:10m;

    #指定客户端可以重用会话参数的时间
    ssl_session_timeout 10m;
    # 定义497错误提示页面
    error_page 497  https://$host$request_uri;

    #PHP-INFO-START  PHP引用配置,可以注释或修改
    include enable-php.conf;
    #PHP-INFO-END

    #laravel的URL重写规则
    location / {  
        try_files $uri $uri/ /index.php$is_args$query_string;  
    }

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }

    #匹配以gif,jpg,jpeg,png,bmp,swf结尾的请求并添加缓存时间为30天
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log off;
        access_log /dev/null;
    }

    #匹配以js,css结尾的请求并添加缓存时间为12小时
    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log off;
        access_log /dev/null; 
    }
    #访问日志
    access_log  /www/wwwlogs/test.com.log;
    #错误日志
    error_log  /www/wwwlogs/test.com.error.log;
}

enable-php.conf内容如下

#匹配url中包含.php的请求
location ~ [^/]\.php(/|$)
{
#查找文件,若文件不存在返回404
try_files $uri =404;

#将请求转发给fastcgi管理进程处理
fastcgi_pass  unix:/tmp/php-cgi-72.sock;

#如果请求的URI是以 / 结束的, 该指令设置的文件会被附加到URI的后面并保存在变量$fastcig_script_name中
fastcgi_index index.php;

#设置fastcgi请求中的参数,具体设置的东西可以在$_SERVER中获取到

#脚本文件请求的路径
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

#请求的参数
fastcgi_param  QUERY_STRING       $query_string;

#请求的动作(GET,POST)
fastcgi_param  REQUEST_METHOD     $request_method;

#请求头中的Content-Type字段
fastcgi_param  CONTENT_TYPE       $content_type;

#请求头中的Content-length字段
fastcgi_param  CONTENT_LENGTH     $content_length;

#脚本名称
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;

#请求的地址不带参数
fastcgi_param  REQUEST_URI        $request_uri;

#与$uri相同。
fastcgi_param  DOCUMENT_URI       $document_uri;

#网站的根目录。在server配置中root指令中指定的值
fastcgi_param  DOCUMENT_ROOT      $document_root;

#请求使用的协议,通常是HTTP/1.0HTTP/1.1
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

#获取请求协议如http或https
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

#cgi 版本
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;

#nginx 版本号,可修改、隐藏
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

#客户端IP
fastcgi_param  REMOTE_ADDR        $remote_addr;

#客户端端口
fastcgi_param  REMOTE_PORT        $remote_port;

#服务器IP地址
fastcgi_param  SERVER_ADDR        $server_addr;

#服务器端口
fastcgi_param  SERVER_PORT        $server_port;

# #服务器名,域名在server配置中指定的server_name 
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

#设置脚本名称
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
        set $real_script_name $1;
        set $path_info $2;
 }
 #设置自定义变量
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}

location,rewrite语法配置

Nginx教程(四) Location配置与ReWrite语法
Nginx中的Rewrite的重定向配置与实践

nginx常用命令

帮助命令:nginx -h
查看进程: ps aux | grep nginx
检查配置文件:nginx -t
查看nginx版本和模块:nginx -V
启动Nginx服务器 :sudo nginx
指定启动配置文件:sudo nginx -c /usr/local/nginx/conf/nginx.conf
暴力停止服务:sudo nginx -s stop
优雅停止服务:sudo nginx -s quit
重新加载配置文件:sudo nginx -s reload

nginx变量

参考nginx的变量

Nginx 的系统变量是由每一个编译进Nginx的模块提供的。而用户也可以自己定义变量。

常见的nginx 变量

变量 作用
arg_参数名 URL 中某个具体参数的值
query_string 与args变量完全相同
args 全部URL参数
is_args 如果请求的URL中有参数则返回?否则返回空
content_length HTTP 请求中标识包体长度的Content-Length头部的值,头部没有这个则为空
content_type 标识请求包体类型的Content-Type 头部的值
uri 请求的URI(不包含,不包含?后的参数)
document_uri 与uri完全相同
request_uri 请求的URL(包含?后的参数)
scheme 协议名 HTTP 或者 HTTPS
request_method 请求的方法GET 或者 POST
request_length 所有请求内容的大小,包括请求行,头部,包体等
remote_user 有HTTP Basic Authentication 协议传入的用户名
request 原始的url请求,含有方法和协议版本

TCP相关的变量

变量 作用
binary_remote_addr 客户端地质的整型格式,对于IPv4是4字节
remote_addr 客户端地址
remote_port 客户端端口
connection 递增的连接序号
connection_requests 当前连接上执行过的请求数,对keepalive 有意义
proxy_protocol_addr 若使用了proxy_protocol 协议则返回协议中的地址
proxy_protocol_port 若使用了proxy_protocol 协议则返回协议中的端口
server_addr 服务器端地址(本端地址)
server_port 服务器端端口
TCP_INFO tcp内核层参数($tcpinfo_rtt,$tcpinfo_rttvar,$tcpinfo_snd_cwnd,$tcpinfo_rcv_space)
server_protocol 服务端协议,例如 HTTP

Nginx 处理请求过程中产生的变量

变量 作用
request_time 请求处理到现在的耗时
server_name 匹配上的请求server_name
request_completion 若请求处理完则返回OK,否则为空
request_id 以16禁止输出的请求标识id,随即生成

Nginx系统变量

变量 作用
time_local 以本地时间的标准输出
pid 所属worker进程的id
hostname 与系统上输出hostname 一致

虚拟主机配置

虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响

我也来总结一下nginx知识点

以上述在宝塔nginx配置路径为例

基于主机多IP的方式

#在/www/server/panel/vhost/nginx目录下创建一个ip1.conf
server
{
    listen 127.0.0.1:80;
    server_name www.test.com;
    location / {
        root html;
        index index.html index.htm;
    }
}

#在/www/server/panel/vhost/nginx目录下创建一个ip2.conf
server
{
    listen 127.0.0.2:80;
    server_name www.test.com;
    location / {
        root html;
        index index.html index.htm;
    }
}

基于端口的配置方式

#在/www/server/panel/vhost/nginx目录下创建一个port1.conf
server
{
    listen 80;
    server_name www.test.com;
    location / {
        root html;
        index index.html index.htm;
    }
}

#在/www/server/panel/vhost/nginx目录下创建一个port2.conf
server
{
    listen 81;
    server_name www.test.com;
    location / {
        root html;
        index index.html index.htm;
    }
}

基于多个host名称方式

#在/www/server/panel/vhost/nginx目录下创建一个host1.conf
server
{
    listen 80;
    server_name www.test1.com;
    location / {
        root html;
        index index.html index.htm;
    }
}

#在/www/server/panel/vhost/nginx目录下创建一个host2.conf
server
{
    listen 80;
    server_name www.test2.com;
    location / {
        root html;
        index index.html index.htm;
    }
}

nginx自带模块使用

nginx可通过命令nginx -V查看nginx已安装的模块
我也来总结一下nginx知识点

–with-http_stub_status_module

用于展示了当前nginx的客户端状态信息

在上述的laravel的nginx配置中的sever{}层中添加以下内容

location = /basic_status {
      stub_status;
}

通过配置的域名/basic_status访问页面,可查看到以下内容
我也来总结一下nginx知识点

Active connections: 当前活动的客户端连接数,包含Waiting 连接数。

accepts: 接受的客户端连接总数

handled: 已处理的连接总数,通常该参数值与 accepts 应该是一致的,除非得到某个限制(worker_connections).

requests: 客户端请求总数。

Reading: nginx 正在读取请求标头的当前连接数。

Writing: nginx 正在将响应写回到客户端的当前连接数。

Waiting: 当前等待请求的空闲客户端连接数。

–with-http_sub_module

通过将一个指定的字符串替换为另一个字符串来修改响应
模块适用于:http,server,location

server{
    listen 80;
    server_name test.com;
    root /www/wwwroot/default;
    index index.php index.html index.htm default.php default.htm default.html;
    #把sub替换成SUB
    sub_filter 'sub' 'SUB'; 
    #只替换一次开关
    sub_filter_once off;
}

#/www/wwwroot/default/index.html内容如下
sub sds sub sub

我也来总结一下nginx知识点

fastcgi相关配置

FastCGI 是一种协议,规定了FastCGI应用和支持FastCGI的Web服务器之间的接口。FastCGI是二进制连续传递的。

我也来总结一下nginx知识点

以下为nginx转发最基础的php请求转发配置

#匹配后缀为php的请求
location ~ \.php$ {
        #定义根目录
        root           /usr/share/nginx/html;

        #将请求转发给fastcgi管理进程处理
        fastcgi_pass   127.0.0.1:9000;

        #如果请求的URI是以 / 结束的, 该指令设置的文件会被附加到URI的后面并保存在变量$fastcig_script_name中
        fastcgi_index  index.php;

        #配置fastcgi参数
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
   }

fastcgi缓存核心配置

fastcgi_cache_path:设置缓存的路径和其他参数。缓存数据存储在文件中。缓存中的键名和文件名都是将MD5功能应用于代理URL的结果
fastcai_cache_key : 定义用于缓存的密钥
fastcgi_cache : 定义用于缓存的共享内存区域
fastcgi_cache_valid : 设置不同响应代码的缓存时间

更多相关fastcgi相关参数可参看官方文档

常见功能

负载均衡配置

相关配置可查看我写的另一篇博客简单实践搭建 nginx 负载均衡

动静分离配置

参考博客Nginx动静分离基本概述

动静分离,通过中间将动静分离和静态请求进行分离;
通过中间件将动态请求和静态请求分离,可以建上不必要的请求消耗,同时能减少请求的延时。
通过中间件将动态请求和静态请求分离,逻辑图如下 :

我也来总结一下nginx知识点

动静分离只有好处:动静分离后,即使动态服务不可用,但静态资源不会受到影响。

不过目前常见的做法是将图片上传到云存储,可能比较少会在自己的nginx上配置相关参数,自己去存储图片视频等静态资源

简单例子

location / {
    root /code/wordpress;
    index.php;
}
location ~* \.(png|jpg|mp4)${
     #指定图片路径
    root /code/wordpress/images;
    #压缩
    gzip on;
    .....
}
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    .....
}

防盗链

参考nginx 防盗链配置

为了防止第三方引用链接访问我们的图片,消耗服务器资源和网络流量,我们可以在服务器上做防盗链限制。

实现防盗链的方式有两种:refer方式和签名方式。

refer方式

工作模块:ngx_http_referer_module

作用变量:$invalid_referer,全局变量

配置域:server, location

server
{
    listen 80;
    server_name nginx.sonew.shop;
    root /www/wwwroot/test;
    index 1.html;
    default_type text/html;
    location ~*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        valid_referers none blocked nginx.sonew.shop;
        if ($invalid_referer) {
            return 403;
        }
    }
}

valid_referers: 指定资源访问是通过以下几种方式为合法,即白名单。
none:允许缺失的头部访问。
blocked:允许referer没有对应值的请求。
server_names:若referer站点域名与server_name中本机配的域名一样允许访问。

签名方式

工作模块:第三方模块HttpAccessKeyModule。
需要安装第三方模块,还没动手实践。。。

server {
    listen       80;
    server_name  www.imcati.com nginx.sonew.shop;
    root /usr/share/nginx/html;

    location ~*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        accesskey on;
        accesskey_hashmethod md5;
        accesskey_arg "key";
        accesskey_signature "mypass$remote_addr";
    }
}
#accesskey on | off: 模块开关
#accesskey_hashmethod md5|sha—1: 签名加密方式
#accesskey_arg: GET参数名称
#accesskey_sign: 加密规则

//$sign = md5('mypass' . $_SERVICE['REMOTE_ADDR']);
//img src=/test.png?key=<?=$sign?>
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!