静看光阴荏苒
不管不顾不问不说也不念

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

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

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

赞(1)
未经允许不得转载:荒岛 » CentOS7编译安装Nginx/配置lua/反向代理/缓存加速
分享到: 更多 (0)

评论 7

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    lala 最近好多ssr都死了 是怎么肥事

    loli6年前 (2018-10-15) QQbrowser 10.2.2498.400 QQbrowser 10.2.2498.400 Windows 10 x64 Edition Windows 10 x64 Edition回复
    • ssr自己低调使用不分享的话很少会死的。。。只有脸黑的时候估计会中奖。。。

      LALA6年前 (2018-10-17) Google Chrome 67.0.3396.99 Google Chrome 67.0.3396.99 Windows 10 x64 Edition Windows 10 x64 Edition回复
    • 我这2天黑了2个ip了搞得不想换了 TCP阻断

      kedyao6年前 (2018-10-18) Google Chrome 68.0.3440.106 Google Chrome 68.0.3440.106 Windows 10 x64 Edition Windows 10 x64 Edition回复
      • TCP阻断就放着吃灰吧,说不定哪天就解了。当然也有可能因为最近外面闹的比较凶,高墙一般是要搞几波镇压一下的。。

        LALA6年前 (2018-10-18) Google Chrome 67.0.3396.99 Google Chrome 67.0.3396.99 Windows 10 x64 Edition Windows 10 x64 Edition回复
  2. #2

    emmm…试了一下
    nginx.conf配置好像有问题,用了LALA的配置nginxcq重启失败。
    Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.

    逸二5年前 (2019-05-04) QQbrowser QQbrowser Android 9 Android 9回复
    • nginx -t可以具体定位到是哪个配置文件的哪一行出错了。

      LALA5年前 (2019-05-04) Google Chrome 72.0.3626.121 Google Chrome 72.0.3626.121 Windows 10 x64 Edition Windows 10 x64 Edition回复

分享创造快乐

广告合作资源投稿