Подмена сайта nginx
Подмена сайта nginx – на самом деле очень просто реализуемая фича. На данном примере, мы рассмотрим с вами на конкретном примере начиная с установки nginx и необходимых модулей к нему,а также для кучи рассмотрим конфиги nginx и php7 для wordpress. Будем подменять исходный сайт https://itc-life.ru на https://riderson.ru. Так же рассмотрим установку сертификата lets’s encrypt(ssl), настроим кэширование fastcgi и proxy pass cache. Итак приступим. Что мы имееем:
– выделенный vps на firstvsd всего за 240 рублей в месяц – норм цена.
– система debian 8;
– желание сделать все самому и не работать на тормознутых хостингах )).
Установка openresty(сборка nginx) и необходимых модулей
Я подготовил сборку и загрузил сюда. Вы можете все найти в интернете или скачать отсюда.Ставим пакеты для сборки
apt install libpq-dev checkinstall build-essential libpcre++-dev checkinstall gcc+ zip git -y
Скачиваем сборку и необходимые пакеты. Конфигурируем и устанавливаем.
#!/bin/bash
CODENAME=`grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g |sed s/[0-9]//g | sed s/\)$//g |sed s/\(//g`
cd /tmp
wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
tar -zxvf GeoIP.tar.gz
cd GeoIP-1.4.8
./configure
make
make install
mkdir ~/src/
cd ~/src
apt install libpq-dev checkinstall build-essential libpcre++-dev checkinstall gcc+ zip git -y
wget https://nginx.ru/keys/nginx_signing.key
apt-key add nginx_signing.key
cat < /etc/apt/sources.list.d/nginx.list
deb http://nginx.org/packages/mainline/debian/ $CODENAME nginx
deb-src http://nginx.org/packages/mainline/debian/ $CODENAME nginx
OEF
apt-get update
#apt-get install nginx -y
wget https://openresty.org/download/openresty-1.11.2.2.tar.gz
tar -xvf openresty-1.11.2.2.tar.gz
cd openresty-1.11.2.2
git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
wget https://github.com/pagespeed/ngx_pagespeed/archive/latest-stable.tar.gz
tar -xvf latest-stable.tar.gz
git clone https://github.com/openssl/openssl.git
cd openssl
git checkout OpenSSL_1_0_2h
cd ..
cd ngx_pagespeed-latest-stable/
wget https://dl.google.com/dl/page-speed/psol/1.11.33.4.tar.gz
tar -xzvf 1.11.33.4.tar.gz
cd ..
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=www-data --group=www-data --with-cc-opt="-I/usr/local/include" --with-ld-opt="-L/usr/local/lib" --with-pcre-jit --with-ipv6 --with-http_gunzip_module --with-http_gzip_static_module --with-threads --with-http_v2_module --add-module=ngx_pagespeed-latest-stable --with-http_ssl_module --with-file-aio --with-http_realip_module --with-openssl=openssl --add-module=ngx_http_substitutions_filter_module --with-http_geoip_module && make -j4 && make install
mkdir /etc/nginx/GeoIp/
/usr/bin/curl http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz | gzip -d - > /etc/nginx/GeoIp/GeoIP.dat
Мы подразумеваем что у вас есть уже настроенный основной сайт на wordpress, например itc-life.ru, и нам необходимо, только создать конфиг для прокси сайта с подменой.
Сначала добавим поддержку nginx_page_speed
nano /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_rlimit_nofile 65535;
events {
worker_connections 1024;
}
http {
server_names_hash_bucket_size 128;
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
pagespeed on;
pagespeed FileCachePath "/nginxpagespeed";
pagespeed EnableFilters combine_css,combine_javascript,rewrite_images,rewrite_css,rewrite_javascript,inline_images,recompress_jpeg,recompress_png,resize_images;
pagespeed JpegRecompressionQuality 85;
pagespeed ImageRecompressionQuality 85;
pagespeed ImageInlineMaxBytes 2048;
pagespeed LowercaseHtmlNames on;
access_log /var/log/nginx/access.log main;
resolver 8.8.8.8 8.8.4.4;
sendfile on;
#tcp_nopush on;
proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 256;
keepalive_timeout 65;
fastcgi_ignore_client_abort on;
gzip on;
include /etc/nginx/conf.d/*.conf;
}
Создадим каталог для pagespeed
mkdir -p /nginxpagespeed
Отредактируем fstab и положим его в оперативу
nano /etc/fstab
tmpfs /nginxpagespeed tmpfs uid=www-data,gid=www-data,mode=777,size=2G,noatime 0 0
mount /nginxpagespeed
Теперь правим конфиг сайта
nano /etc/nginx/conf.d/riderson.ru.conf
upstream itc-life { server itc-life.ru; }
server {
listen 80;
server_name
riderson.ru
www.riderson.ru
;
access_log /var/log/nginx/6pm.access.log;
error_log /var/log/nginx/6pm.error.log;
rewrite ^/(.*)$ https://riderson.ru/$1 permanent;
}
server {
listen 443 ssl http2;
server_name
riderson.ru
www.riderson.ru
;
ssl_stapling on;
ssl on;
ssl_certificate /etc/letsencrypt/live/riderson.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/riderson.ru/privkey.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 24h;
ssl_session_cache shared:SSL:2m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000;";
add_header Content-Security-Policy-Report-Only "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https: data:; report-uri /csp-report";
access_log /var/log/nginx/riderson.ru.access.log;
error_log /var/log/nginx/riderson.ru.error.log;
location / {
root /var/www/riderson;
try_files $uri @static;
}
location @static {
proxy_cache cache;
proxy_cache_valid 10m;
proxy_cache_valid 404 1m;
###Фильтры для замены значений
subs_filter 'UA-68656776-1' 'UA-68656776-2' gi;
subs_filter "'.itc-life.ru']," "'riderson.ru']," gi;
subs_filter "www.itc-life.ru" "riderson.ru" gi;
subs_filter "itc-life.ru" "riderson.ru" gi;
subs_filter "32958824" "43731964" gi;
proxy_cookie_domain itc-life.ru riderson.ru;
proxy_set_header Accept-Encoding "";
proxy_set_header Host itc-life.ru;
proxy_pass https://itc-life.ru;
proxy_redirect https://itc-life.ru https://riderson.ru;
}
}
Готово. Обратите внимание на subs_filter - замена с сайта донора на значений на новом сайте зеркале, т.е. мы подменили счетчики, доменные имена - и еще большой простор для деятельности.
Блокируем страны через geoip в nginx - ограничение доступа.
В /etc/nginx/nginx.conf
####Белый список серых сетей ))
geo $lanip {
default no;
192.168.1.0/24 yes;
10.0.0.0/24 yes;
0.0.0.0/8 yes;
10.0.0.0/8 yes;
10.1.9.0/24 yes;
100.64.0.0/10 yes;
127.0.0.0/8 yes;
169.254.0.0/16 yes;
172.16.0.0/12 yes;
192.0.0.0/24 yes;
192.0.0.0/29 yes;
192.0.0.8/32 yes;
192.0.0.170/32 yes;
192.0.0.171/32 yes;
192.0.2.0/24 yes;
192.31.196.0/24 yes;
192.52.193.0/24 yes;
192.88.99.0/24 yes;
192.168.0.0/16 yes;
192.175.48.0/24 yes;
198.18.0.0/15 yes;
198.51.100.0/24 yes;
203.0.113.0/24 yes;
240.0.0.0/4 yes;
}
###Белый список стран
map $geoip_country_code $allowed_country {
default no;
RU yes;
UA yes;
BY yes;
LV yes;
KZ yes;
}
В конфиге сайта
###Блокируем доступ по ip
if ($lanip = yes) {
set $allowed_country yes;
}
if ($allowed_country = no) {
return 401;
}
Nginx init.d script
#!/bin/sh
#
# chkconfig: 2345 55 25
# Description: Nginx init.d script, put in /etc/init.d, chmod +x /etc/init.d/nginx
# For Debian, run: update-rc.d -f nginx defaults
# For CentOS, run: chkconfig --add nginx
#
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: nginx init.d script
# Description: OpenResty (aka. ngx_openresty) is a full-fledged web application server by bundling the standard Nginx core, lots of 3rd-party Nginx modules, as well as most of their external dependencies.
### END INIT INFO
#
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin/
if [ -L $0 ]; then
SCRIPTNAME=`/bin/readlink -f $0`
else
SCRIPTNAME=$0
fi
sysconfig=`/usr/bin/basename $SCRIPTNAME`
[ -r /etc/default/$sysconfig ] && . /etc/default/$sysconfig
DESC=${DESC-nginx}
NAME=${NAME-nginx}
CONFFILE=/etc/nginx/nginx.conf
DAEMON=/usr/sbin/nginx
PIDFILE=/var/run/nginx.pid
SLEEPSEC=1
UPGRADEWAITLOOPS=5
CHECKSLEEP=${CHECKSLEEP-3}
#status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $?
[ -x $DAEMON ] || exit 0
DAEMON_ARGS="-c $CONFFILE $DAEMON_ARGS"
. /lib/init/vars.sh
. /lib/lsb/init-functions
do_start()
{
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS
RETVAL="$?"
return "$RETVAL"
}
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --oknodo --retry=TERM/30/KILL/5 --pidfile $PIDFILE
RETVAL="$?"
rm -f $PIDFILE
return "$RETVAL"
}
do_reload() {
#
start-stop-daemon --stop --signal HUP --quiet --pidfile $PIDFILE
RETVAL="$?"
return "$RETVAL"
}
do_configtest() {
if [ "$#" -ne 0 ]; then
case "$1" in
-q)
FLAG=$1
;;
*)
;;
esac
shift
fi
$DAEMON -t $FLAG -c $CONFFILE
RETVAL="$?"
return $RETVAL
}
do_upgrade() {
OLDBINPIDFILE=$PIDFILE.oldbin
do_configtest -q || return 6
start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE
RETVAL="$?"
for i in `/usr/bin/seq $UPGRADEWAITLOOPS`; do
sleep $SLEEPSEC
if [ -f $OLDBINPIDFILE -a -f $PIDFILE ]; then
start-stop-daemon --stop --signal QUIT --quiet --pidfile $OLDBINPIDFILE
RETVAL="$?"
return
fi
done
echo $"Upgrade failed!"
RETVAL=1
return $RETVAL
}
do_checkreload() {
templog=`/bin/mktemp --tmpdir nginx-check-reload-XXXXXX.log`
trap '/bin/rm -f $templog' 0
/usr/bin/tail --pid=$$ -n 0 --follow=name /var/log/nginx/error.log > $templog &
/bin/sleep 1
start-stop-daemon --stop --signal HUP --quiet --pidfile $PIDFILE
/bin/sleep $CHECKSLEEP
/bin/grep -E "\[emerg\]|\[alert\]" $templog
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $?
;;
configtest)
do_configtest
;;
upgrade)
do_upgrade
;;
reload|force-reload)
log_daemon_msg "Reloading $DESC" "$NAME"
do_reload
log_end_msg $?
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" "$NAME"
do_configtest -q || exit $RETVAL
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
check-reload)
do_checkreload
RETVAL=0
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload|upgrade|configtest|check-reload}" >&2
exit 3
;;
esac
exit $RETVAL
Делаем исполняемым
chmod +X /etc/init.d/nginx
Разрешаем
systemctl unmask nginx
Запускаем
/etc/init.d/nginx start