Apps: "Bash", "Docker" & etc.
В этой заметке описан один из этапов реализации поставленной в вышестоящей публикации задачи автоматизации процедур развёртывания тестовых стендов из docker-контейнеров.
Перед запуском каждого контейнера "Nginx" каждого тестового стенда возможно понадобится добавить описание конфигурации сайта этого тестового стенда - автоматизируем это скриптом-шаблоном:
# vi /usr/local/etc/devops/lib/bunch-nginx-conf.sh.snippet
#!/bin/bash
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell).
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell).
cat << EOF > "${OPSROOT}/bunch/${SITENAME}/etc/nginx/conf.d/${FQDN[$I]}.conf"
$([ ${PHPFPM_ENABLE} ] && cat << EOS | sed "s/^[\t]/ /; s/^[ ]\{2\}//"
# Перечисляем FastCGI-обработчиков PHP-интерпретатора
upstream fcgi-upstream-${FQDN[$I]} {
ip_hash;
server unix:/var/run/php/php-fpm.sock max_fails=2 fail_timeout=300 weight=2;
server bunch-${SITENAME}-php:9000 max_fails=2 fail_timeout=300 weight=1;
}
EOS
)
$([ ${NODEJS_ENABLE} ] && cat << EOS | sed "s/^[\t]/ /; s/^[ ]\{2\}//"
# Перечисляем точки входа NodeJS-приложения
upstream nodejs-upstream-${FQDN[$I]} {
server bunch-${SITENAME}-nodejs:8000 max_fails=2 fail_timeout=300;
}
EOS
)
# Приём и обработка HTTP-трафика
server {
server_name ${FQDN[$I]};
listen 80;
set \$root ${SITEROOT};
root \$root;
index index.html;
location ~* /\.(ht|hg|sub|svn|git|env) { deny all; }
$([ ${PHPFPM_ENABLE} ] && cat << EOS
set \$php_pass fcgi-upstream-${FQDN[$I]};
location ~* \.php\$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass \$php_pass;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
}
EOS
)
$([ ${NODEJS_ENABLE} ] && cat << EOS
set \$nodejs_pass nodejs-upstream-${FQDN[$I]};
location / { try_files \$uri @nodejs; }
location @nodejs {
proxy_pass http://\$nodejs_pass;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host \$host;
proxy_set_header X-Forwarded-Server \$host;
proxy_set_header X-NginX-Proxy true;
# (включение поддержки HTTPv1.1 и WebSocket)
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_cache_bypass \$http_upgrade;
}
EOS
)
}
# Приём и обработка HTTPS-трафика
server {
server_name ${FQDN[$I]};
listen 443 ssl http2;
include ${FQDN_SSL_CONF[$I]};
set \$root ${SITEROOT};
root \$root;
index index.html;
location ~* /\.(ht|hg|sub|svn|git|env) { deny all; }
$([ ${PHPFPM_ENABLE} ] && cat << EOS
set \$php_pass fcgi-upstream-${FQDN[$I]};
location ~* \.php\$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass \$php_pass;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
}
EOS
)
$([ ${NODEJS_ENABLE} ] && cat << EOS
set \$nodejs_pass nodejs-upstream-${FQDN[$I]};
location / { try_files \$uri @nodejs; }
location @nodejs {
proxy_pass http://\$nodejs_pass;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host \$host;
proxy_set_header X-Forwarded-Server \$host;
proxy_set_header X-NginX-Proxy true;
# (включение поддержки HTTPv1.1 и WebSocket)
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_cache_bypass \$http_upgrade;
}
EOS
)
$([ ${PMA_ENABLE} ] && cat << EOS
# Приоритетный перехват запросов и проксирование к "phpMyAdmin"
location ^~ /pma {
# Обеспечиваем работу подсайта в произвольной виртуальной поддиректории
location ~* /pma\$ { return 301 /pma/; }
rewrite ^/pma(/.*)\$ \$1 break;
proxy_redirect ~*^/(?!(pma))(.+)\$ /pma/\$2;
#
proxy_pass http://bunch-${SITENAME}-pma:80;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host \$host;
proxy_set_header X-Forwarded-Server \$host;
}
EOS
)
}
EOF
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell).
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell).
cat << EOF > "${OPSROOT}/bunch/${SITENAME}/etc/nginx/conf.d/${FQDN[$I]}.conf"
$([ ${PHPFPM_ENABLE} ] && cat << EOS | sed "s/^[\t]/ /; s/^[ ]\{2\}//"
# Перечисляем FastCGI-обработчиков PHP-интерпретатора
upstream fcgi-upstream-${FQDN[$I]} {
ip_hash;
server unix:/var/run/php/php-fpm.sock max_fails=2 fail_timeout=300 weight=2;
server bunch-${SITENAME}-php:9000 max_fails=2 fail_timeout=300 weight=1;
}
EOS
)
$([ ${NODEJS_ENABLE} ] && cat << EOS | sed "s/^[\t]/ /; s/^[ ]\{2\}//"
# Перечисляем точки входа NodeJS-приложения
upstream nodejs-upstream-${FQDN[$I]} {
server bunch-${SITENAME}-nodejs:8000 max_fails=2 fail_timeout=300;
}
EOS
)
# Приём и обработка HTTP-трафика
server {
server_name ${FQDN[$I]};
listen 80;
set \$root ${SITEROOT};
root \$root;
index index.html;
location ~* /\.(ht|hg|sub|svn|git|env) { deny all; }
$([ ${PHPFPM_ENABLE} ] && cat << EOS
set \$php_pass fcgi-upstream-${FQDN[$I]};
location ~* \.php\$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass \$php_pass;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
}
EOS
)
$([ ${NODEJS_ENABLE} ] && cat << EOS
set \$nodejs_pass nodejs-upstream-${FQDN[$I]};
location / { try_files \$uri @nodejs; }
location @nodejs {
proxy_pass http://\$nodejs_pass;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host \$host;
proxy_set_header X-Forwarded-Server \$host;
proxy_set_header X-NginX-Proxy true;
# (включение поддержки HTTPv1.1 и WebSocket)
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_cache_bypass \$http_upgrade;
}
EOS
)
}
# Приём и обработка HTTPS-трафика
server {
server_name ${FQDN[$I]};
listen 443 ssl http2;
include ${FQDN_SSL_CONF[$I]};
set \$root ${SITEROOT};
root \$root;
index index.html;
location ~* /\.(ht|hg|sub|svn|git|env) { deny all; }
$([ ${PHPFPM_ENABLE} ] && cat << EOS
set \$php_pass fcgi-upstream-${FQDN[$I]};
location ~* \.php\$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass \$php_pass;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
}
EOS
)
$([ ${NODEJS_ENABLE} ] && cat << EOS
set \$nodejs_pass nodejs-upstream-${FQDN[$I]};
location / { try_files \$uri @nodejs; }
location @nodejs {
proxy_pass http://\$nodejs_pass;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host \$host;
proxy_set_header X-Forwarded-Server \$host;
proxy_set_header X-NginX-Proxy true;
# (включение поддержки HTTPv1.1 и WebSocket)
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_cache_bypass \$http_upgrade;
}
EOS
)
$([ ${PMA_ENABLE} ] && cat << EOS
# Приоритетный перехват запросов и проксирование к "phpMyAdmin"
location ^~ /pma {
# Обеспечиваем работу подсайта в произвольной виртуальной поддиректории
location ~* /pma\$ { return 301 /pma/; }
rewrite ^/pma(/.*)\$ \$1 break;
proxy_redirect ~*^/(?!(pma))(.+)\$ /pma/\$2;
#
proxy_pass http://bunch-${SITENAME}-pma:80;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host \$host;
proxy_set_header X-Forwarded-Server \$host;
}
EOS
)
}
EOF