apache nginx полноценная связка с ispconfig 3

В прошлом, я уже писал две статьи, посвященные этому вопросу. Но все же, решение было однобоким, поскольку для отдельного сайта nginx конфигурационные файлы не создавались. А проксирование работало по дефолту. Что в свою очередь влекло неизбежные проблемы с переадресацией www и без него. (что в свою очередь все же я решил). А вот проблемы с явно выставленным ip адресом и дописывание частного конфига ручками можно было решить только генерацией icpconfig нового конфиг файла каждый раз для данного сайта. Собственно представляю уже 3 версию связки в данном случае уже в виде полноценного скрипта от А до Я. И детальным описание последнего. В данной статье я не буду в третий раз описывать способ установки самого icpconfig3 и заменю его уже готовым инсталляционным скриптом моего коллеги по оружию поскольку автор скрипта попросил убрать ссылку ибо — «Это не для свободного скачивания!!!!», так что дам ссылку на страничку проекта, думаю уж прямая ссылка на сайт вполне подойдет.

Установка происходит на чистом debian 7 mini

Ниже будет приведено детальное описание каждого этапа скрипта, для удобства он выложен в виде sh скрипта, и сделает все ниже приведенное. Фактически отвечайте на вопросы и получаете готовую систему.

Скачать сам скрипт можно ТУТ

Закачиваем скрипт автоматической установки ispconfig3 и устанавливаем его.

Далее переводим apache2 на 82 порт.

  sed -i 's/80/82/g' /etc/apache2/ports.conf
  sed -i 's/:80/:82/g' /etc/apache2/sites-available/default
  sed -i 's/:80/:82/g' /etc/apache2/sites-available/ispconfig.conf
  /etc/init.d/apache2 restart

Соответственно, если у вас уже есть сайты изменить порты нужно будет и в этих конфигах, или в ispconfig > tools> resinc>. И поставить галочки на resinc websites.

Ставим nginx и модуль для валидного логирования в apache.

  apt-get install nginx
  apt-get install libapache2-mod-rpaf
  IP=$(ifconfig | grep inet | grep -v inet6 | grep -v 127.0.0.1 | cut -d: -f2 | awk '{printf $1"\n"}') && echo "RPAFproxy_ips 127.0.0.1 $IP" >> /etc/apache2/apache2.conf

Пусть вас не пугает последняя строка, она хоть и странная, но делает свое дело, подставляет ваш внешний ip .

Удаляем default конфиги nginx и заменяем их на свои. Обратите внимание, что новые конфиги будут работать и без последующей генерации vhost файлов для каждого сайта, но будут небольшие проблемы с www. Как и их решить у меня описано в предыдущей статье. Но в нашем случае все сайты будут иметь свой конфиг посему к нам это не относится.

  rm /etc/nginx/sites-available/default

Вставляем новый конфиг, обратите внимание вставляем именно так, или качаем файл, поскольку, при использование <<EOF, все $ приходится экранировать \$ и при копирование просто куска конфига, вы получите экранированные спецсимволы вместо правильного файла.

  cat >> /etc/nginx/sites-available/default <<EOF
     server {      
      listen   80 default;   
      server_name  _; 
      server_name_in_redirect  off; 
      resolver  127.0.0.1;     
      error_page 404 = @fallback; 
      #--------------Все 404  отдаем на обработку апача------------------------------- 
      location @fallback { 
          proxy_pass http://\$host:82; 
          proxy_set_header Host \$host; 
          proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; 
          proxy_set_header X-Real-IP \$remote_addr; 
      } 
      #--------------Статический контент отдаем на прямую----------------------------- 
      location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|flv|mp3)\$ { 
          root /var/www/\$host/web; 
          access_log off; 
          expires 30d; 
      } 
      #--------------HTML Вывел отдельно поскольку файлы могут быть динамические------- 
      location ~* ^.+\.(htm|html)\$ { 
          root /var/www/\$host/web; 
          #try_files \$uri /index.php ;  
          access_log off; 
          expires 30d; 
      } 
      # -------------Основнйо локейшен ----------------------------------------------- 
      location / { 
          root /var/www/\$host/web; 
          index index.php index.html index.htm; 
          access_log   off; 
          proxy_pass http://\$host:82; 
          proxy_set_header X-Real-IP \$remote_addr; 
          proxy_set_header Host \$host; 
          proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; 
      } 
      #-------------- Настройки для phpmyadmin---------------------------------------- 
      location /phpmyadmin { 
          root /usr/share/; 
          index index.php index.html index.htm; 
          location ~ ^/phpmyadmin/(.+\.php)\$ { 
          try_files \$uri =404; 
          root /usr/share/; 
          proxy_pass http://\$host:82; 
          proxy_set_header X-Real-IP \$remote_addr; 
          proxy_set_header Host \$host; 
          proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; 
      } 
      location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))\$ { 
          root /usr/share/; 
      } 
      } 
      location /phpMyAdmin { 
          rewrite ^/* /phpmyadmin last; 
      } 
      #------------- WEBMAIL---------------------------------------------------------- 
      location /webmail { 
          root /var/www/apps; 
          index index.php index.html index.htm; 
          proxy_pass http://\$host:82; 
          proxy_set_header X-Real-IP \$remote_addr; 
          proxy_set_header Host \$host; 
          proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; 
          location ~* ^/webmail/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))\$ { 
          root /var/www/apps; 
      } 
      } 
      #---------------AWSTATS--------------------------------------------------------- 
      location ^~ /awstats-icon { 
          alias /usr/share/awstats/icon/; 
          access_log off; 
      } 
      location ^~ /awstatscss { 
          alias /usr/share/doc/awstats/examples/css/; 
          access_log off; 
      } 
          location ^~ /awstatsclasses { 
          alias /usr/share/doc/awstats/examples/classes/;                   
          access_log off; 
      } 
}   # Закрывает весь server !!! 
EOF

Далее удаляем основной конфигурационный файл nginx.conf и заменяем на свой.

  rm /etc/nginx/nginx.conf
  cat >> /etc/nginx/nginx.conf <<EOF
     user www-data; 
     #выставите worker_processes  равное:  cat /proc/cpuinfo | grep "processor" | sort -u | wc -l 
     worker_processes  8; 
     error_log  /var/log/nginx/error.log; 
     pid     /var/run/nginx.pid; 
     events { 
     worker_connections  2048; 
     #multi_accept on; 
     } 
     http { 
      include    /etc/nginx/mime.types; 
      access_log off;  
      sendfile     on; 
      #tcp_nopush     on; 
      #keepalive_timeout  0; 
      keepalive_timeout  75; 
      tcp_nodelay     on; 
      gzip  on; 
      gzip_disable "MSIE [1-6]\.(?!.*SV1)"; 
          client_max_body_size      124m; 
          client_body_buffer_size      40m; 
          proxy_connect_timeout        300; 
          proxy_send_timeout        300; 
          proxy_read_timeout        300; 
      #   proxy_buffer_size         640k; 
      #   proxy_buffers          8 2560k; 
      #   proxy_busy_buffers_size      2560k; 
      #   proxy_temp_file_write_size   10m; 
  # кеширование, требует конфигурации в  servers и location не рекомендовано для магазинов.
     #proxy_cache_path /mnt/tmp/cash levels=1:2 keys_zone=cache:1m max_size=200M; 
     #proxy_temp_path /mnt/tmp 1 2; 
     #proxy_ignore_headers Expires Cache-Control; 
     #proxy_cache_use_stale error timeout invalid_header http_502; 
     #proxy_cache_bypass $cookie_session; 
     #proxy_no_cache $cookie_session; 

     include /etc/nginx/conf.d/*.conf; 
     include /etc/nginx/sites-enabled/*; 
     } 
    
  EOF

Перезапускаем

  /etc/init.d/nginx restart

Ставим плагин из репозитория. Тут я отступил от официального мануала на пару строк, поскольку нам его придется сильно переделывать.

  cd /tmp
  wget https://github.com/Rackster/ispconfig3-nginx-reverse-proxy/archive/master.zip
  unzip master.zip
  rm master.zip
  cd ispconfig3-nginx-reverse-proxy-master
  cp usr/local/ispconfig/server/plugins-available/nginx_reverse_proxy_plugin.inc.php /usr/local/ispconfig/server/plugins-available/
  cp usr/local/ispconfig/server/conf-custom/vhost.conf.master /usr/local/ispconfig/server/conf-custom/
  rm -rf /tmp/ispconfig3-nginx-reverse-proxy-master
  chmod 750 /usr/local/ispconfig/server/conf-custom/vhost.conf.master
  chmod 750 /usr/local/ispconfig/server/plugins-available/nginx_reverse_proxy_plugin.inc.php
  chown ispconfig:ispconfig /usr/local/ispconfig/server/conf-custom/vhost.conf.master
  chown ispconfig:ispconfig /usr/local/ispconfig/server/plugins-available/nginx_reverse_proxy_plugin.inc.php
  cd /usr/local/ispconfig/server/plugins-enabled/
  ln -s /usr/local/ispconfig/server/plugins-available/nginx_reverse_proxy_plugin.inc.php

Удаляем дефолтный, но отключенный плагин, поскольку он еще кривее. И заменяем на самописаный.

  rm /usr/local/ispconfig/server/conf/nginx_reverse_proxy_plugin.vhost.conf.master

Заменяем на свой.

cat >> /usr/local/ispconfig/server/conf/nginx_reverse_proxy_plugin.vhost.conf.master <<EOF
<tmpl_loop name='vhosts'>
server {
#------- Server configuration---------------------------------------------------
    <tmpl_if name='ssl_enabled'>
        listen <tmpl_if name='ip_address' op='!=' value='*'><tmpl_var name='ip_address'>:</tmpl_if>443 ssl spdy;
        <tmpl_if name='ipv6_enabled'>
        listen [<tmpl_var name='ipv6_address'>]:443 ipv6only=on ssl spdy;
    </tmpl_if>
    </tmpl_else> 
        listen <tmpl_if name='ip_address' op='!=' value='*'><tmpl_var name='ip_address'>:</tmpl_if>80;
        <tmpl_if name='ipv6_enabled'>
        listen [<tmpl_var name='ipv6_address'>]:80 ipv6only=on;
    </tmpl_if>
    </tmpl_if>
server_name <tmpl_var name='domain'> <tmpl_if name='alias'><tmpl_var name='alias'></tmpl_if> <tmpl_if name='ip_address' op='!=' value='*'><tmpl_var name='ip_address'></tmpl_if>;
        root <tmpl_var name='web_document_root_www'>;

#-------- Error page ----------------------------------------------------------
        error_page 404 = @fallback; 
        location @fallback {
        proxy_pass http://<tmpl_if name='seo_redirect_enabled'><tmpl_var name='seo_redirect_target_domain'><tmpl_else><tmpl_if name='ip_address' op='!=' value="*" ><tmpl_var name='ip_address'><tmpl_else><tmpl_var name='domain'></tmpl_if></tmpl_if>:<tmpl_var name='apache2_port'>;            
        proxy_set_header Host <tmpl_if name='seo_redirect_enabled'><tmpl_var name='seo_redirect_target_domain'><tmpl_else><tmpl_if name='ip_address' op='!=' value="*" ><tmpl_var name='ip_address'><tmpl_else><tmpl_var name='domain'></tmpl_if></tmpl_if>;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP \$remote_addr;
}
# ------ Log configuration ----------------------------------------------------
        access_log off;
        error_log  off;
        #error_log /var/log/ispconfig/httpd/<tmpl_var name='domain'>/nginx_error.log error;
        #access_log /var/log/ispconfig/httpd/<tmpl_var name='domain'>/nginx_access.log combined;
    <tmpl_if name='ssl_enabled'>

#------- SSL configuration ----------------------------------------------------
        more_set_headers 'Strict-Transport-Security: max-age=15768000';
        ssl_certificate <tmpl_var name='web_document_root_ssl'>/<tmpl_var name='ssl_domain'>.nginx.crt;
        ssl_certificate_key <tmpl_var name='web_document_root_ssl'>/<tmpl_var name='ssl_domain'>.nginx.key;
    </tmpl_if>
    <tmpl_if name='ssl_enabled'>

#------- Pagespeed configuration-----------------------------------------------
    <tmpl_if name='seo_redirect_enabled'>
        pagespeed LoadFromFile "https://<tmpl_var name='seo_redirect_target_domain'>" "<tmpl_var name='web_document_root_www'>/";
        </tmpl_else>
        pagespeed LoadFromFile "https://<tmpl_var name='domain'>" "<tmpl_var name='web_document_root_www'>/";
    </tmpl_if>
    </tmpl_if>

#------- Redirects configuration-----------------------------------------------
    <tmpl_if name='http_to_https'>
        # Redirect http -> https
        return 301 https://\$server_name\$request_uri;
    </tmpl_if>
    <tmpl_if name='seo_redirect_enabled'>
        # SEO Redirect
        if (\$http_host = "<tmpl_var name='seo_redirect_origin_domain'>" {
        return 301 \$scheme://<tmpl_var name='seo_redirect_target_domain'>\$request_uri;
        }
    </tmpl_if>
#------ static content --------------------------------------------------------
    location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|flv|mp3)\$ {
        root  <tmpl_var name='web_document_root_www'>;
        access_log off;
         expires 30d; 
}
#-------Html ------------------------------------------------------------------
    location ~* ^.+\.(htm|html)\$ { 
#        root <tmpl_var name='web_document_root_www'>; 
        try_files \$uri /index.php ;  
         access_log off; 
        expires 30d;
}
#------ Locations configuration -----------------------------------------------
        # global locations
        # alias to local error docs<tmpl_var name='domain'> <tmpl_if name='alias'><tmpl_var name='alias'></tmpl_if> <tmpl_if name='ip_address' op='!=' value='*'><tmpl_var name='ip_address'></tmpl_if>
    <tmpl_if name='errordocs'>
        location ^~ /error { root /var/www; }
    </tmpl_if>

    # default location
    location / {
        index index.php index.html index.htm;    
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header Host <tmpl_if name='seo_redirect_enabled'><tmpl_var name='seo_redirect_target_domain'><tmpl_else><tmpl_if name='ip_address' op='!=' value="*" ><tmpl_var name='ip_address'><tmpl_else><tmpl_var name='domain'></tmpl_if></tmpl_if>;
         proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_pass http://<tmpl_if name='seo_redirect_enabled'><tmpl_var name='seo_redirect_target_domain'><tmpl_else><tmpl_if name='ip_address' op='!=' value="*" ><tmpl_var name='ip_address'><tmpl_else><tmpl_var name='domain'></tmpl_if></tmpl_if>:<tmpl_var name='apache2_port'>;        
}
#------- Directives configuration ---------------------------------------------
 include /etc/nginx/locations.d/*.conf;

    <tmpl_var name='nginx_directives'>
}
</tmpl_loop>


EOF

Выставляем права.

  chmod 750 /usr/local/ispconfig/server/conf/nginx_reverse_proxy_plugin.vhost.conf.master
  chown ispconfig:ispconfig /usr/local/ispconfig/server/conf/nginx_reverse_proxy_plugin.vhost.conf.master

Так, после генерации, будет выглядеть конечный файл.

Ну и последний штрих: активируем возможность дописывать уникальные значения для каждого сайта через ispconfig. Тем более в нем все уже есть, но так и не внедрено.

  sed -ie "s/jQuery[(].\.nginx.[]\.hide[(][]/jQuery\(\'\.nginx\'\)\.show\(\)/g" /usr/local/ispconfig/interface/web/sites/templates/web_domain_advanced.htm

Проверяем.

Оставить комментарий

Комментарии (2)

  1. Владимир 01.08.2016 Ответить
    Последняя команда дает ошибку:

    sed: -e выражение #1, символ 67: незавершенная команда `s'
  2. Виктор
    Виктор 05.08.2016 Ответить
    статье несколько лет, возможно теперь нужно менять в в другом месте. Посмотрите по верстке как эта тема активируется, найдите это в коде да раскоментируйте.