使用nginx和sniproxy搭建简易cdn服务

自建cdn是个由来已久的话题,很多时候尝试自行搭建它或许只是为了满足让网站访问更快的需求。并且市面上也有许多功能完善的现成软件可供选择,方法也是五花八门。

但对于个人站点而言,更多时候只是为了抗ddos所用,以及不暴露后端真实ip,并不在意缓存及其速度。(于是就不需要用复杂的软件了)那这时候就使用nginx和sniproxy搭建一个就足矣了。(在此之前需要准备一台装有debian10和抗ddos的主机)

(nginx用来接收80端口的请求,并将其跳转到本机的sniproxy,sniproxy用于和后端服务器取得联系,并代理请求)

一、初始化环境

为了以后更好地让这台机器稳定运行,建议做一些环境上的调整。

1.apt更新一下系统,确保系统里的软件是最新的。

apt-get update && apt-get dist-upgrade

2.修改 /etc/sysctl.conf,加入一些参数。

#Enable BBR
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
#DROP inbound ICMP
net.ipv4.icmp_echo_ignore_all = 1
#Adjustment TCP settings
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 4
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_fin_timeout = 5
net.ipv4.tcp_max_tw_buckets = 48000
net.ipv4.ip_default_ttl = 256
net.ipv4.ip_forward = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 0
#System Mem Adjust
vm.swappiness = 100
vm.dirty_writeback_centisecs = 120
vm.dirty_expire_centisecs = 120
vm.dirty_ratio=10
vm.dirty_background_ratio=10

3.修改 /etc/security/limits.conf 调高进程打开限制,在文件最后添加下列行。

*      -            nofile 1000000
root   -            nofile 1000000

文件修改完毕后重启系统。

二、安装sniproxy

1.首先初始化一下apt,用来安装依赖。

apt-get update
apt-get install -y autotools-dev cdbs debhelper dh-autoreconf dpkg-dev gettext libev-dev libpcre3-dev libudns-dev pkg-config fakeroot devscripts build-essential unzip
# 安装依赖会很大,所以一开始的镜像源一定要选近的,否则会很慢。若中途出现需要重启某个系统服务的提示,直接选yes即可

2.安装sniproxy

mkdir sniproxy && cd sniproxy
# 新建一个 SNI Proxy文件夹并进入
 
wget -N --no-check-certificate https://github.com/dlundquist/sniproxy/archive/master.zip
# 下载 SNI Proxy 最新软件包
 
unzip master.zip && cd sniproxy-master
# 解压 SNI Proxy 软件包并进入解压后的文件夹
 
./autogen.sh && dpkg-buildpackage
# 开始构建 deb 包
 
sniproxy_deb=$(ls ..|grep "sniproxy_.*.deb") && echo ${sniproxy_deb}
# 获取构建后的 deb 包的文件名,正常情况下会返回一个类似于 sniproxy_0.X.X_amd64.deb 这样的文件名
 
[[ ! -z ${sniproxy_deb} ]] && dpkg -i ../${sniproxy_deb}
# 判断获取的文件名是否为空,如果不为空就 安装 deb 包

安装完成后,可以执行命令sniproxy -V来查看是否安装成功,如果可以正常显示版本号那就说明可以了。

3.修改配置文件

sniproxy安装成功后,需要修改配置文件才可以使用,在本文中,安装它的最后目的只是为了代理自有网站,于是配置文件可以做到非常简化。

使用vim打开/etc/sniproxy.conf,清空里面所有内容,并输入 :set paste 来开启粘贴模式。并写入以下内容。完毕后输入 :wq 退出。

user root
pidfile /var/run/sniproxy.pid
 
listen 443 {
 proto tls
 table https_hosts
 access_log {
  filename /dev/null
  priority notice
 }
}
table https_hosts {
 .* *:443
}
 
table https_hosts {
 (.*.|)myhostname.com$ *
}
#将access_log中的filename设置为/dev/null可以阻止其产生日志
#需要将myhostname.com替换为实际域名

4.如果需要将sniproxy设置为开机自启动的话,不能使用systemctl来设定,唯一可行的办法就是将其添加到rc.local中让其开机启动。(debian10恢复rc.local的方法

三.安装nginx

1.apt方式安装nginx。

apt install nginx

2.使用vim打开 /etc/nginx/nginx.conf,清空里面所有内容,并加入以下内容。修改完毕后保存退出。

user nginx;
worker_processes auto;
pid /run/nginx.pid;
worker_rlimit_nofile 65535;

error_log /dev/null;

events {
	worker_connections 65535;
	multi_accept on;
}

http {

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 120s;
	keepalive_requests 10240;
	types_hash_max_size 2048;
	client_max_body_size 102400M;
	server_tokens off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_prefer_server_ciphers on;
	ssl_early_data on;
	ssl_session_tickets on;
	ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
	ssl_session_cache shared:SSL:10m;
	ssl_session_timeout 30m;
        ssl_dhparam /etc/nginx/dhparam.pem;

	access_log off;

	gzip on;
	gzip_vary on;
	gzip_proxied any;
	gzip_comp_level 6;
	gzip_buffers 16 8k;
	gzip_http_version 1.1;
	gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	ssl_stapling         on;
	ssl_stapling_verify  on;
	resolver             1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
	resolver_timeout     2s;


	include /etc/nginx/conf.d/*.conf;
}

3.使用vim打开/etc/nginx/conf.d/default.conf(默认的vhost文件),清空里面所有内容,并加入以下内容。修改完毕后保存退出。

server {
        listen 80;
        listen [::]:80;
        server_name myhostname.com;
        rewrite ^(.*)$ https://${http_host}$1 permanent;
}
#请将myhostname.com替换为实际域名

四、收尾

使用vim打开/etc/hosts,并在文件末尾添加一行源服务器的ip和对应域名。(例如下面这个例子),修改完成后保存退出。

223.5.5.5 public1.alidns.com
8.8.8.8 mywebsite.com

确保Nginx服务和sniproxy服务可以正常运行且开机自启动后,此时再次重启系统。

这个时候,就可以尝试在本地修改hosts来测试是否能正常访问源站了。如果确认没有任何问题,一般来说就可以正常投入使用了。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注