cdn搭建
#!/bin/bash
#################################################################
# One-click CDN Installation Script v0.0.5 #
# Written by shc (https://qing.su) #
# Github link: https://github.com/Har-Kuun/OneClickCDN #
# Contact me: https://t.me/hsun94 E-mail: hi@qing.su #
# #
# This script is distributed in the hope that it will be #
# useful, but ABSOLUTELY WITHOUT ANY WARRANTY. #
# #
# Thank you for using this script. #
#################################################################
#You can change the Traffic Server source file download link here.
#Check https://www.apache.org/dyn/closer.cgi/trafficserver for the latest stable version.
TS_DOWNLOAD_LINK="https://mirrors.ocf.berkeley.edu/apache/trafficserver/trafficserver-8.1.1.tar.bz2"
TS_VERSION="8.1.1"
#You can enable an experimental feature: reverse proxy for any website.
#Please note that this feature is kind of buggy; you might have to manually modify some mapping rules if necessary.
#If you wish to turn on this feature, set the value for the variable below to ON, and use the special key in the main function to add reverse proxy instances.
REVERSE_PROXY_MODE_ENABLED=OFF
#By default, this script only works on Ubuntu 20, Debian 10, and CentOS 7/8.
#You can disable the OS check switch below and tweak the code yourself to try to install it in other OS versions.
#Please do note that if you choose to use this script on OS other than Ubuntu 20, Debian 10, or CentOS 7/8, you might mess up your OS. Please keep a backup of your server before installation.
OS_CHECK_ENABLED=ON
#########################################################################
# Functions start here. #
# Do not change anything below unless you know what you are doing. #
#########################################################################
function check_OS
{
if [ -f /etc/lsb-release ]
then
cat /etc/lsb-release | grep "DISTRIB_RELEASE=18." >/dev/null
if [ $? = 0 ]
then
OS=UBUNTU18
echo "Support of Ubuntu 18 is experimental. You may get error in TLS handshakes."
echo "Please consider upgrading to Ubuntu 20 (simply run \"do-release-upgrade -d\")."
echo "Please tweak the OS_CHECK_ENABLED setting if you still wish to install on Ubuntu 18."
echo
exit 1
else
cat /etc/lsb-release | grep "DISTRIB_RELEASE=20." >/dev/null
if [ $? = 0 ]
then
OS=UBUNTU20
else
say "Sorry, this script only supports Ubuntu 20 and Debian 10." red
echo
exit 1
fi
fi
elif [ -f /etc/debian_version ] ; then
cat /etc/debian_version | grep "^10." >/dev/null
if [ $? = 0 ] ; then
OS=DEBIAN10
echo "Support of Debian 10 is experimental. Please report bugs."
echo
else
cat /etc/debian_version | grep "^9." >/dev/null
if [ $? = 0 ] ; then
OS=DEBIAN9
echo "Support of Debian 9 is experimental. You may get error in TLS handshakes."
echo "Please tweak the OS_CHECK_ENABLED setting if you still wish to install on Debian 9."
echo
exit 1
else
say "Sorry, this script only supports Ubuntu 20 and Debian 10." red
echo
exit 1
fi
fi
elif [ -f /etc/redhat-release ] ; then
cat /etc/redhat-release | grep " 8." >/dev/null
if [ $? = 0 ] ; then
OS=CENTOS8
echo "Support of CentOS 8 is experimental. Please report bugs."
echo "Please try disabling selinux or firewalld if you cannot visit your website."
echo
else
cat /etc/redhat-release | grep " 7." >/dev/null
if [ $? = 0 ] ; then
OS=CENTOS7
echo "Support of CentOS 7 is experimental. Please report bugs."
echo "Please try disabling selinux or firewalld if you cannot visit your website."
echo
else
echo "Sorry, this script only supports Ubuntu 20, Debian 10, and CentOS 7/8."
echo
exit 1
fi
fi
else
echo "Sorry, this script only supports Ubuntu 20, Debian 10, and CentOS 7/8."
echo
exit 1
fi
}
function check_TS
{
if [ -f /usr/local/bin/trafficserver ] ; then
TS_INSTALLED=1
else
TS_INSTALLED=0
fi
}
function install_TS
{
say @B"Starting Traffic Server installation..." green
echo "..."
echo "..."
echo "Removing Nginx and Apache..."
apt-get remove nginx apache -y
echo "Installing depedencies..."
apt-get update && apt-get upgrade -y
apt-get install wget curl tar certbot automake libtool pkg-config libmodule-install-perl gcc g++ libssl-dev tcl-dev libpcre3-dev libcap-dev libhwloc-dev libncurses5-dev libcurl4-openssl-dev flex autotools-dev bison debhelper dh-apparmor gettext intltool-debian libbison-dev libexpat1-dev libfl-dev libsigsegv2 libsqlite3-dev m4 po-debconf tcl8.6-dev zlib1g-dev -y
wget $TS_DOWNLOAD_LINK
tar xjf trafficserver-${TS_VERSION}.tar.bz2
rm -f trafficserver-${TS_VERSION}.tar.bz2
cd ${current_dir}/trafficserver-${TS_VERSION}
echo "Start building Traffic Server from source..."
./configure --enable-experimental-plugins
if [ -f ${current_dir}/trafficserver-${TS_VERSION}/config.status ] ; then
say @B"Dependencies met!" green
say @B"Compiling now..." green
echo
else
echo
say "Missing dependencies." red
echo "Please check log, install required dependencies, and run this script again."
echo "Please also consider to report your log here https://github.com/Har-Kuun/OneClickCDN/issues so that I can fix this issue."
echo "Thank you!"
echo
exit 1
fi
make
make install
if [ -f /usr/local/bin/traffic_manager ] ; then
echo
say @B"Traffic Server successfully installed!" green
echo
else
echo
say "Traffic Server installation failed." red
echo "Please check the above log for reasons."
echo "Please also consider to report your log here https://github.com/Har-Kuun/OneClickCDN/issues so that I can fix this issue."
echo "Thank you!"
echo
exit 1
fi
ln -s /usr/local/etc/trafficserver /etc/trafficserver
mkdir /etc/trafficserver/ssl
chown nobody /etc/trafficserver/ssl
chmod 0760 /etc/trafficserver/ssl
cd ${current_dir}
ldconfig
trafficserver start
echo
say @B"Traffic Server successfully started!" green
echo "Domain Type(CDN/RevProxy) OriginIP" > /etc/trafficserver/hostsavailable.sun
# echo "trafficserver start" >> /etc/rc.local
run_on_startup
echo
}
function install_TS_CentOS
{
say @B"Starting Traffic Server installation..." green
echo "..."
echo "..."
echo "Removing Nginx and Apache..."
yum remove httpd nginx -y
echo "Installing depedencies..."
yum update -y
if [ "x$OS" = "xCENTOS7" ] ; then
yum install centos-release-scl -y
yum install devtoolset-8 -y
scl enable devtoolset-8
yum install wget curl tar openssl-devel pcre-devel tcl-devel gcc-c++ expat-devel libcap-devel hwloc ncurses-devel libcurl-devel pcre-devel tcl-devel expat-devel openssl-devel perl-ExtUtils-MakeMaker bzip2 -y
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
yum install certbot -y
source /opt/rh/devtoolset-8/enable
else
dnf -y group install "Development Tools"
dnf -y install wget curl tar openssl-devel pcre-devel tcl-devel expat-devel libcap-devel hwloc ncurses-devel bzip2 libcurl-devel pcre-devel tcl-devel expat-devel openssl-devel perl-ExtUtils-MakeMaker
yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf -y install certbot
dnf config-manager --set-enabled PowerTools
fi
wget $TS_DOWNLOAD_LINK
tar xjf trafficserver-${TS_VERSION}.tar.bz2
rm -f trafficserver-${TS_VERSION}.tar.bz2
cd ${current_dir}/trafficserver-${TS_VERSION}
echo "Start building Traffic Server from source..."
./configure --enable-experimental-plugins
if [ -f ${current_dir}/trafficserver-${TS_VERSION}/config.status ] ; then
say @B"Dependencies met!" green
say @B"Compiling now..." green
echo
else
echo
say "Missing dependencies." red
echo "Please check log, install required dependencies, and run this script again."
echo "Please also consider to report your log here https://github.com/Har-Kuun/OneClickCDN/issues so that I can fix this issue."
echo "Thank you!"
echo
exit 1
fi
make
make install
if [ -f /usr/local/bin/traffic_manager ] ; then
echo
say @B"Traffic Server successfully installed!" green
echo
else
echo
say "Traffic Server installation failed." red
echo "Please check the above log for reasons."
echo "Please also consider to report your log here https://github.com/Har-Kuun/OneClickCDN/issues so that I can fix this issue."
echo "Thank you!"
echo
exit 1
fi
ln -s /usr/local/etc/trafficserver /etc/trafficserver
mkdir /etc/trafficserver/ssl
chown nobody /etc/trafficserver/ssl
chmod 0760 /etc/trafficserver/ssl
cd ${current_dir}
ldconfig
/usr/local/bin/trafficserver start
echo
say @B"Traffic Server successfully started!" green
echo "Domain Type(CDN/RevProxy) OriginIP" > /etc/trafficserver/hostsavailable.sun
run_on_startup
echo
}
function config_main_records
{
cat > /etc/trafficserver/records.config <<END
CONFIG proxy.config.exec_thread.autoconfig INT 1
CONFIG proxy.config.exec_thread.autoconfig.scale FLOAT 1.5
CONFIG proxy.config.exec_thread.limit INT 2
CONFIG proxy.config.accept_threads INT 1
CONFIG proxy.config.task_threads INT 2
CONFIG proxy.config.cache.threads_per_disk INT 8
CONFIG proxy.config.exec_thread.affinity INT 1
CONFIG proxy.config.http.server_ports STRING 80 443:proto=http2;http:ssl
CONFIG proxy.config.http.insert_request_via_str INT 1
CONFIG proxy.config.http.insert_response_via_str INT 2
CONFIG proxy.config.http.response_via_str STRING ATS
CONFIG proxy.config.http.parent_proxy_routing_enable INT 0
CONFIG proxy.config.http.parent_proxy.retry_time INT 300
CONFIG proxy.config.http.parent_proxy.connect_attempts_timeout INT 30
CONFIG proxy.config.http.forward.proxy_auth_to_parent INT 0
CONFIG proxy.config.http.uncacheable_requests_bypass_parent INT 1
CONFIG proxy.config.http.keep_alive_no_activity_timeout_in INT 120
CONFIG proxy.config.http.keep_alive_no_activity_timeout_out INT 120
CONFIG proxy.config.http.transaction_no_activity_timeout_in INT 30
CONFIG proxy.config.http.transaction_no_activity_timeout_out INT 30
CONFIG proxy.config.http.transaction_active_timeout_in INT 900
CONFIG proxy.config.http.transaction_active_timeout_out INT 0
CONFIG proxy.config.http.accept_no_activity_timeout INT 120
CONFIG proxy.config.net.default_inactivity_timeout INT 86400
CONFIG proxy.config.http.connect_attempts_max_retries INT 3
CONFIG proxy.config.http.connect_attempts_max_retries_dead_server INT 1
CONFIG proxy.config.http.connect_attempts_rr_retries INT 3
CONFIG proxy.config.http.connect_attempts_timeout INT 30
CONFIG proxy.config.http.post_connect_attempts_timeout INT 1800
CONFIG proxy.config.http.down_server.cache_time INT 60
CONFIG proxy.config.http.down_server.abort_threshold INT 10
CONFIG proxy.config.http.negative_caching_enabled INT 0
CONFIG proxy.config.http.negative_caching_lifetime INT 1800
CONFIG proxy.config.http.insert_client_ip INT 1
CONFIG proxy.config.http.insert_squid_x_forwarded_for INT 1
CONFIG proxy.config.http.push_method_enabled INT 1
CONFIG proxy.config.http.cache.http INT 1
CONFIG proxy.config.http.cache.ignore_client_cc_max_age INT 1
CONFIG proxy.config.http.normalize_ae INT 1
CONFIG proxy.config.http.cache.cache_responses_to_cookies INT 1
CONFIG proxy.config.http.cache.when_to_revalidate INT 0
CONFIG proxy.config.http.cache.required_headers INT 2
CONFIG proxy.config.http.cache.ignore_client_no_cache INT 1
CONFIG proxy.config.http.cache.heuristic_min_lifetime INT 3600
CONFIG proxy.config.http.cache.heuristic_max_lifetime INT 86400
CONFIG proxy.config.http.cache.heuristic_lm_factor FLOAT 0.10
CONFIG proxy.config.net.connections_throttle INT 30000
CONFIG proxy.config.net.max_connections_in INT 30000
CONFIG proxy.config.net.max_connections_active_in INT 10000
CONFIG proxy.config.cache.ram_cache_cutoff INT 4194304
CONFIG proxy.config.cache.limits.http.max_alts INT 5
CONFIG proxy.config.cache.max_doc_size INT 0
CONFIG proxy.config.cache.min_average_object_size INT 8000
CONFIG proxy.config.log.logging_enabled INT 3
CONFIG proxy.config.log.max_space_mb_for_logs INT 25000
CONFIG proxy.config.log.max_space_mb_headroom INT 1000
CONFIG proxy.config.log.rolling_enabled INT 1
CONFIG proxy.config.log.rolling_interval_sec INT 86400
CONFIG proxy.config.log.rolling_size_mb INT 10
CONFIG proxy.config.log.auto_delete_rolled_files INT 1
CONFIG proxy.config.log.periodic_tasks_interval INT 5
CONFIG proxy.config.url_remap.remap_required INT 1
CONFIG proxy.config.url_remap.pristine_host_hdr INT 1
CONFIG proxy.config.reverse_proxy.enabled INT 1
CONFIG proxy.config.ssl.client.verify.server INT 0
CONFIG proxy.config.ssl.client.CA.cert.filename STRING NULL
CONFIG proxy.config.ssl.server.cipher_suite STRING ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
CONFIG proxy.config.diags.debug.enabled INT 0
CONFIG proxy.config.diags.debug.tags STRING http|dns
CONFIG proxy.config.dump_mem_info_frequency INT 0
CONFIG proxy.config.http.slow.log.threshold INT 0
CONFIG proxy.config.ssl.server.cert.path STRING /etc/trafficserver/ssl/
CONFIG proxy.config.ssl.server.private_key.path STRING /etc/trafficserver/ssl/
CONFIG proxy.config.cache.enable_read_while_writer INT 1
CONFIG proxy.config.http.background_fill_active_timeout INT 0
CONFIG proxy.config.http.background_fill_completed_threshold FLOAT 0.000000
CONFIG proxy.config.cache.max_doc_size INT 0
CONFIG proxy.config.cache.read_while_writer.max_retries INT 10
CONFIG proxy.config.cache.read_while_writer_retry.delay INT 50
CONFIG proxy.config.http.congestion_control.enabled INT 1
CONFIG proxy.config.http.cache.max_open_read_retries INT 5
CONFIG proxy.config.http.cache.open_read_retry_time INT 10
CONFIG proxy.config.cache.ram_cache.compress INT 1
CONFIG proxy.config.ssl.ocsp.enabled INT 1
END
}
function config_cache_rules
{
cat > /etc/trafficserver/cache.config <<END
url_regex=.* suffix=xml ttl-in-cache=5d
url_regex=.* suffix=ts ttl-in-cache=5d
url_regex=.* suffix=jpeg ttl-in-cache=5d
url_regex=.* suffix=mp4 ttl-in-cache=5d
url_regex=.* suffix=zip ttl-in-cache=5d
url_regex=.* suffix=gif ttl-in-cache=5d
url_regex=.* suffix=ppt ttl-in-cache=5d
url_regex=.* suffix=jpg ttl-in-cache=5d
url_regex=.* suffix=swf ttl-in-cache=5d
url_regex=.* scheme=https ttl-in-cache=1h
url_regex=.* scheme=http ttl-in-cache=1h
url_regex=.* suffix=m3u8 ttl-in-cache=5d
url_regex=.* suffix=js ttl-in-cache=5d
url_regex=.* suffix=css ttl-in-cache=5d
url_regex=.* suffix=html ttl-in-cache=5d
END
}
function config_cache_storage
{
valid_integer=0
while [ ${valid_integer} != 1 ]
do
ram_cache_size=
echo
echo "Please specify RAM cache size."
echo "The unit is MB. Please type an integer only."
echo "The recommended value is 200 per GB of RAM on your server."
echo
read ram_cache_size
re='^[0-9]+$'
if ! [[ ${ram_cache_size} =~ $re ]] ; then
say @B"Please type an integer only." yellow
else
valid_integer=1
fi
done
if [ $ram_cache_size -lt 50 ] ; then
ram_cache_size=50
fi
echo
say @B"RAM cache size set to ${ram_cache_size}M." green
echo
echo "CONFIG proxy.config.cache.ram_cache.size INT ${ram_cache_size}M" >> /etc/trafficserver/records.config
valid_integer=0
while [ ${valid_integer} != 1 ]
do
disk_cache_size=
echo
echo "Please specify disk cache size."
echo "The unit is MB. Please type an integer only."
echo "The recommended value is at least 2048."
echo
read disk_cache_size
if ! [[ ${disk_cache_size} =~ $re ]] ; then
say @B"please type an integer only." yellow
else
valid_integer=1
fi
done
if [ $disk_cache_size -gt 256 ] ; then
echo
say @B"Disk cache size set to ${disk_cache_size}M." green
echo
echo "var/trafficserver ${disk_cache_size}M" > /etc/trafficserver/storage.config
else
echo
say @B"Disk cache size set to 256M." green
echo
fi
}
function config_cache_partitioning
{
echo
echo "Performing disk cache partitioning..."
for i in 1 2 3 4
do
echo "volume=${i} scheme=http size=25%" >> /etc/trafficserver/volume.config
done
echo "hostname=* volume=1,2,3,4" > /etc/trafficserver/hosting.config
say @B"Disk cache partitioned." green
echo
}
function config_cache_dynamic_content
{
echo
echo "CONFIG proxy.config.http.cache.cache_urls_that_look_dynamic INT 1" >> /etc/trafficserver/records.config
say @B"Cache rules updated!" green
say @B"Traffic Server will cache dynamic content." green
echo
}
function config_mapping_reverse_proxy
{
proxy_hostname=$1
origin_hostname=$2
origin_scheme=$3
echo
echo "Adding mapping rules for ${proxy_hostname} as a reverse proxy of ${origin_hostname}..."
echo "redirect http://${proxy_hostname}/ https://${proxy_hostname}/" >> /etc/trafficserver/remap.config
echo "map https://${proxy_hostname}/ ${origin_scheme}://${origin_hostname}/" >> /etc/trafficserver/remap.config
echo "reverse_map ${origin_scheme}://${origin_hostname}/ https://${proxy_hostname}/" >> /etc/trafficserver/remap.config
say @B"3 rules added." green
echo
}
function config_mapping_cdn
{
cdn_hostname=$1
origin_ip=$2
origin_scheme=$3
origin_port=$4
echo
echo "Adding mapping rules for ${cdn_hostname}..."
if [ "$origin_scheme" = "https" ] ; then
echo "redirect http://${cdn_hostname}/ https://${cdn_hostname}/" >> /etc/trafficserver/remap.config
echo "map https://${cdn_hostname}/ ${origin_scheme}://${origin_ip}:${origin_port}/" >> /etc/trafficserver/remap.config
else
echo "map http://${cdn_hostname}/ ${origin_scheme}://${origin_ip}:${origin_port}/" >> /etc/trafficserver/remap.config
fi
say @B"2 rules added." green
echo
}
function add_reverse_proxy
{
echo
echo "Please specify your proxy domain name (e.g., proxy.example.com):"
read proxy_hostname_add
echo "Please specify the origin website domain name (e.g., origin.example.com):"
read origin_hostname_add
echo "Please specify the origin website IP address (e.g., 88.88.88.88). If it has multiple IPs, any would work:"
read origin_ip_add
echo "Is the origin website using HTTPS or HTTP? Type 1 for HTTPS, or 2 for HTTP. If both works, then either is fine:"
read isHTTPS
if [ $isHTTPS = 1 ] ; then
config_mapping_reverse_proxy $proxy_hostname_add $origin_hostname_add https
else
config_mapping_reverse_proxy $proxy_hostname_add $origin_hostname_add http
fi
echo "${proxy_hostname_add} RevProxy ${origin_hostname_add}" >> /etc/trafficserver/hostsavailable.sun
echo "Would you like to configure SSL certificates for domain name ${proxy_hostname_add} now?"
echo "We can set up SSL with your own certificates, or can issue a free Let's Encrypt SSL certificate for you, if you have already pointed your domain to this server."
echo "How would you like to proceed?"
echo "1: I know the absolute path to my certificate files (private key, certificate, CA chain (optional))."
echo "2: I have pointed my domain name to this server, and I want a free Let's Encrypt certificate."
echo "3: I forgot the path to my certificate files, so I need to go back to SSH and find them; or I do not need SSL certificate for this domain."
echo "Please select 1, 2, or 3:"
read choice_ssl
case $choice_ssl in
1 ) config_ssl_non_le $proxy_hostname_add $origin_ip_add
;;
2 ) config_ssl_le $proxy_hostname_add $origin_ip_add
;;
3 ) config_ssl_later
;;
* ) echo "Error!"
exit 1
;;
esac
}
function add_cdn
{
echo
echo "Please specify your website domain name (e.g., example.com):"
read cdn_hostname_add
echo "Please specify the origin website IP address (e.g., 88.88.88.88). If it has multiple IPs, any would work:"
read origin_ip_add
echo "Is the origin website using HTTPS or HTTP? Type 1 for HTTPS, or 2 for HTTP. If both works, then either is fine:"
read isHTTPS
if [ $isHTTPS = 1 ] ; then
cdn_port=443
config_mapping_cdn $cdn_hostname_add $origin_ip_add https 443
else
cdn_port=80
config_mapping_cdn $cdn_hostname_add $origin_ip_add http 80
fi
echo
echo "${cdn_hostname_add} CDN ${origin_ip_add}:${cdn_port}" >> /etc/trafficserver/hostsavailable.sun
echo "Would you like to configure SSL certificates for domain name ${cdn_hostname_add} now?"
echo
echo "We can set up SSL with your own certificates, or can issue a free Let's Encrypt SSL certificate for you, if you have already pointed your domain to this server."
echo "How would you like to proceed?"
echo
echo "1: I know the absolute path to my certificate files (private key, certificate, CA chain (optional))."
echo "2: I have pointed my domain name to this server, and I want a free Let's Encrypt certificate."
echo "3: I forgot the path to my certificate files, so I need to go back to SSH and find them; or I do not need SSL certificate for this domain."
echo "Please select 1, 2, or 3:"
read choice_ssl
case $choice_ssl in
1 ) config_ssl_non_le $cdn_hostname_add $origin_ip_add
;;
2 ) config_ssl_le $cdn_hostname_add $origin_ip_add
;;
3 ) config_ssl_later
;;
* ) say "Error!" red
exit 1
;;
esac
}
function config_ssl_selection
{
# this function is only called from menu option 4.
echo "We can set up SSL with your own certificates, or can issue a free Let's Encrypt SSL certificate for you, if you have already pointed your domain to this server."
echo "How would you like to proceed?"
echo
echo "1: I know the absolute path to my certificate files (private key, certificate, CA chain (optional))."
echo "2: I have pointed my domain name to this server, and I want a free Let's Encrypt certificate."
echo "3: I forgot the path to my certificate files, so I need to go back to SSH and find them; or I do not need SSL certificate for this domain."
echo "Please select 1, 2, or 3:"
read choice_ssl
if [ $choice_ssl = 3 ] ; then
config_ssl_later
else
echo
echo "Please specify your domain name (e.g., qing.su): "
read ssl_hostname_add
echo "Please specify the origin server IP address (e.g., 88.88.88.88): "
read ssl_ip_add
case $choice_ssl in
1 ) config_ssl_non_le $ssl_hostname_add $ssl_ip_add
;;
2 ) config_ssl_le $ssl_hostname_add $ssl_ip_add
;;
3 ) config_ssl_later
;;
* ) say "Error!" red
exit 1
;;
esac
fi
}
function config_ssl_later
{
echo
echo "No problem! Please take your time and find your certificates."
echo "You can always run this script again and set up SSL certificates for your instances later."
echo "Simply choose Option 4 in the main menu."
/usr/local/bin/trafficserver restart
echo "Thank you for using this script! Have a nice day!"
exit 0
}
function display_license
{
echo
echo '*******************************************************************'
echo '* One-click CDN installation script *'
echo '* Version 0.0.5 *'
echo '* Author: shc (Har-Kuun) https://qing.su *'
echo '* https://github.com/Har-Kuun/OneClickCDN *'
echo '* Thank you for using this script. E-mail: hi@qing.su *'
echo '*******************************************************************'
}
function config_ssl_non_le
{
echo
echo "Please specify your private key file location (e.g., /etc/certs/qing.su.key): "
read priv_key_file
echo "Please specify your certificate file location (e.g., /etc/certs/qing.su.crt): "
read cert_file
echo "Is your certificate chained? (i.e., are CA-certficates already included in your certificate file?) [Y/N]:"
read is_chained
if [ "x${is_chained}" != "xY" ] && [ "x${is_chained}" != "xy" ]
then
echo "Please specify your CA-certificates file location (e.g., /etc/certs/qing.su.ca-bundle): "
read ca_cert_file
fi
# $1 is hostname and $2 is IP
echo "Configuring SSL certificates for $2..."
cp $priv_key_file /etc/trafficserver/ssl/$1.key
cp $cert_file /etc/trafficserver/ssl/$1.crt
if [ -f /etc/trafficserver/ssl/$1.crt ] && [ -f /etc/trafficserver/ssl/$1.key ] ; then
if [ "x${is_chained}" = "xY" ] || [ "x${is_chained}" = "xy" ] ; then
echo "dest_ip=$2 ssl_cert_name=$1.crt ssl_key_name=$1.key" >> /etc/trafficserver/ssl_multicert.config
else
cp $ca_cert_file /etc/trafficserver/ssl/$1.ca.crt
echo "dest_ip=$2 ssl_cert_name=$1.crt ssl_key_name=$1.key ssl_ca_name=$1.ca.crt" >> /etc/trafficserver/ssl_multicert.config
fi
say @B"SSL certificates successfully configured." green
echo "Origin IP: $2"
echo "Private key file: /etc/trafficserver/ssl/$1.key"
echo "Certificate file: /etc/trafficserver/ssl/$1.crt"
if [ "x${is_chained}" != "xY" ] ; then
echo "Intermediate certificate: /etc/trafficserver/ssl/$1.ca.crt"
fi
echo
else
say "SSL configuration failed!" red
echo "Please check the above log."
echo
exit 1
fi
chown -R nobody /etc/trafficserver/ssl/
chmod -R 0760 /etc/trafficserver/ssl/
echo
}
function config_ssl_le
{
origin_ip=$2
hostname_le=$1
echo
echo "Starting to issue free certificate from Let's Encrypt..."
echo "Please keep in mind that this feature is experimental..."
echo
echo "Stopping trafficserver..."
echo "Please input your e-mail address: "
read email_le
/usr/local/bin/trafficserver stop
systemctl stop trafficserver
certbot certonly --standalone --agree-tos --email $email_le -d $hostname_le
cp /etc/letsencrypt/live/${hostname_le}/fullchain.pem /etc/trafficserver/ssl/${hostname_le}.crt
cp /etc/letsencrypt/live/${hostname_le}/privkey.pem /etc/trafficserver/ssl/${hostname_le}.key
if [ -f /etc/trafficserver/ssl/${hostname_le}.key ] ; then
echo "dest_ip=${origin_ip} ssl_cert_name=${hostname_le}.crt ssl_key_name=${hostname_le}.key" >> /etc/trafficserver/ssl_multicert.config
say @B"SSL certificates successfully configured." green
echo "Origin IP: ${origin_ip}"
echo "Private key file: /etc/trafficserver/ssl/${hostname_le}.key"
echo "Certificate file: /etc/trafficserver/ssl/${hostname_le}.crt"
echo
else
say "Let's Encrypt SSL configuration failed!" red
echo "Please check the above log."
echo
exit 1
fi
chown -R nobody /etc/trafficserver/ssl/
chmod -R 0760 /etc/trafficserver/ssl/
systemctl start trafficserver
/usr/local/bin/trafficserver start
echo
}
function display_config_locations
{
echo
echo "General configurations: /etc/trafficserver/records.config"
echo "SSL: /etc/trafficserver/ssl_multicert.config"
echo "Mapping rules: /etc/trafficserver/remap.config"
echo "Cache rules: /etc/trafficserver/cache.config"
echo "Disk cache size: /etc/trafficserver/storage.config"
echo
echo "Log files location: /usr/local/var/log/trafficserver"
echo
echo "For other configurations, check the official wiki:"
echo "https://docs.trafficserver.apache.org/en/latest/admin-guide/files/records.config.en.html#configuration-variables"
echo
echo "Do not forget to restart Traffic Server after modifying config files."
echo "Simply run: \"trafficserver restart\""
echo "Thank you. Press return key to continue."
read catch_all_variable
echo
}
function view_stats
{
cat /etc/trafficserver/hostsavailable.sun
echo
echo "Please specify the website that you would like to check stats."
echo "Note: type in the Origin IP:Port of the origin website."
echo "For example, 88.88.88.88:443."
echo "Please specify:"
read view_stats_host
traffic_logstats -o $view_stats_host
echo
}
function display_useful_commands
{
echo
echo "View Traffic Server stats: traffic_top"
echo "Start/stop/restart Traffic Server: trafficserver start/stop/restart"
echo "Check whether Traffic Server is running: trafficserver status"
echo "Decode via header: traffic_via '[xXxXxX]'"
echo "Reload Traffic Server config files: traffic_ctl config reload"
echo
echo "You can always run this script again to add a CDN website, configure SSL certificates, check stats, etc."
echo
echo "Press return key to continue."
read catch_all_variable
}
function enable_header_rewriter
{
echo
echo "Setting up header rewriter..."
echo "header_rewrite.so /etc/trafficserver/header_rewrite.config" > /etc/trafficserver/plugin.config
touch /etc/trafficserver/header_rewrite.config
say @B"Header rewriter plugin enabled!" green
echo
}
function enable_CORS
{
echo
echo "Setting up cross-origin resource sharing headers..."
echo "rm-header Access-Control-Allow-Origin *" >> /etc/trafficserver/header_rewrite.config
echo "add-header Access-Control-Allow-Origin *" >> /etc/trafficserver/header_rewrite.config
say @B"CORS header added!" green
echo
}
function customize_server_header
{
echo
echo "How would you like your server to be called?"
read cdn_server_header
echo "OK. Setting server header now..."
echo "cond %\{SEND_RESPONSE_HDR_HOOK\} [AND]" >> /etc/trafficserver/header_rewrite.config
echo "cond %{HEADER:server} =ATS/${TS_VERSION}" >> /etc/trafficserver/header_rewrite.config
echo "set-header server \"${cdn_server_header}\"" >> /etc/trafficserver/header_rewrite.config
say @B"Server header set!" green
echo
}
function clear_all_cache
{
echo
echo "Stopping Traffic Server..."
/usr/local/bin/trafficserver stop
echo "Purging all cache..."
traffic_server -Cclear
say @B"Cache purged successfully." green
echo "Starting Traffic Server..."
/usr/local/bin/trafficserver start
echo
}
function purge_single_object
{
echo
echo "Please input the URL to the object that you'd like to purge from cache."
say @B"Please INCLUDE \"http://\" or \"https://\"." yellow
echo
read purge_object_url
read purge_object_domain_name <<< $(echo "$purge_object_url" | awk -F/ '{print $3}')
read purge_object_domain_name_protocol <<< $(echo "$purge_object_url" | awk -F: '{print $1}')
echo
cat /etc/trafficserver/hostsavailable.sun | grep $purge_object_domain_name >/dev/null
if [ $? = 0 ] ; then
if [ "x$purge_object_domain_name_protocol" = "xhttp" ] ; then
purge_object_result=$(curl -vX PURGE --resolve ${purge_object_domain_name}:80:127.0.0.1 ${purge_object_url} 2>&1 | grep " 200")
else
purge_object_result=$(curl -vX PURGE --resolve ${purge_object_domain_name}:443:127.0.0.1 ${purge_object_url} 2>&1 | grep " 200")
fi
if [ -n "$purge_object_result" ] ; then
say @B"Object ${purge_object_url} successfully purged from cache!" green
else
say "Purging ${purge_object_url} failed." red
say "Object not exist or already purged from cache." red
fi
else
say "Error!" red
say "Domain name $purge_object_domain_name does not exist on this server." red
fi
echo "Press enter to return to the main menu."
read catch_all_variable
echo
}
function purge_list_of_objects
{
echo
echo "You are about to purge a list of objects from cache."
say @B"Please specify the absolute path to the file containing the URL of objects." yellow
echo "One URL per line. Please include \"http://\" or \"https://\"."
read purge_object_list_file
echo
if [ -f $purge_object_list_file ] ; then
purge_object_list_result_file="${purge_object_list_file}_result"
printf "%-10s %-12s %s\n" "Type" "Status" "URL" > $purge_object_list_result_file
while read line; do
if [ "x$line" = "x" ] ; then
continue
fi
read purge_object_domain_name <<< $(echo "$line" | awk -F/ '{print $3}')
read purge_object_domain_name_protocol <<< $(echo "$line" | awk -F: '{print $1}')
cat /etc/trafficserver/hostsavailable.sun | grep $purge_object_domain_name >/dev/null
if [ $? = 0 ] ; then
if [ "x$purge_object_domain_name_protocol" = "xhttp" ] ; then
purge_object_result=$(curl -vX PURGE --resolve ${purge_object_domain_name}:80:127.0.0.1 ${line} 2>&1 | grep " 200")
else
purge_object_result=$(curl -vX PURGE --resolve ${purge_object_domain_name}:443:127.0.0.1 ${line} 2>&1 | grep " 200")
fi
if [ -n "$purge_object_result" ] ; then
say @B"PURGE SUCCESS ${line}" green
say @B"PURGE SUCCESS ${line}" green >> $purge_object_list_result_file
else
say "PURGE FAILURE ${line}" red
say "PURGE FAILURE ${line}" red >> $purge_object_list_result_file
fi
else
say "PURGE WRONG DOMAIN ${line}" red
say "PURGE WRONG DOMAIN ${line}" red >> $purge_object_list_result_file
fi
done < $purge_object_list_file
say @B"Completed!" green
say @B"Purging results have been saved to ${purge_object_list_result_file}." green
say @B"You can use \"cat ${purge_object_list_result_file}\" to display the result file." green
else
say "The file you specified does not exist." red
say "Please check." red
fi
echo "Press enter to return to the main menu."
read catch_all_variable
echo
}
function push_single_object
{
echo
echo "Please input the URL to the object that you'd like to push into cache."
say @B"Please INCLUDE \"http://\" or \"https://\"." yellow
echo
read push_object_url
read push_object_domain_name <<< $(echo "$push_object_url" | awk -F/ '{print $3}')
echo
cat /etc/trafficserver/hostsavailable.sun | grep $push_object_domain_name >/dev/null
if [ $? = 0 ] ; then
curl -s -i -o temp "$push_object_url"
cat temp | grep " 200" >/dev/null
if [ $? = 0 ] ; then
curl -s -o /dev/null -X PUSH --data-binary temp "$push_object_url"
say @B"Object $push_object_url successfully pushed into cache!" green
rm -f temp
else
say "Pushing $push_object_url failed." red
say @B"The requested URL cannot be fetched from the Origin server." red
rm -f temp
fi
else
say "Error!" red
say "Domain name $push_object_domain_name does not exist on this server." red
fi
echo "Press enter to return to the main menu."
read catch_all_variable
echo
}
function push_list_of_objects
{
echo
echo "You are about to push a list of objects into cache."
say @B"Please specify the absolute path to the file containing the URL of objects." yellow
echo "One URL per line. Please include \"http://\" or \"https://\"."
read push_object_list_file
echo
if [ -f $push_object_list_file ] ; then
push_object_list_result_file="${push_object_list_file}_result"
printf "%-10s %-12s %s\n" "Type" "Status" "URL" > $push_object_list_result_file
while read line; do
if [ "x$line" = "x" ] ; then
continue
fi
read push_object_domain_name <<< $(echo "$line" | awk -F/ '{print $3}')
cat /etc/trafficserver/hostsavailable.sun | grep $push_object_domain_name >/dev/null
if [ $? = 0 ] ; then
curl -s -i -o temp "$line"
cat temp | grep " 200" >/dev/null
if [ $? = 0 ] ; then
curl -s -o /dev/null -X PUSH --data-binary temp "$line"
say @B"PUSH SUCCESS ${line}" green
say @B"PUSH SUCCESS ${line}" green >> $push_object_list_result_file
rm -f temp
else
say "PUSH FAILURE ${line}" red
say "PUSH FAILURE ${line}" red >> $push_object_list_result_file
rm -f temp
fi
else
say "PUSH WRONG DOMAIN ${line}" red
say "PUSH WRONG DOMAIN ${line}" red >> $push_object_list_result_file
fi
done < $push_object_list_file
say @B"Completed!" green
say @B"Pushing results have been saved to ${push_object_list_result_file}." green
say @B"You can use \"cat ${push_object_list_result_file}\" to display the result file." green
else
say "The file you specified does not exist." red
say "Please check." red
fi
echo "Press enter to return to the main menu."
read catch_all_variable
echo
}
function advanced_cache_control
{
echo
echo "This submenu allows you to add/remove objects to/from cache."
while [ $key != 0 ] ; do
echo
say @B"Advanced cache control." cyan
echo "1 - Purge all cache."
echo "2 - Remove a single object from cache."
echo "3 - Remove a list of objects from cache."
# echo "4 - Push a single object into cache. (experimental)"
# echo "5 - Push a list of objects into cache. (experimental)"
echo "0 - Return to main menu."
echo "Please select 1/2/3/4/5/0: "
read cache_menu_key
case $cache_menu_key in
1 ) clear_all_cache
;;
2 ) purge_single_object
;;
3 ) purge_list_of_objects
;;
4 ) push_single_object
;;
5 ) push_list_of_objects
;;
0 ) break
;;
esac
done
echo
}
function change_cdn_ip
{
echo
echo "Please tell me your old Origin server IP. No domain name required."
read old_ip
echo "OK. Then tell me your new Origin server IP. No domain name required."
read new_ip
sed -i "s/$old_ip/$new_ip/g" /etc/trafficserver/hostsavailable.sun
sed -i "s/$old_ip/$new_ip/g" /etc/trafficserver/ssl_multicert.config
sed -i "s/$old_ip/$new_ip/g" /etc/trafficserver/remap.config
say @B"IP changed from ${old_ip} to ${new_ip}" green
echo
}
function reconfigure_traffic_server
{
echo
echo "Are you sure to reconfigure Traffic Server?"
echo "All previous configurations will be cleared."
echo "Mapping rules and SSL certificate settings will be kept."
say "Would you like to continue? [Y/N]" yellow blue
read do_reconfigure_ts
if [ "x$do_reconfigure_ts" = "xY" ] ; then
echo
echo "Configuring Traffic Server..."
config_main_records
echo
echo "Would you like to configure cache rules automatically? [Y/N]"
read do_config_cache_rules
if [ "x$do_config_cache_rules" = "xY" ] || [ "x$do_config_cache_rules" = "xy" ] ; then
echo "Configuring cache rules..."
config_cache_rules
say @B"Cache rules configured successfully." green
else
echo "You can configure cache rules manually at /etc/trafficserver/cache.config. Make sure to run \"trafficserver restart\" after changing the cache rules."
fi
echo
echo "Configuring cache size..."
config_cache_storage
rm -f /etc/trafficserver/volume.config
config_cache_partitioning
rm -f /etc/trafficserver/header_rewrite.config
enable_header_rewriter
echo "Would you like Traffic Server to cache dynamic content? [Y/N]"
read do_cache_dynamic_content
if [ "x$do_cache_dynamic_content" = "xY" ] || [ "x$do_cache_dynamic_content" = "xy" ] ; then
echo "Updating cache rules..."
config_cache_dynamic_content
else
say @B"Traffic Server will not cache dynamic content!" yellow
echo
fi
echo "Would you like to enable \"Access-Control-Allow-Origin\" header (CORS)?"
echo "Please choose Y if you have no idea what it is. [Y/N]"
read do_enable_CORS
if [ "x$do_enable_CORS" = "xY" ] || [ "x$do_enable_CORS" = "xy" ] ; then
enable_CORS
else
say @B"CORS not configured." yellow
echo
fi
echo "The \"server\" header can be a short phrase, like \"shc-cdn-server 1.0.0\", or \"Traffic Server 8.0.8\"."
echo "If you do not change it, the default value is \"ATS/${TS_VERSION}\""
echo "Would you like to change it? [Y/N]"
read do_change_server_header
if [ "x$do_change_server_header" = "xY" ] || [ "x$do_change_server_header" = "xy" ] ; then
customize_server_header
else
say @B"Server header tag value not changed." yellow
echo
fi
say @B"Configuration successfully finished!" green
echo
else
echo
say @B"Traffic Server not reconfigured." yellow
echo
fi
}
function renew_le_certificate
{
echo
echo "What is the domain name that you wish to renew Let's Encrypt certificate?"
read renew_le_domain
echo "OK. Stopping Traffic Server..."
/usr/local/bin/trafficserver stop
systemctl stop trafficserver
echo
echo "Renewing SSL certificate for ${renew_le_domain}..."
echo
certbot certonly --standalone --agree-tos -d $renew_le_domain
cp -f /etc/letsencrypt/live/${renew_le_domain}/fullchain.pem /etc/trafficserver/ssl/${renew_le_domain}.crt
cp -f /etc/letsencrypt/live/${renew_le_domain}/privkey.pem /etc/trafficserver/ssl/${renew_le_domain}.key
chown -R nobody /etc/trafficserver/ssl/
chmod -R 0760 /etc/trafficserver/ssl/
say @B"SSL certificate for ${renew_le_domain} successfully renewed." green
echo
echo "Starting Traffic Server..."
systemctl start trafficserver
/usr/local/bin/trafficserver start
echo
}
function remove_cdn_website
{
echo
cat /etc/trafficserver/hostsavailable.sun
echo
echo "Please specify the domain name of the website that you would like to remove."
echo "Do NOT include \"http\" or \"https\"."
echo
read website_to_be_deleted
echo
echo "You are about to delete website ${website_to_be_deleted} from this CDN server."
echo "Please note that all configurations, as well as SSL certificate files associated with this domain name will be removed."
say "Are you sure to continue? [Y/N]" yellow blue
read ready_to_be_deleted
if [ "x$ready_to_be_deleted" = "xY" ] || [ "x$ready_to_be_deleted" = "xy" ] ; then
echo
echo "Removing website from server..."
delete_line_in_file $website_to_be_deleted /etc/trafficserver/hostsavailable.sun
delete_line_in_file $website_to_be_deleted /etc/trafficserver/remap.config
delete_line_in_file $website_to_be_deleted /etc/trafficserver/ssl_multicert.config
rm -f /etc/trafficserver/ssl/${website_to_be_deleted}.key
rm -f /etc/trafficserver/ssl/${website_to_be_deleted}.crt
if [ -f /etc/trafficserver/ssl/${website_to_be_deleted}.ca.crt ] ; then
rm -f /etc/trafficserver/ssl/${website_to_be_deleted}.ca.crt
fi
echo
say @B"Website removed!" green
echo "Restarting Traffic Server..."
echo
/usr/local/bin/trafficserver restart
echo
else
echo
say @B"Website not removed!" yellow
echo
fi
}
function say_goodbye
{
echo
if [ $restart_switch = 1 ] ; then
echo "Restarting Traffic Server now..."
/usr/local/bin/trafficserver restart
fi
echo
echo "Thank you for using this script written by https://qing.su"
echo "You can always run this script again to add a CDN website, configure SSL certificates, list current websites, check stats, etc."
echo
echo "Bye! Have a nice day."
echo
key=0
}
function say
{
#This function is a colored version of the built-in "echo."
#https://github.com/Har-Kuun/useful-shell-functions/blob/master/colored-echo.sh
echo_content=$1
case $2 in
black | k ) colorf=0 ;;
red | r ) colorf=1 ;;
green | g ) colorf=2 ;;
yellow | y ) colorf=3 ;;
blue | b ) colorf=4 ;;
magenta | m ) colorf=5 ;;
cyan | c ) colorf=6 ;;
white | w ) colorf=7 ;;
* ) colorf=N ;;
esac
case $3 in
black | k ) colorb=0 ;;
red | r ) colorb=1 ;;
green | g ) colorb=2 ;;
yellow | y ) colorb=3 ;;
blue | b ) colorb=4 ;;
magenta | m ) colorb=5 ;;
cyan | c ) colorb=6 ;;
white | w ) colorb=7 ;;
* ) colorb=N ;;
esac
if [ "x${colorf}" != "xN" ] ; then
tput setaf $colorf
fi
if [ "x${colorb}" != "xN" ] ; then
tput setab $colorb
fi
printf "${echo_content}" | sed -e "s/@B/$(tput bold)/g"
tput sgr 0
printf "\n"
}
function delete_line_in_file
{
delete_pattern=$1
delete_file=$2
grep -v $delete_pattern $delete_file > temp
mv temp $delete_file
}
function run_on_startup
{
cat > /etc/systemd/system/trafficserver.service <<END
[Unit]
Description=Apache Traffic Server
After=network.service systemd-networkd.service network-online.target dnsmasq.service
[Service]
Type=simple
ExecStart=/usr/local/bin/traffic_manager
ExecReload=/usr/local/bin/traffic_ctl config reload
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
END
chmod 644 /etc/systemd/system/trafficserver.service
systemctl daemon-reload
systemctl enable trafficserver.service
}
function main
{
current_dir=$(pwd)
display_license
OS=UNSUPPORTED
if [ "x$OS_CHECK_ENABLED" != "xOFF" ] ; then
check_OS
fi
echo
say @B"Your OS is $OS" green
echo
echo "Checking Traffic Server installation..."
check_TS
if [ $TS_INSTALLED = 0 ] ; then
echo
say @B"Traffic Server not installed. Would you like to install it now?" yellow
echo
echo "Depending on your server specs, you may or may not need to add some SWAP before you proceed."
echo "This script needs 1500 MB of RAM for the first time to build from source. It runs perfectly on a 512 MB VPS once it finishes the installation."
echo "If you think you don't have enough RAM now, please quit, add more SWAP, and run this script again."
echo
say "Please indicate if you would like to install now: (Y/N)" yellow blue
read install_or_not
if [ "x$install_or_not" != "xY" ] && [ "x$install_or_not" != "xy" ] ; then
echo
say "Aborted!" red
echo
exit 0
fi
if [ "x$OS" = "xCENTOS7" ] || [ "x$OS" = "xCENTOS8" ] ; then
install_TS_CentOS
else
install_TS
fi
echo
echo "Configuring Traffic Server..."
config_main_records
echo
echo "Would you like to configure cache rules automatically? [Y/N]"
read do_config_cache_rules
if [ "x$do_config_cache_rules" = "xY" ] || [ "x$do_config_cache_rules" = "xy" ] ; then
echo "Configuring cache rules..."
config_cache_rules
say @B"Cache rules configured successfully." green
else
echo "You can configure cache rules manually at /etc/trafficserver/cache.config. Make sure to run \"trafficserver restart\" after changing the cache rules."
fi
echo
echo "Configuring cache size..."
config_cache_storage
config_cache_partitioning
enable_header_rewriter
echo "Would you like Traffic Server to cache dynamic content? [Y/N]"
read do_cache_dynamic_content
if [ "x$do_cache_dynamic_content" = "xY" ] || [ "x$do_cache_dynamic_content" = "xy" ] ; then
echo "Updating cache rules..."
config_cache_dynamic_content
else
say @B"Traffic Server will not cache dynamic content!" yellow
echo
fi
echo "Would you like to enable \"Access-Control-Allow-Origin\" header (CORS)?"
echo "Please choose Y if you have no idea what it is. [Y/N]"
read do_enable_CORS
if [ "x$do_enable_CORS" = "xY" ] || [ "x$do_enable_CORS" = "xy" ] ; then
enable_CORS
else
say @B"CORS not configured." yellow
echo
fi
echo "The \"server\" header can be a short phrase, like \"shc-cdn-server 1.0.0\", or \"Traffic Server 8.0.8\"."
echo "If you do not change it, the default value is \"ATS/${TS_VERSION}\""
echo "Would you like to change it? [Y/N]"
read do_change_server_header
if [ "x$do_change_server_header" = "xY" ] || [ "x$do_change_server_header" = "xy" ] ; then
customize_server_header
else
say @B"Server header tag value not changed." yellow
echo
fi
say @B"Configuration successfully finished!" green
echo "Please proceed to the next step and add your first CDN website."
restart_switch=1
echo
else
echo
say @B"Traffic Server installed and running!" green
restart_switch=0
echo
fi
key=1
while [ $key != 0 ] ; do
echo
say @B"How can I help you today?" cyan
echo
echo "1 - List all current CDN websites."
echo "2 - Advanced cache control."
echo "3 - Add a CDN website."
echo "4 - Configure SSL for a website."
echo "5 - Locate configuration and log files."
echo "6 - View stats of a website."
echo "7 - List useful commands."
echo "8 - Display author information."
echo "11 - Change IP address of a website."
echo "12 - Remove a CDN website."
echo "13 - Reconfigure Traffic Server."
echo "14 - Renew Let's Encrypt certificates."
echo "0 - Save all changes and quit this script."
echo "Please select 1/2/3/4/5/6/7/8/11/12/13/14/0: "
read key
case $key in
1 ) echo
cat /etc/trafficserver/hostsavailable.sun
;;
2 ) advanced_cache_control
;;
3 ) add_cdn
restart_switch=1
;;
4 ) config_ssl_selection
restart_switch=1
;;
5 ) display_config_locations
;;
6 ) view_stats
;;
7 ) display_useful_commands
;;
8 ) display_license
;;
73 ) if [ "x$REVERSE_PROXY_MODE_ENABLED" = "xON" ] ; then
add_reverse_proxy
fi
restart_switch=1
;;
11 ) change_cdn_ip
restart_switch=1
;;
12 ) remove_cdn_website
restart_switch=1
;;
13 ) reconfigure_traffic_server
restart_switch=1
;;
14 ) renew_le_certificate
;;
0 ) say_goodbye
;;
esac
done
exit 0
}
###############################################################
# #
# The main function starts here. #
# #
###############################################################
main
##############################################################cdnpluse搭建cdn 包含主控和节点#################################################################
和CDNBest类似,主控在CDNPlus云端。注:本人不保证是否有风险。
这边建议自建CDN还是选择自己用Nginx比较好哦。
安装
wget https://www.cdnplus.cn/download/install.sh –no-check-certificate
chmod +x install.sh
./install.sh
iptables -F
service cdnplus start
cat /opt/CDNPlus/Bin/TokenFile #获取Token
测试通过平台: CentOS 7.x(64位操作系统), 其它版本稍后发布
注意:安装过旧版客户端的系统,请先运行 service cdnplus uninstall 再进行以下操作
第一步: 下载安装包,在终端下执行
yum install wget -y && wget https://www.cdnplus.cn/download/cdnplus.el7.x86_64.rpm --no-check-certificate -O cdnplus.el7.x86_64.rpm
第二步: 执行安装cdnplus客户端的命令
yum localinstall cdnplus.el7.x86_64.rpm -y
第三步:安装完成后,运行cdnplus服务
service cdnplus-update start && service cdnplus start
最后:在管理中心处,添加节点,所需的认证信息通过以下命令获取
cat /opt/CDNPlus/Bin/TokenFile
后期删除:删除卸载客户端命令
yum remove cdnplus -y
手动更新:按照上面第一、二步骤操作
手动更新:操作命令
wget https://www.cdnplus.cn/download/cdnplus.el7.x86_64.rpm --no-check-certificate -O cdnplus.el7.x86_64.rpm && yum localinstall cdnplus.el7.x86_64.rpm -y && service cdnplus-update restart && service cdnplus restart
Linux主控安装
测试通过平台: CentOS 7.x(64位操作系统,建议使用7.6或低于7.6的版本), 其它版本稍后发布
注意:安装之前,需要在管理中心开通“独立部署”功能授权。
云服务器有安全策略的机器,需放行以下端口:TCP 80 514 5672 8000 8100 15672 UDP 514
提醒:主控服务器最低配置2核4G 50G,推荐4核8G 100G以上。
第一步: 登录后台,在授权管理->主控配置页面,添加主控的相关信息
第二步: 下载安装包,在终端下执行
yum install wget -y && wget https://download.cdnplus.cn/setup --no-check-certificate -O setup
第三步: 执行安装cdnplus主控的命令
setenforce 0; chmod +x setup && ./setup
第四步:安装过程一般会耗费几分到十几分钟,请耐心等待
安装过程中,会要求创建一个超级管理员,创建完成后才会继续输入!
最后:安装成功后,直接访问配置的“主控域名”取可。
升级: 升级命令
yum install wget -y ; wget https://download.cdnplus.cn/setup --no-check-certificate -O setup; setenforce 0; chmod +x setup && ./setup --update
浙公网安备 33010602011771号