CentOS7编译安装Nginx/配置lua/反向代理/缓存加速

2020-10-28 15:56:38 浏览数 (1)

前两天有个环境需要用到,记录一下过程,一直写在记事本里面没空搬运到博客上。。。

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功能,这里就不多说了。

0 人点赞