Nginx笔记-缓存/认证/模块

2019-05-03

Nginx笔记-缓存/认证/模块

  • 正则匹配:用~做前置,后面跟表达式

    location ~ \.(gif|jpg|png)$ {
        root /data/images;
    }
    
  • 默认配置文件是nginx/conf/nginx.conf,然而可以用include指令去包含其他配置文件,这样让配置模块化比较好。

    include /etc/nginx/conf.d/http.conf;
    

基本用法

安装和初次启动

安装和启动非常简单,编译一下make install就行,然后添加一个PATH就完事(仅限Linux下),源码下载地址,我写这篇博客的时候最新的stable版本为1.16.0。

  1. 因为用了C++,需要g++编译器

    $ sudo apt-get install g++
    
  2. 解压并放在一个固定位置,比如/usr/local/src,不要删源文件因为可能会重新编译添加模块。

  3. 不带任何模块直接make install,后面要用到模块可以自己加,问题不大。

    $ cd /usr/local/src/nginx-1.16.0
    $ ./configure --prefix=/usr/local/nginx
    $ sudo make install
    
  4. 应该安装在了/usr/local/nginx下,添加一个path(修改bashrc)

    export PATH=/usr/local/nginx/sbin:$PATH;
    
  5. 可以愉快地使用nginx了

    $ nginx
    $ nginx -s reload
    $ nginx -s quit
    

基本配置

打开nginx/conf/nginx.conf进行配置,也可以在nginx命令后接-c参数指定配置文件

  • 静态文件服务器:

    http{
        server {
            listen 80;
            server_name localhost;
            location / {
                root data/www;
            }
            location ~ \.(gif|jpg|png)$ {
                root data/images;
            }
        }
    }
    
  • 代理服务器

    http{
        server {
            listen 80;
            server_name localhost_proxy;
            location / {
                proxy_pass http://localhost:8080;
            }
        }
    }
    

    所有的配置都非常直白,甚至不需要注释

Contexts

上下文指用{}包括的指令块。Nginx有四大顶级上下文,分别为:

  • events:通用的连接配置
  • http:HTTP服务器配置
  • mail:邮件服务器配置
  • stream:TCP和UDP服务器配置

所有服务器配置(除了events)上下文中,都是用server指令去创建虚拟服务器。父子上下文之间的配置具有继承关系。比如:

server{
    root: /data;
    location{
        #通过继承,这个location的root是/data文件夹
    }
}

Cache

nginx的Cache功能主要是代理缓存,即作为代理时,可以请求一次内容,将内容存到自己的磁盘上,在一定时间内当做静态文件一样响应请求。

http {
    ...
    proxy_cache_path /data/nginx/cache keys_zone=mycache:10m;
    server {
        proxy_cache mycache;
        proxy_cache_valid   200 304 12h;
		proxy_cache_valid   any 10m;
        location / {
            proxy_pass http://localhost:8000;
        }
    }
}
  • proxy_cache_path:声明缓存位置,可配置:

    • keys_zone:声明缓存名称和大小
    • max_size=10g:最大大小,超过后会启动淘汰机制
    • inactive=60m:超过60m没被访问过自动清理
    • use_temp_path=on:启用临时文件
  • proxy_cache:声明缓存

  • proxy_cache 200 12h:200状态码的缓存12小时过期

Authentication

Nginx提供一些访问控制机制。这些例子都控制了data/protected目录下所有文件的访问

IP认证

location /protected{
    satisfy all;
    allow 127.0.0.1;
    deny 192.168.0.1;
    root data;
}
  • allow deny:允许 阻止指定ip访问
  • satisfy all:必须满足所有认证条件,比如IP认证和Basic一起用的情况下。也可以取值为any

Basic身份认证

basic身份验证就是页面弹个框让输入密码。密码文件可以用开源的apach2util生成。

location /protected{
    satisfy all;
    auth_basic "protected content";
    auth_basic_user_file /etc/nginx/.htpasswd;
    root data;
}
  • auth_basic:弹框的提示,其实测试了一下,不同浏览器对这个响应不太一样,不过不太重要。
  • auth_basic_user_file:用户账号/密码对文件

子请求认证

当请求网页时,Nginx发送一个请求到指定internal url,这个internal url一般是一个动态服务器的代理,如果响应为200,即认证成功可以访问;如果为401或者403,即认证失败,这里在认证失败时可以配置一个302重定向到登录页让用户登录。这种请求认证方式更加常见,对用户更友好。

需要一个模块:http_auth_request_module,怎么添加模块在最后面一个小节。

location /protected {
    auth_request /auth;	#需要先向auth去发一个子请求才能访问
    root data;
}

location /auth{
    internal;	#internal的意思是不让客户端访问这个,客户端访问/auth只会是404
    proxy_pass http://login.myexample.com/auth;	#动态认证服务器的地址
    proxy_set_header Cookie $http_cookie;	#用Cookie作为验证信息
}

#当被返回401或403时的操作
error_page 403=@unAythed;
error_page 401=@unAuthed;
location unAuthed{
    return 302 http://login.myexample.com; #发个302让用户去指定页面登陆
}

而认证服务器一般就是动态写的,比如用Express,Springboot等根据具体认证逻辑去写。不是Nginx能干的。

这部分我想写一个能跑的Demo出来。

添加模块

Nginx可以以模块的形式添加功能,由于是C++写的,添加模块需要重新编译,所以建议保留一份当前Nginx版本的源码(我放在/usr/src/nginx-1.16.0中)

重新以添加模块的方式编译,比如添加模块http_auth_request_module,这个是源码自带的模块但默认没有启用。

$ /usr/src/nginx-1.16.0/configure --prefix=/usr/local/nginx --with-http_auth_request_module

这里直接用--with-http_auth_request_module就行了,因为源码中本来就包含这个模块,但只是默认配置中编译不包含。如果是源码中没有的第三方模块,需要使用--add-module参数去指定模块源码位置。

$ cd /usr/src/nginx-1.16.0
$ make

这里不能make install,否则直接就覆盖了,配置文件全部白白。

$ sudo cp /usr/src/objs/nginx /usr/local/nginx/sbin/nginx

覆盖编译出来的二进制文件。

$ nginx -V
nginx version: nginx/1.16.0
built by gcc 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) 
configure arguments: --with-http_auth_request_module

查看nginx信息,可以看出已经带了http_auth_request_module模块,模块添加完成。