diff --git a/software/apache-frontend/apache-yakari.cfg.in b/software/apache-frontend/apache-yakari.cfg.in index 166e1ddee49ebc978465966e26bdea3cb54d6cb5..004ffe00e8505c3694fa6c647618b8b48c5caa66 100644 --- a/software/apache-frontend/apache-yakari.cfg.in +++ b/software/apache-frontend/apache-yakari.cfg.in @@ -17,10 +17,18 @@ context = {% set slave_parameter_dict = generic_instance_parameter_dict.copy() -%} # Set slave domain if none was defined {% if slave_instance.get('domain', None) == None -%} -{% do slave_instance.__setitem__('domain', "%s.%s" % (slave_instance.get('slave_reference').replace("-", "").lower(), domain)) -%} +# Backward compatibility +{% if slave_instance.get('custom_domain', None) != None -%} +{% do slave_instance.__setitem__('domain', slave_instance.get('custom_domain') )-%} +{% else -%} +{% do slave_instance.__setitem__('domain', "%s.%s" % (slave_instance.get('slave_reference').replace("-", "").lower(), domain)) -%} +{% endif -%} {% endif -%} -{% if 'enable_cache' in slave_instance -%} +# Set personal log, two per slave +{% set access_log = '/'.join([apache_log_directory, '%s_access_log' % slave_reference]) -%} +{% set error_log = '/'.join([apache_log_directory, '%s_error_log' % slave_reference]) -%} # The slave use cache +{% if 'enable_cache' in slave_instance -%} {% do cached_server_dict.__setitem__(slave_instance.get('domain'), slave_instance.get('url')) -%} {% endif -%} {% do slave_instance.__setitem__('url', cache_access) -%} @@ -36,6 +44,8 @@ extra-context = raw domain {{ domain }} raw https_port {{ https_port }} raw http_port {{ http_port }} + raw access_log {{ access_log }} + raw error_log {{ error_log }} {{ '\n' }} # Set apache configuration for slave @@ -43,6 +53,16 @@ extra-context = {% for key, value in slave_instance.iteritems() -%} {{ key }} = {{ dumps(value) }} {% endfor %} + +# Publish slave information +{% set publish_section_title = 'publish-%s-connection-information' % slave_instance.get('slave_reference') -%} +{% do part_list.append(publish_section_title) -%} +[{{ publish_section_title }}] +recipe = slapos.cookbook:publish +slave-reference = {{ slave_instance.get('slave_reference') }} +reference = {{ slave_instance.get('slave_reference') }} +public-ipv4 = {{ public_ipv4 }} +domain = {{ slave_instance.get('domain') }} {% endfor -%} diff --git a/software/apache-frontend/common.cfg b/software/apache-frontend/common.cfg index 002710949a0434bad7fb8c8e4a5ba70148750c5c..bb93e33b43089a85547795b6a535136892a2254f 100644 --- a/software/apache-frontend/common.cfg +++ b/software/apache-frontend/common.cfg @@ -115,6 +115,11 @@ recipe = slapos.recipe.build:download url = ${:_profile_base_location_}/000.conf.in mode = 640 +[template-default-slave-virtualhost] +recipe = slapos.recipe.build:download +url = ${:_profile_base_location_}/default-virtualhost.conf.in +mode = 640 + [template-empty] recipe = slapos.recipe.build:download url = ${:_profile_base_location_}/empty.in diff --git a/software/apache-frontend/default-virtualhost.conf.in b/software/apache-frontend/default-virtualhost.conf.in new file mode 100644 index 0000000000000000000000000000000000000000..54ce2729c941ffa78c3a6ee495d95a13b2f04e85 --- /dev/null +++ b/software/apache-frontend/default-virtualhost.conf.in @@ -0,0 +1,63 @@ +<VirtualHost *:{{ http_port }}> + ServerName {{ slave_parameter.get('domain', '') }} + ServerAlias {{ slave_parameter.get('domain', '') }} + SSLEngine on + SSLProxyEngine on + # Rewrite part + ProxyVia On + ProxyPreserveHost On + ProxyTimeout 600 + RewriteEngine On + + # One Slave two logs + ErrorLog "{{ error_log }}" + LogLevel warn + LogFormat "%h %l %{REMOTE_USER}i %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined + CustomLog "{{ access_log }}" combined + +{% if slave_parameter.get('type', '') == 'zope' -%} + # First, we check if we have a zope backend server + # If so, let's use Virtual Host Daemon rewrite + # We suppose that Apache listens to 80 (even indirectly thanks to things like iptables) + RewriteRule ^/(.*)$ {{ slave_parameter.get('url', '') }}/VirtualHostBase/http/{{ slave_parameter.get('domain', '') }}:80/{{ slave_parameter.get('path', '') }}/VirtualHostRoot/$1 [L,P] +{% else -%} + RewriteRule ^/(.*)$ {{ slave_parameter.get('url', '') }}/$1 [L,P] +{% endif -%} + # If nothing exist : put a nice error +# ErrorDocument 404 /notfound.html + +</VirtualHost> + +<VirtualHost *:{{ https_port }}> + ServerName {{ slave_parameter.get('domain', '') }} + ServerAlias {{ slave_parameter.get('domain', '') }} + SSLProxyEngine on + # Rewrite part + ProxyVia On + ProxyPreserveHost On + ProxyTimeout 600 + RewriteEngine On + + # One Slave two logs + ErrorLog "{{ error_log }}" + LogLevel warn + LogFormat "%h %l %{REMOTE_USER}i %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined + CustomLog "{{ access_log }}" combined + + # Remove "Secure" from cookies, as backend may be https + Header edit Set-Cookie "(?i)^(.+);secure$" "$1" + +{% if 'https-only' in slave_parameter -%} + # Not using HTTPS? Ask that guy over there. + # Dummy redirection to https. Note: will work only if https listens + # on standard port (443). + RewriteRule ^/(.*)$ https://%{DOMAIN}%{REQUEST_URI} +{% elif slave_parameter.get('type', '') == 'zope' -%} + # First, we check if we have a zope backend server + # If so, let's use Virtual Host Daemon rewrite + # We suppose that Apache listens to 443 (even indirectly thanks to things like iptables) + RewriteRule ^/(.*)$ {{ slave_parameter.get('url', '') }}/VirtualHostBase/https/{{ slave_parameter.get('domain', '') }}:443/{{ slave_parameter.get('path', '') }}/VirtualHostRoot/$1 [L,P] +{% else -%} + RewriteRule ^/(.*)$ {{ slave_parameter.get('url', '') }}/$1 [L,P] +{% endif -%} +</VirtualHost> diff --git a/software/apache-frontend/instance.cfg b/software/apache-frontend/instance.cfg index 2761093a371fc0be92ce727cb995d6b4be641c9a..7c990fdae394165a41fca1ba1b33772387d360b4 100644 --- a/software/apache-frontend/instance.cfg +++ b/software/apache-frontend/instance.cfg @@ -58,7 +58,9 @@ squid-cache = $${:srv}/squid_cache [switch-softwaretype] recipe = slapos.cookbook:softwaretype -default = $${dynamic-template-slave-list:rendered} +default = $${dynamic-default-template-slave-list:rendered} +custom-personal = $${dynamic-custom-personal-template-slave-list:rendered} +custom-group = $${dynamic-custom-group-template-slave-list:rendered} [instance-parameter] # Fetches parameters defined in SlapOS Master for this instance. @@ -101,7 +103,7 @@ extra-context = key http_port instance-parameter:configuration.plain_http_port key https_port instance-parameter:configuration.port -[dynamic-template-slave-list] +[dynamic-custom-personal-template-slave-list] < = jinja2-template-base template = ${template-slave-list:target} filename = instance-slave-list.cfg @@ -120,7 +122,7 @@ extra-context = raw template_slave_configuration ${template-slave-configuration:target} raw template_rewrite_cached ${template-rewrite-cached:target} -[dynamic-custom-template-slave-list] +[dynamic-custom-group-template-slave-list] < = jinja2-template-base template = ${template-custom-slave-list:target} filename = instance-slave-list.cfg @@ -135,6 +137,27 @@ extra-context = key rewrite_cached_configuration apache-configuration:cached-rewrite-file key custom_ssl_directory apache-directory:vh-ssl key template_slave_configuration dynamic-virtualhost-template-slave:rendered + key apache_log_directory apache-directory:slave-log + raw empty_template ${template-empty:target} + raw cache_access http://$${instance-parameter:ipv4-random}:$${apache-configuration:cache-port} + raw template_rewrite_cached ${template-rewrite-cached:target} + +[dynamic-default-template-slave-list] +< = jinja2-template-base +template = ${template-custom-slave-list:target} +filename = instance-slave-list.cfg +extensions = jinja2.ext.do +extra-context = + key apache_configuration_directory apache-directory:slave-configuration + key domain instance-parameter:configuration.domain + key http_port instance-parameter:configuration.plain_http_port + key https_port instance-parameter:configuration.port + key public_ipv4 instance-parameter:configuration.public-ipv4 + key slave_instance_list instance-parameter:slave-instance-list + key rewrite_cached_configuration apache-configuration:cached-rewrite-file + key custom_ssl_directory apache-directory:vh-ssl + key apache_log_directory apache-directory:slave-log + raw template_slave_configuration ${template-default-slave-virtualhost:target} raw empty_template ${template-empty:target} raw cache_access http://$${instance-parameter:ipv4-random}:$${apache-configuration:cache-port} raw template_rewrite_cached ${template-rewrite-cached:target}