Nginx笔记-缓存/认证/模块
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。
- 
    
因为用了C++,需要g++编译器
$ sudo apt-get install g++ - 
    
解压并放在一个固定位置,比如
/usr/local/src,不要删源文件因为可能会重新编译添加模块。 - 
    
不带任何模块直接make install,后面要用到模块可以自己加,问题不大。
$ cd /usr/local/src/nginx-1.16.0 $ ./configure --prefix=/usr/local/nginx $ sudo make install - 
    
应该安装在了
/usr/local/nginx下,添加一个path(修改bashrc)export PATH=/usr/local/nginx/sbin:$PATH; - 
    
可以愉快地使用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;
}
- 
    
allowdeny:允许阻止指定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模块,模块添加完成。