Blog

  • Сборка своего Dockerfile c PHP 5.3 + ioncube + memcache

    Понадобилось собрать образ с PHP 5.3 + ioncube + memcache для развертывания древнего сайта на новом сервере, получилось как-то так:

    Dockerfile

    FROM ubuntu:12.04
    MAINTAINER Alexander Schenkel <alex@alexi.ch>
    
    VOLUME ["/var/www"]
    
    RUN apt-get update && \
        apt-get install -y \
          wget \
          apache2 \
          php5 \
          php5-cli \
          libapache2-mod-php5 \
          php5-gd \
          php5-ldap \
          php5-mysql \
          php5-pgsql \
          php5-memcached \
          php5-memcache
    
    #install ioncube
    RUN wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
    RUN tar xvfz ioncube_loaders_lin_x86-64.tar.gz
    RUN cp ioncube/*.so /usr/lib/php5/2*/
    RUN echo zend_extension = /usr/lib/php5/2*/ioncube_loader_lin_5.3.so > /etc/php5/apache2/conf.d/00-ioncube.ini
    RUN service apache2 restart
    
    COPY apache_default /etc/apache2/sites-available/default
    COPY run /usr/local/bin/run
    RUN echo "extension=memcached.so" >> /etc/php5/apache2/php.ini
    RUN chmod +x /usr/local/bin/run
    RUN a2enmod rewrite
    
    EXPOSE 80
    CMD ["/usr/local/bin/run"]
    Code language: PHP (php)

    собираем образ

    docker build --tag myphp53:1.0 .Code language: CSS (css)

    docker-compose.yml

    version: '2'
    
    networks:
      app-tier:
          driver: bridge
    
    services:
        memcached:
            image: 'bitnami/memcached:latest'
            networks:
                - app-tier
        php53:
            image: 'myphp53:1.0'
            volumes:
                - "/var/www/vhosts/site.ru/httpdocs:/var/www"
            ports:
                - "8080:80"
                                            
            networks:
                - app-tierCode language: JavaScript (javascript)

    и потом

    docker-compose up -d
  • PHP 5.3 в debian\ubuntu

    Наверное самый без проблемный вариант запуска древнего софта на свежем сервере не ломая зависимостей и не компилируя чёрти что

    $ docker run -d -p 8080:80 \
         -v /home/user/webroot:/var/www \
         -e PHP_ERROR_REPORTING='E_ALL & ~E_STRICT' \
         bylexus/apache-php53Code language: JavaScript (javascript)

    придумал не я, вот оно всё от сюда

    https://github.com/bylexus/docker-apache-php53

    запустится контейнер, что будет слушать 8080 порт и подмонтирует ваш старый код из /home/user/webroot

    осталось только настроить nginx чтоб перенаправлял запросы в 8080

    ну и сайту из контейнера нужен доступ к внешней для него mysql базе, не забывайте изменить настройки для доступа из контейнера.

    а так очень удобно

  • Настроить прокси для Telegram

    Раз пошла такая пляска, и основные читатели блога это люди не последние в ИТ, для вас пост:
    1 купить виртуалку за 1 евро в месяц ( например тут )
    2 выполнить 2-3 простейшие команды по установке и настройке dante, я использовал вот этот репозиторий

    wget --no-check-certificate https://raw.github.com/Lozy/danted/master/install.sh -O install.sh 
    bash install.sh

    после чего добавляем пользователей, себе и хорошим друзьям

    /etc/init.d/sockd adduser USERNAME PASSWORD

    теперь можно сообщить им вот такую вот урлу

    https://t.me/socks?server=IP&port=2016&user=USER&pass=PASS

    IP
    USER
    PASS
    ставим свои и радуемся, всё работает отлично

  • OpenVPN поверх PPPOE ( openvpn over pppoe redirect-gateway def1 )

    Существует проблема замены маршрута по умолчанию при использовании openvpn поверх pppoe
    дело в том, что pppoe поднимается с неправильным маршрутом по умолчанию, выглядит он вот так

    Таблица маршутизации ядра протокола IP
    Destination Gateway Genmask Flags Metric Ref Use Iface
    0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 ppp0

    опенвпну не нравится gateway поэтому его нужно исправить, например на вот такой

    Таблица маршутизации ядра протокола IP
    Destination Gateway Genmask Flags Metric Ref Use Iface
    0.0.0.0         222.222.222.22  0.0.0.0         UG    0      0        0 ppp0

    для этого создадим файл

    /etc/ppp/ip-up.d/default-gateway

    не забываем задать ему chmod u+x
    с таким содержимым

    #!/bin/bash
    
    if [ $(ip route list exact default |\
      awk '/^default/ {print $2}') = dev ];
    then
             IF=$(ip route | awk '/^default/ {print $3}')
             GW=$(ip address show $IF |\
      awk '/peer/ {print $4}' | cut -d"/" -f1)
             ip route replace default via $GW dev $IF
    fi

    если руками выполнить этот скрипт то он предложит сделать примерно вот такое

    ip route replace default via 222.222.222.22 dev ppp0

    После чего опенвпн успешно подменит маршрут на свой, и трафик полетит в нужную сторону.

    если до какого-то хоста нам нужно пустить трафик вне ОпенВПна, например до своего хоста, для подключения по ssh, то в этот же файл добавляем

    #my route 91.91.91.91
    route add 91.91.91.91 gw 222.222.222.22 dev ppp0

    если шлюз динамический, то используем $GW вместо 222.ххх

  • PowerShell контроль доступности сайта с перезапуском демона

    однажды с бэк-эндом одного далёкого сервера случался кабздец, и он перестал отзываться, при этом статику сервер отдавал, а то, что обрабывает JAVA код, то видимо ломалось.
    как временная мера такому безобразию был накидан примерно вот такой скрипт.
    коль баш мне роднее, то пришлось немного погуглить, и нагуглилась вот эта страничка с функцией проверки сайта

    Using PowerShell to Query Web Site Information


    на всякий случай привожу код ниже полностью.

     function Get-WebSite {
    <#  
    .SYNOPSIS  
        Retrieves information about a website.
    .DESCRIPTION
        Retrieves information about a website.
    .PARAMETER Url
        URL of the website to test access to.
    .PARAMETER UseDefaultCredentials
        Use the currently authenticated user's credentials  
    .PARAMETER Proxy
        Used to connect via a proxy
    .PARAMETER TimeOut
        Timeout to connect to site, in milliseconds
    .PARAMETER Credential
        Provide alternate credentials              
    .NOTES  
        Name: Get-WebSite
        Author: Boe Prox
        DateCreated: 08Feb2011        
    .EXAMPLE  
        Get-WebSite -url "http://www.bing.com"
         
    Description
    ------------
    Returns information about Bing.Com to include StatusCode and type of web server being used to host the site.
     
    #>
    [cmdletbinding(
        DefaultParameterSetName = 'url',
        ConfirmImpact = 'low'
    )]
        Param(
            [Parameter(
                Mandatory = $True,
                Position = 0,
                ParameterSetName = '',
                ValueFromPipeline = $True)]
                [string][ValidatePattern("^(http|https)\://*")]$Url,
            [Parameter(
                Position = 1,
                Mandatory = $False,
                ParameterSetName = 'defaultcred')]
                [switch]$UseDefaultCredentials,
            [Parameter(
                Mandatory = $False,
                ParameterSetName = '')]
                [string]$Proxy,
            [Parameter(
                Mandatory = $False,
                ParameterSetName = '')]
                [Int]$Timeout,
            [Parameter(
                Mandatory = $False,
                ParameterSetName = 'altcred')]
                [switch]$Credential            
                             
            )
    Begin {     
        $psBoundParameters.GetEnumerator() | % { 
            Write-Verbose "Parameter: $_" 
            }
        
        #Create the initial WebRequest object using the given url
        Write-Verbose "Creating the web request object"        
        $webRequest = [net.WebRequest]::Create($url)
         
        #Use Proxy address if specified
        If ($PSBoundParameters.ContainsKey('Proxy')) {
            #Create Proxy Address for Web Request
            Write-Verbose "Creating proxy address and adding into Web Request"
            $webRequest.Proxy = New-Object -TypeName Net.WebProxy($proxy,$True)
            }
             
        #Set timeout
        If ($PSBoundParameters.ContainsKey('TimeOut')) {
            #Setting the timeout on web request
            Write-Verbose "Setting the timeout on web request"
            $webRequest.Timeout = $timeout
            }        
         
        #Determine if using Default Credentials
        If ($PSBoundParameters.ContainsKey('UseDefaultCredentials')) {
            #Set to True, otherwise remains False
            Write-Verbose "Using Default Credentials"
            $webrequest.UseDefaultCredentials = $True
            }
        #Determine if using Alternate Credentials
        If ($PSBoundParameters.ContainsKey('Credentials')) {
            #Prompt for alternate credentals
            Write-Verbose "Prompt for alternate credentials"
            $wc.Credential = (Get-Credential).GetNetworkCredential()
            }            
             
        #Set TimeStamp prior to attempting connection    
        $then = get-date
        }
    Process {    
        Try {
            
            #Make connection to gather response from site
            $response = $webRequest.GetResponse()
            #If successful, get the date for comparison
            $now = get-date         
                     
            #Generate report
            Write-Verbose "Generating report from website connection and response"  
            $report = @{
                URL = $url
                StatusCode = $response.Statuscode -as [int]
                StatusDescription = $response.StatusDescription
                ResponseTime = "$(($now - $then).totalseconds)"
                WebServer = $response.Server
                Size = $response.contentlength
                Date = $now
                } 
                
                $report | Out-File -FilePath c:\Tools\checkServer_log.txt -Append                    
            }
        Catch {
            #Get timestamp of failed attempt
            $now = get-date
            #Put the current error into a variable for later use
            $errorstring = "$($error[0])"
            
            Restart-Service ApacheTomCat9
            
            #Generate report
            $report = @{
                URL = $url
                StatusCode = ([regex]::Match($errorstring,"\b\d{3}\b")).value
                StatusDescription = (($errorstring.split('\)')[2]).split('.\')[0]).Trim()
                ResponseTime = "$(($now - $then).totalseconds)"
                WebServer = $response.Server
                Size = $response.contentlength
                Date = $now            
                } 
            $report | Out-File -FilePath c:\Tools\checkServer_error_log.txt -Append;  
    
            }                        
        }
    End {        
        #Display Report    
        New-Object PSObject -property $report 
        }    
    }
    
     for(;;) {
     try {
        # invoke the worker script
        Get-WebSite -url "https://site.ru/Form.php" -TimeOut "15000" -Verbose
     }
     catch {
      # do something with $_, log it, more likely
     }
    
     # wait for a minute
     Start-Sleep 60
    }
    

    чуть выше в коде есть комментарий про соль нашу, это как раз если что-то пошло не так, то рестарт демона
    дальше берём вызов этой функции в бесконечный цикл, с паузой 60 секунд, и проверяем…

    for(;;) {
    try {
    # invoke the worker script
    Get-WebSite -url "https://site.ru/Form.php" -TimeOut "15000" -Verbose
    }
    catch {
    # do something with $_, log it, more likely
    }
    
    # wait for a minute
    Start-Sleep 60
    }
    

    это просто черновик чтоб не забыть. дальше возможно дополню его