Подмена сайта nginx. Openresty with openssl-1.0.2h ngx_http_substitutions_filter_module ngx_pagespeed. Защита через GEOIP

Подмена сайта 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
Опубликовано в Nginx

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

 

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.