前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CentOS7编译安装Nginx/配置lua/反向代理/缓存加速

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

作者头像
砸漏
发布2020-10-28 15:56:38
6640
发布2020-10-28 15:56:38
举报
文章被收录于专栏:恩蓝脚本恩蓝脚本

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
内容分发网络 CDN
内容分发网络(Content Delivery Network,CDN)通过将站点内容发布至遍布全球的海量加速节点,使其用户可就近获取所需内容,避免因网络拥堵、跨运营商、跨地域、跨境等因素带来的网络不稳定、访问延迟高等问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档