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;
}
-
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
模块,模块添加完成。