前两天有个环境需要用到,记录一下过程,一直写在记事本里面没空搬运到博客上。。。
lua的话,我看到宝塔后台集成的那些防渗透/防CC攻击的功能都是基于:https://github.com/loveshell/ngx_lua_waf
所以这里我也用这个waf吧,虽然我知道这个waf很久没人维护了,并且这个waf里面的那个防CC攻击的功能其实也没什么卵用,但是目前好像也就只有这个waf还比较容易部署了。。。
反向代理就没什么好说的了,无非就是如果目标站点是SSL的话,我们用来反代的域名也要申请一个SSL证书,这篇文章因为我拿的zrblog做的实验,zrblog没有上SSL,所以我就不配置了。。。
缓存加速的话,其实你按照我这篇文章配置好了后,如果你有多台机器再配合一下智能DNS分线路解析是可以实现CDN功能的,这里就点到为止吧,反正我不怎么喜欢用CDN。。。
使用Xshell登录到你的机器内,安装EPEL源/开发工具包:
yum -y install epel-release
yum -y groupinstall "Development Tools"
下面这些是编译Nginx需要用到的依赖,需要先安装一下:
yum -y install wget openssl-devel pcre-devel zlib-devel geoip-devel gd-devel
新建一个用户/用户组命名为www并设置禁止登录:
groupadd www useradd www -g www -s /sbin/nologin
下载ngx_cache_purge模块,这个是用来清理nginx缓存文件的,后面会说到怎么使用:
cd git clone https://github.com/FRiCKLE/ngx_cache_purge.git
下载ngx_devel_kit,因为我们要使nginx支持lua,所以要安装的模块是lua-nginx-module,但是这个模块又依赖于ngx_devel_kit,所以这里要先把这个模块下载并解压:
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的支持,下面编译安装一下:
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
设置环境变量:
export LUAJIT_LIB=/usr/local/lib export LUAJIT_INC=/usr/local/include/luajit-2.0
这里有个坑,要创建一个软链接,否则待会编译出来的nginx无法启动:
ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
终于可以下载lua-nginx-module模块了:
cd wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz tar -xzvf v0.10.13.tar.gz
是不是感觉现在你的root目录内乱七八糟的,下载的压缩包太多了,把没用的删除掉:
rm -rf v0.3.1rc1.tar.gz LuaJIT-2.0.5.tar.gz v0.10.13.tar.gz
OK,现在就可以下载最新版的Nginx了:
wget http://nginx.org/download/nginx-1.15.5.tar.gz tar -xzvf nginx-1.15.5.tar.gz cd nginx-1.15.5
使用如下命令进行配置:
./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所有用到的目录和文件:
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"
现在我们就可以编译安装了:
make -j2 make install
完成之后,我们可以新建一个systemd服务文件:
vi /usr/lib/systemd/system/nginx.service
写入:
[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了:
systemctl start nginx systemctl status nginx
现在我们来配置waf:
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目录里面:
mkdir -p /usr/local/nginx/conf/conf.d
接着把默认的nginx.conf主配置文件备份一下:
mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.confbak
清空nginx.conf主配置文件:
echo > /usr/local/nginx/conf/nginx.conf
接着我们编辑这个配置文件:
vi /usr/local/nginx/conf/nginx.conf
写入如下内容:
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就配置好了:
systemctl restart nginx
这个waf的配置文件在如下路径,你可以自行更改,需要注意的是每次修改过这个配置文件后要使其生效必须要重启Nginx:
vi /usr/local/nginx/conf/waf/config.lua
参数如下:
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基本都能反代。
首先我们新建两个目录,用来存放缓存文件:
mkdir -p /www/proxy/cache/proxy_temp_dir mkdir -p /www/proxy/cache/proxy_cache_dir
把目录所有者更改为www,也就是Nginx的运行用户:
chown -R www:www /www
接着我们在之前新建的conf.d目录内新建一个配置文件,这个配置文件专门用来设置缓存加速相关的参数:
vi /usr/local/nginx/conf/conf.d/cache.conf
写入:
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;
然后我们再新建一个专门用于反代的配置文件:
vi /usr/local/nginx/conf/conf.d/proxy.conf
写入:
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:
systemctl restart nginx
如果Nginx报错无法启动,你应该使用如下命令检查你的配置文件具体是哪个地方有问题:
/usr/local/nginx/sbin/nginx -t
现在打开我们自己的域名,应该就可以看到我们已经把zrblog这个站点给反代下来了:
这是完整的反代,网页内的地址都全部是我们自己的域名:
另外我们还把网页的数据都进行了缓存,如果你要清理某一个页面的缓存可以使用purge命令,成功清理如下图所示:
如果要清理全部缓存,就直接在shell里面执行:
rm -rf /www/proxy/cache/proxy_cache_dir/*
你也可以利用crontab实现每天定时清理缓存。同时如果你有多台机器,可以利于这个缓存的功能反代自己的站实现CDN功能,这里就不多说了。
最新评论
5211314
能不能教我 一点不会