前两天有个环境需要用到,记录一下过程,一直写在记事本里面没空搬运到博客上。。。
lua的话,我看到宝塔后台集成的那些防渗透/防CC攻击的功能都是基于:https://github.com/loveshell/ngx_lua_waf
所以这里我也用这个waf吧,虽然我知道这个waf很久没人维护了,并且这个waf里面的那个防CC攻击的功能其实也没什么卵用,但是目前好像也就只有这个waf还比较容易部署了。。。
反向代理就没什么好说的了,无非就是如果目标站点是SSL的话,我们用来反代的域名也要申请一个SSL证书,这篇文章因为我拿的zrblog做的实验,zrblog没有上SSL,所以我就不配置了。。。
缓存加速的话,其实你按照我这篇文章配置好了后,如果你有多台机器再配合一下智能DNS分线路解析是可以实现CDN功能的,这里就点到为止吧,反正我不怎么喜欢用CDN。。。
使用Xshell登录到你的机器内,安装EPEL源/开发工具包:
代码语言:javascript复制yum -y install epel-release
代码语言:javascript复制yum -y groupinstall "Development Tools"
下面这些是编译Nginx需要用到的依赖,需要先安装一下:
代码语言:javascript复制yum -y install wget openssl-devel pcre-devel zlib-devel geoip-devel gd-devel
新建一个用户/用户组命名为www并设置禁止登录:
代码语言:javascript复制groupadd www
useradd www -g www -s /sbin/nologin
下载ngx_cache_purge模块,这个是用来清理nginx缓存文件的,后面会说到怎么使用:
代码语言:javascript复制cd
git clone https://github.com/FRiCKLE/ngx_cache_purge.git
下载ngx_devel_kit,因为我们要使nginx支持lua,所以要安装的模块是lua-nginx-module,但是这个模块又依赖于ngx_devel_kit,所以这里要先把这个模块下载并解压:
代码语言:javascript复制wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1rc1.tar.gz
tar -xzvf v0.3.1rc1.tar.gz
同样的lua-nginx-module还需要LuaJit的支持,下面编译安装一下:
代码语言:javascript复制wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar -xzvf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
make
make install
设置环境变量:
代码语言:javascript复制export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0
这里有个坑,要创建一个软链接,否则待会编译出来的nginx无法启动:
代码语言:javascript复制ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
终于可以下载lua-nginx-module模块了:
代码语言:javascript复制cd
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
tar -xzvf v0.10.13.tar.gz
是不是感觉现在你的root目录内乱七八糟的,下载的压缩包太多了,把没用的删除掉:
代码语言:javascript复制rm -rf v0.3.1rc1.tar.gz LuaJIT-2.0.5.tar.gz v0.10.13.tar.gz
OK,现在就可以下载最新版的Nginx了:
代码语言:javascript复制wget http://nginx.org/download/nginx-1.15.5.tar.gz
tar -xzvf nginx-1.15.5.tar.gz
cd nginx-1.15.5
使用如下命令进行配置:
代码语言:javascript复制./configure --user=www --group=www --prefix=/usr/local/nginx --add-module=/root/ngx_cache_purge --add-module=/root/ngx_devel_kit-0.3.1rc1 --add-module=/root/lua-nginx-module-0.10.13 --with-http_ssl_module --with-http_v2_module --with-stream --with-stream_ssl_module --with-http_gzip_static_module --with-http_gunzip_module --with-http_flv_module --with-http_mp4_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module
配置如果没有错误会回显给你下面的这些内容,最好是记录一下,这些是Nginx所有用到的目录和文件:
代码语言:javascript复制Configuration summary
using system PCRE library
using system OpenSSL library
using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
现在我们就可以编译安装了:
代码语言:javascript复制make -j2
make install
完成之后,我们可以新建一个systemd服务文件:
代码语言:javascript复制vi /usr/lib/systemd/system/nginx.service
写入:
代码语言:javascript复制[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
这样我们就可以用systemd来轻松管理nginx了:
代码语言:javascript复制systemctl start nginx
systemctl status nginx
现在我们来配置waf:
代码语言:javascript复制cd /usr/local/nginx/conf/
wget https://github.com/loveshell/ngx_lua_waf/archive/v0.7.2.tar.gz
tar -xzvf v0.7.2.tar.gz
mv ngx_lua_waf-0.7.2 waf
rm -rf v0.7.2.tar.gz
完成之后在这个conf目录内再新建一个目录命名为conf.d,以后我们站点的所有配置文件都可以丢到这个conf.d目录里面:
代码语言:javascript复制mkdir -p /usr/local/nginx/conf/conf.d
接着把默认的nginx.conf主配置文件备份一下:
代码语言:javascript复制mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.confbak
清空nginx.conf主配置文件:
代码语言:javascript复制echo /usr/local/nginx/conf/nginx.conf
接着我们编辑这个配置文件:
代码语言:javascript复制vi /usr/local/nginx/conf/nginx.conf
写入如下内容:
代码语言:javascript复制user www www;
worker_processes auto;
error_log /usr/local/nginx/logs/error.log warn;
pid /usr/local/nginx/logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
lua_package_path "/usr/local/nginx/conf/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file /usr/local/nginx/conf/waf/init.lua;
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;
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 /usr/local/nginx/logs/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /usr/local/nginx/conf/conf.d/*.conf;
}
然后重启Nginx,waf就配置好了:
代码语言:javascript复制systemctl restart nginx
这个waf的配置文件在如下路径,你可以自行更改,需要注意的是每次修改过这个配置文件后要使其生效必须要重启Nginx:
代码语言:javascript复制vi /usr/local/nginx/conf/waf/config.lua
参数如下:
代码语言:javascript复制RulePath = "/usr/local/nginx/conf/waf/wafconf/"
attacklog = "on"
logdir = "/usr/local/nginx/logs/hack/"
UrlDeny="on"
Redirect="on"
CookieMatch="on"
postMatch="on"
whiteModule="on"
black_fileExt={"php","jsp"}
ipWhitelist={"127.0.0.1"}
ipBlocklist={"1.0.0.1"}
CCDeny="on"
CCrate="100/60"
接下来我们来配置反向代理和缓存加速,这两个可以一起配置。要反代什么站取决于你,下面我的这个配置方法只要目标站不是SSL基本都能反代。
首先我们新建两个目录,用来存放缓存文件:
代码语言:javascript复制mkdir -p /www/proxy/cache/proxy_temp_dir
mkdir -p /www/proxy/cache/proxy_cache_dir
把目录所有者更改为www,也就是Nginx的运行用户:
代码语言:javascript复制chown -R www:www /www
接着我们在之前新建的conf.d目录内新建一个配置文件,这个配置文件专门用来设置缓存加速相关的参数:
代码语言:javascript复制vi /usr/local/nginx/conf/conf.d/cache.conf
写入:
代码语言:javascript复制proxy_temp_path /www/proxy/cache/proxy_temp_dir;
proxy_cache_path /www/proxy/cache/proxy_cache_dir levels=1:2 keys_zone=cache_one:20m inactive=1d max_size=5g;
client_body_buffer_size 512k;
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_buffer_size 32k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_cache cache_one;
然后我们再新建一个专门用于反代的配置文件:
代码语言:javascript复制vi /usr/local/nginx/conf/conf.d/proxy.conf
写入:
代码语言:javascript复制server {
listen 80;
server_name 你的站点域名;
location ~ /purge(/.*) {
allow all;
proxy_cache_purge cache_one $host$1$is_args$args;
error_page 405 =200 /purge$1;
}
location /
{
sub_filter www.zrblog.net 你的站点域名;
sub_filter_once off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Referer http://www.zrblog.net;
proxy_set_header Host www.zrblog.net;
proxy_pass http://www.zrblog.net;
proxy_set_header Accept-Encoding "";
proxy_cache cache_one;
proxy_cache_key $host$request_uri$is_args$args;
proxy_cache_valid 200 304 301 302 1h;
}
}
请自行替换这个配置文件中被反代站的域名和你自己的域名。
最后重启Nginx:
代码语言:javascript复制systemctl restart nginx
如果Nginx报错无法启动,你应该使用如下命令检查你的配置文件具体是哪个地方有问题:
代码语言:javascript复制/usr/local/nginx/sbin/nginx -t
现在打开我们自己的域名,应该就可以看到我们已经把zrblog这个站点给反代下来了:
这是完整的反代,网页内的地址都全部是我们自己的域名:
另外我们还把网页的数据都进行了缓存,如果你要清理某一个页面的缓存可以使用purge命令,成功清理如下图所示:
如果要清理全部缓存,就直接在shell里面执行:
代码语言:javascript复制rm -rf /www/proxy/cache/proxy_cache_dir/*
你也可以利用crontab实现每天定时清理缓存。同时如果你有多台机器,可以利于这个缓存的功能反代自己的站实现CDN功能,这里就不多说了。