Commit eee846a4dc6bc83e294e2fc5472231d1faa4f750
1 parent
70b9bd40
Bump to v0.3.0.
Add support for multiple upstream servers in nginx config. Add support for LetsEncrypt certificate configurations.
Showing
17 changed files
with
518 additions
and
337 deletions
| ... | ... | @@ -18,12 +18,6 @@ Ubuntu 14.04 |
| 18 | 18 | <th>Default</th> |
| 19 | 19 | </tr> |
| 20 | 20 | <tr> |
| 21 | - <td><tt>['cfe-nginx-php-fpm']['php_fastcgi_socket']</tt></td> | |
| 22 | - <td>String</td> | |
| 23 | - <td>The socket used by PHP-FPM. Set to boolean false to disable PHP-FPM.</td> | |
| 24 | - <td><tt>'127.0.0.1:9000'</tt></td> | |
| 25 | - </tr> | |
| 26 | - <tr> | |
| 27 | 21 | <td><tt>['cfe-nginx-php-fpm']['postfix']['email_domain']</tt></td> |
| 28 | 22 | <td>String</td> |
| 29 | 23 | <td>Email domain to be used by Postfix.</td> | ... | ... |
| 1 | 1 | # |
| 2 | -# Author:: Earth U (<sysadmin@chromedia.com>) | |
| 2 | +# Author:: Earth U (<sysadmin @ chromedia.com>) | |
| 3 | 3 | # Cookbook Name:: cfe-nginx-php-fpm |
| 4 | 4 | # Attribute:: default |
| 5 | 5 | # |
| ... | ... | @@ -18,12 +18,30 @@ |
| 18 | 18 | # limitations under the License. |
| 19 | 19 | # |
| 20 | 20 | |
| 21 | +# TODO defunct attribs | |
| 21 | 22 | # The socket used PHP-FPM. If false, fastcgi is not used. |
| 22 | 23 | # Examples: |
| 23 | 24 | # '127.0.0.1:9000' |
| 24 | 25 | # '/var/run/php-fpm.sock' |
| 25 | 26 | # false |
| 26 | -default['cfe-nginx-php-fpm']['php_fastcgi_socket'] = '127.0.0.1:9000' | |
| 27 | +#default['cfe-nginx-php-fpm']['php_fastcgi_socket'] = '127.0.0.1:9000' | |
| 28 | + | |
| 29 | +# PHP-FPM sockets to be used. If unset, or set to string 'php-fpm-pools' (default), | |
| 30 | +# the recipe automatically gets this value from node['php-fpm']['pools']. | |
| 31 | +#default['cfe-nginx-php-fpm']['php_fastcgi_sockets'] = [ | |
| 32 | +# { | |
| 33 | +# :name => 'example_socket', | |
| 34 | +# # Example values: | |
| 35 | +# # '127.0.0.1:9000' | |
| 36 | +# # '127.0.0.1:9001' | |
| 37 | +# # '/var/run/php-fpm.sock' | |
| 38 | +# :listen => '127.0.0.1:9000', | |
| 39 | +# # An optional array of comments for this socket | |
| 40 | +# :comments => [] | |
| 41 | +# } | |
| 42 | +#] | |
| 43 | + | |
| 44 | + | |
| 27 | 45 | |
| 28 | 46 | # Setting 'update_cacert' to true will get the latest cacert from |
| 29 | 47 | # http://curl.haxx.se/ca/cacert.pem and use that as CAFile for postfix. |
| ... | ... | @@ -51,35 +69,64 @@ default['cfe-nginx-php-fpm']['nginx']['restriction_file']['static_types'] = %w{ |
| 51 | 69 | |
| 52 | 70 | default['cfe-nginx-php-fpm']['nginx']['sites'] = [ |
| 53 | 71 | #{ |
| 72 | + # Name of server. Mandatory. | |
| 73 | + # | |
| 54 | 74 | #:server_name => 'example.com', |
| 75 | + | |
| 76 | + # Server aliases in an array. Default: [] | |
| 77 | + # | |
| 55 | 78 | #:aliases => ['www.example.com'], |
| 79 | + | |
| 80 | + # Location of document root. If not given, the root directive | |
| 81 | + # will not be included in the config. Default: nil | |
| 82 | + # | |
| 56 | 83 | #:doc_root => '/var/www/example.com', |
| 84 | + | |
| 85 | + # Index, if applicable, of the site. Default: nil | |
| 86 | + # | |
| 57 | 87 | #:index => 'index.php', |
| 58 | 88 | |
| 59 | - # Access log options as one long string. Default: false | |
| 89 | + # Access log options as one long string. Default: nil | |
| 90 | + # | |
| 60 | 91 | #:access_log_options => '<some options>', |
| 61 | 92 | |
| 62 | 93 | # Whether to include a default virtual server named '_' or not. |
| 63 | 94 | # If there is more than one server given in this 'sites' array, |
| 64 | - # 'catch_all' value will always be overriden to 'false'. | |
| 65 | - # Default: true | |
| 95 | + # :catch_all value will always be overriden to false. Default: true | |
| 96 | + # | |
| 66 | 97 | #:catch_all => true, |
| 67 | 98 | |
| 68 | - # Necessary values for SSL/TLS setup. Default: :ssl => false | |
| 99 | + # Necessary values for SSL/TLS setup. Default: nil | |
| 100 | + # | |
| 69 | 101 | #:ssl => { |
| 70 | - # :cert => '[contents of chain cert here]', | |
| 71 | - # :key => '[contents of cert private key here]', | |
| 72 | - # :dh_modulus => 2048, | |
| 73 | - # :self_signed => false, | |
| 74 | - # :hsts_max_age => '15758000', | |
| 75 | - # :hsts_include_subdomains => true | |
| 102 | + # # Subvalues and their defaults: | |
| 103 | + # | |
| 104 | + # # If LetsEncrypt is used, set to true. | |
| 105 | + # # le_sub_dir defaults to the server name. | |
| 106 | + # # | |
| 107 | + # :letsencrypt => false, | |
| 108 | + # :le_base_dir => '/etc/letsencrypt/live', | |
| 109 | + # :le_sub_dir => '<server_name>', | |
| 110 | + # | |
| 111 | + # # If not using LetsEncrypt, specify cert and key here. | |
| 112 | + # # If using LetsEncrypt, these attributes are not used: | |
| 113 | + # # | |
| 114 | + # :cert => '<contents of chain cert here>', | |
| 115 | + # :key => '<contents of cert private key here>', | |
| 116 | + # | |
| 117 | + # :self_signed => false, | |
| 118 | + # :cipher_suite => 'medium', # or 'modern' | |
| 119 | + # :dh_modulus => 4096, | |
| 120 | + # :hsts_max_age => '15758000', | |
| 121 | + # :hsts_subdomains => true | |
| 76 | 122 | #}, |
| 77 | 123 | |
| 78 | - # Necessary values for Basic Auth setup. Default: :auth => false | |
| 124 | + # Necessary values for Basic Auth setup. Default: nil | |
| 125 | + # | |
| 79 | 126 | #:auth => { |
| 80 | 127 | # :msg => 'Restricted Area. Please authenticate.', |
| 81 | 128 | # :users => { |
| 82 | - # 'example_user' => 'secretpassword123' | |
| 129 | + # 'example_user' => '<password>' | |
| 83 | 130 | # } |
| 84 | 131 | #}, |
| 85 | 132 | |
| ... | ... | @@ -87,31 +134,63 @@ default['cfe-nginx-php-fpm']['nginx']['sites'] = [ |
| 87 | 134 | # the 'server' declaration. Default: [] |
| 88 | 135 | #:init_statements => [], |
| 89 | 136 | |
| 137 | + # Additional headers to insert into the server responses. | |
| 138 | + # If the site uses HTTPS, the header 'Strict-Transport-Security' will | |
| 139 | + # always be included. Default: | |
| 140 | + # { | |
| 141 | + # 'X-Frame-Options' => 'SAMEORIGIN', | |
| 142 | + # 'X-Content-Type-Options' => 'nosniff', | |
| 143 | + # 'X-XSS-Protection' => '"1; mode=block"', | |
| 144 | + # 'X-Permitted-Cross-Domain-Policies' => 'none' | |
| 145 | + # } | |
| 146 | + # | |
| 147 | + #:add_headers => {}, | |
| 148 | + | |
| 90 | 149 | # An array of strings that will be included as statements in the main |
| 91 | - # nginx config file for this server. Default: [] | |
| 92 | - #:custom_statements => [], | |
| 150 | + # nginx config file for this server, before the first 'include' | |
| 151 | + # directive. Default: [] | |
| 152 | + # | |
| 153 | + #:server_statements_1 => [], | |
| 154 | + | |
| 155 | + # An array of strings that will be included as statements in the main | |
| 156 | + # nginx config file for this server, after the last 'include' | |
| 157 | + # directive. Default: [] | |
| 158 | + # | |
| 159 | + #:server_statements_2 => [], | |
| 93 | 160 | |
| 94 | 161 | # Enumerates the different site types this server supports. |
| 95 | - # Possible elements of :types are (only :type is mandatory): | |
| 96 | - # { | |
| 97 | - # :type => 'basic', | |
| 98 | - # :subpath => '' | |
| 99 | - # } | |
| 100 | - # { | |
| 101 | - # :type => 'wordpress', | |
| 102 | - # :subpath => '', | |
| 103 | - # :fastcgi_intercept_errors => false, | |
| 104 | - # :loginpage_statements => [] # An array of strings to be | |
| 105 | - # # written on the config for the | |
| 106 | - # # /wp-login.php and /wp-admin pages. | |
| 107 | - # } | |
| 108 | - # { | |
| 109 | - # :type => 'webserver', | |
| 110 | - # :subpath => '', | |
| 111 | - # :upstream_name => 'example', | |
| 112 | - # :upstream_ip => '127.0.0.1', | |
| 113 | - # :upstream_port => '8080', | |
| 114 | - # } | |
| 162 | + # Each type element of this array is a hash containing different attributes. | |
| 163 | + # | |
| 164 | + # Mandatory attributes are: | |
| 165 | + # :type => One of: 'basic' (basic PHP site) | |
| 166 | + # 'wordpress' (standard Wordpress site) | |
| 167 | + # 'webserver' (proxy webserver) | |
| 168 | + # :upstream_servers => An array containing upstream server endpoints. | |
| 169 | + # Unix socket example: ['/var/run/php-fpm.sock'] | |
| 170 | + # Tcp port example: ['127.0.0.1:9000'] | |
| 171 | + # | |
| 172 | + # Optional attributes are: | |
| 173 | + # :subpath => A string of the form: 'news/blog'. | |
| 174 | + # Indicates what subpath of the site this type applies. | |
| 175 | + # Default: '', which means this site type applies | |
| 176 | + # to the root directory of the site. | |
| 177 | + # :upstream_name => The auto-generated config's upstream name can | |
| 178 | + # be customized through this attribute. | |
| 179 | + # Default: (an auto-generated string) | |
| 180 | + # :add_statements => Additional statements to put in the config file. | |
| 181 | + # Default: [] | |
| 182 | + # | |
| 183 | + # Unique attributes for each type are indicated below: | |
| 184 | + # Basic PHP Site (:type => 'basic'): | |
| 185 | + # :fastcgi_intercept_errors => Optional. Default: false | |
| 186 | + # Standard Wordpress Site (:type => 'wordpress'): | |
| 187 | + # :fastcgi_intercept_errors => Optional. Default: false | |
| 188 | + # :loginpage_statements => An array of strings to be put on the | |
| 189 | + # config for the /wp-login.php | |
| 190 | + # and /wp-admin pages. Default: [] | |
| 191 | + # Proxy Webserver (:type => 'webserver'): | |
| 192 | + # (none) | |
| 193 | + # | |
| 115 | 194 | #:types => [] |
| 116 | 195 | #} |
| 117 | 196 | ] |
| ... | ... | @@ -132,12 +211,14 @@ default['php-fpm']['pools'] = [ |
| 132 | 211 | # Most likely, just use one pool for all PHP needs. |
| 133 | 212 | # (But there are exceptions, of course) |
| 134 | 213 | { |
| 214 | + # Required attributes: | |
| 135 | 215 | :name => 'example_pool', |
| 136 | 216 | :enable => true, |
| 217 | + :listen => '127.0.0.1:9000', | |
| 218 | + #:listen => '/var/run/php-fpm.sock', | |
| 137 | 219 | |
| 138 | - # Default value is: node['cfe-nginx-php-fpm']['php_fastcgi_socket'] | |
| 139 | - #:listen => node['cfe-nginx-php-fpm']['php_fastcgi_socket'], | |
| 140 | - | |
| 220 | + # Optional attributes with their defaults: | |
| 221 | + # | |
| 141 | 222 | # Default is same as Nginx user and group |
| 142 | 223 | #:user => node['nginx']['user'], |
| 143 | 224 | #:group => node['nginx']['group'], | ... | ... |
| ... | ... | @@ -4,7 +4,7 @@ maintainer_email 'sysadmin@chromedia.com' |
| 4 | 4 | license 'Apache License' |
| 5 | 5 | description 'Simplifies setup of Nginx+PHP-FPM in Chromedia.' |
| 6 | 6 | long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) |
| 7 | -version '0.2.1' | |
| 7 | +version '0.3.0' | |
| 8 | 8 | |
| 9 | 9 | { |
| 10 | 10 | 'php-fpm' => '0.7.5', | ... | ... |
| 1 | 1 | # |
| 2 | -# Author:: Earth U (<sysadmin@chromedia.com>) | |
| 2 | +# Author:: Earth U (<sysadmin @ chromedia.com>) | |
| 3 | 3 | # Cookbook Name:: cfe-nginx-php-fpm |
| 4 | 4 | # Recipe:: nginx |
| 5 | 5 | # |
| ... | ... | @@ -30,216 +30,4 @@ node.default['cfe-nginx-php-fpm']['nginx']['priv_dir'] = |
| 30 | 30 | # Begin server configuration |
| 31 | 31 | |
| 32 | 32 | include_recipe 'nginx' |
| 33 | - | |
| 34 | -attribs = node['cfe-nginx-php-fpm']['nginx'] | |
| 35 | -inc_dir = attribs['inc_dir'] | |
| 36 | -priv_dir = attribs['priv_dir'] | |
| 37 | - | |
| 38 | -[ inc_dir, priv_dir ].each do |ndir| | |
| 39 | - directory ndir do | |
| 40 | - recursive true | |
| 41 | - end | |
| 42 | -end | |
| 43 | - | |
| 44 | -# The restrictions.conf file containing default rules for virtual servers. | |
| 45 | -path_rest = "#{inc_dir}/restrictions.conf" | |
| 46 | -template path_rest do | |
| 47 | - action :create_if_missing | |
| 48 | - mode 0644 | |
| 49 | - variables( | |
| 50 | - :log_robots => attribs['restriction_file']['log_robots'], | |
| 51 | - :log_hidden => attribs['restriction_file']['log_hidden'], | |
| 52 | - :log_static => attribs['restriction_file']['log_static'], | |
| 53 | - :static_types => attribs['restriction_file']['static_types'] | |
| 54 | - ) | |
| 55 | -end | |
| 56 | - | |
| 57 | -# Some basic "include" files for PHP | |
| 58 | -path_bpf = "#{inc_dir}/inc_basic_php_fastcgi" | |
| 59 | -template path_bpf do | |
| 60 | - action :create_if_missing | |
| 61 | - mode 0644 | |
| 62 | - variables( | |
| 63 | - :socket => node['cfe-nginx-php-fpm']['php_fastcgi_socket'] | |
| 64 | - ) | |
| 65 | - only_if { node['cfe-nginx-php-fpm']['php_fastcgi_socket'] } | |
| 66 | -end | |
| 67 | - | |
| 68 | -catch_all_def_false = attribs['sites'].length > 1 | |
| 69 | - | |
| 70 | -attribs['sites'].each do |site| | |
| 71 | - | |
| 72 | - if site.is_a?(Array) | |
| 73 | - site_sname = site[0] | |
| 74 | - site = site[1] | |
| 75 | - else | |
| 76 | - site_sname = site[:server_name] | |
| 77 | - end | |
| 78 | - | |
| 79 | - site_index = site[:index] || 'index.php' | |
| 80 | - site_aliases = site[:aliases] || [] | |
| 81 | - site_doc_root = site[:doc_root] || '' | |
| 82 | - site_ssl = site[:ssl] || false | |
| 83 | - site_auth = site[:auth] || false | |
| 84 | - site_alo = site[:access_log_options] || false | |
| 85 | - site_cs = site[:custom_statements] || [] | |
| 86 | - site_ins = site[:init_statements] || [] | |
| 87 | - | |
| 88 | - site_types = ( site[:types] || [] ).uniq { |e| e[:type] } | |
| 89 | - | |
| 90 | - temp_catch_all = site.has_key?(:catch_all) ? site[:catch_all] : true | |
| 91 | - site_catch_all = catch_all_def_false ? false : temp_catch_all | |
| 92 | - | |
| 93 | - path_crt = "#{priv_dir}/#{site_sname}.crt" | |
| 94 | - path_key = "#{priv_dir}/#{site_sname}.key" | |
| 95 | - path_pass = "#{priv_dir}/#{site_sname}.htpasswd" | |
| 96 | - path_dhparam = "#{priv_dir}/#{site_sname}.dhparam" | |
| 97 | - | |
| 98 | - # If TLS/SSL is enabled, create necessary files | |
| 99 | - if site_ssl | |
| 100 | - if site_ssl[:cert].nil? | |
| 101 | - Chef::Log.error('Missing SSL certificate') | |
| 102 | - raise 'Missing SSL certificate' | |
| 103 | - end | |
| 104 | - | |
| 105 | - if site_ssl[:key].nil? | |
| 106 | - Chef::Log.error('Missing SSL key file') | |
| 107 | - raise 'Missing SSL key file' | |
| 108 | - end | |
| 109 | - | |
| 110 | - file path_crt do | |
| 111 | - mode 0644 | |
| 112 | - content site_ssl[:cert] | |
| 113 | - sensitive true | |
| 114 | - action :create_if_missing | |
| 115 | - end | |
| 116 | - | |
| 117 | - file path_key do | |
| 118 | - mode 0644 | |
| 119 | - content site_ssl[:key] | |
| 120 | - sensitive true | |
| 121 | - action :create_if_missing | |
| 122 | - end | |
| 123 | - | |
| 124 | - dh_modulus = site_ssl[:dh_modulus] || 2048 | |
| 125 | - execute "openssl dhparam -out #{path_dhparam} #{dh_modulus}" do | |
| 126 | - not_if { ::File.exist?(path_dhparam) } | |
| 127 | - end | |
| 128 | - end | |
| 129 | - | |
| 130 | - # If basic auth is enabled, create htaccess file | |
| 131 | - if site_auth | |
| 132 | - site_auth[:users].each do |auser, apass| | |
| 133 | - execute "Generate #{path_pass}" do | |
| 134 | - command "printf \"#{auser}:"\ | |
| 135 | - "$( openssl passwd -apr1 '#{apass}' )"\ | |
| 136 | - "\\n\" >> #{path_pass}" | |
| 137 | - action :run | |
| 138 | - sensitive true | |
| 139 | - not_if { ::File.exist?(path_pass) } | |
| 140 | - end | |
| 141 | - end | |
| 142 | - end | |
| 143 | - | |
| 144 | - site_includes = [] | |
| 145 | - upstreams = [] | |
| 146 | - | |
| 147 | - # Create necessary include files for each type of this site | |
| 148 | - site_types.each do |stype| | |
| 149 | - stype_subp = stype[:subpath] ? stype[:subpath].gsub(/^\/+|\/$|\s/, '') : '' | |
| 150 | - stype_subp = stype_subp.length > 0 ? "#{stype_subp}/" : stype_subp | |
| 151 | - | |
| 152 | - case stype[:type] | |
| 153 | - # BASIC PHP SITE | |
| 154 | - when 'basic' | |
| 155 | - template "#{inc_dir}/inc_type_basic_#{site_sname}" do | |
| 156 | - source 'inc_type_basic.erb' | |
| 157 | - mode 0644 | |
| 158 | - action :create_if_missing | |
| 159 | - variables( | |
| 160 | - :index => site_index, | |
| 161 | - :subpath => stype_subp, | |
| 162 | - :basic_php_fastcgi => path_bpf | |
| 163 | - ) | |
| 164 | - end | |
| 165 | - site_includes.push("#{inc_dir}/inc_type_basic_#{site_sname}") | |
| 166 | - | |
| 167 | - # STANDARD WORDPRESS SITE | |
| 168 | - when 'wordpress' | |
| 169 | - template "#{inc_dir}/inc_type_wordpress_#{site_sname}" do | |
| 170 | - source 'inc_type_wordpress.erb' | |
| 171 | - mode 0644 | |
| 172 | - action :create_if_missing | |
| 173 | - variables( | |
| 174 | - :index => site_index, | |
| 175 | - :subpath => stype_subp, | |
| 176 | - :basic_php_fastcgi => path_bpf, | |
| 177 | - :loginpage_statements => stype[:loginpage_statements] || [], | |
| 178 | - :fastcgi_intercept_errors => stype[:fastcgi_intercept_errors] || false | |
| 179 | - ) | |
| 180 | - end | |
| 181 | - site_includes.push("#{inc_dir}/inc_type_wordpress_#{site_sname}") | |
| 182 | - | |
| 183 | - # BASIC PROXIED WEBSERVER | |
| 184 | - when 'webserver' | |
| 185 | - upstream_name = stype[:upstream_name] || 'webserver' | |
| 186 | - template "#{inc_dir}/inc_type_webserver_#{site_sname}" do | |
| 187 | - source 'inc_type_webserver.erb' | |
| 188 | - mode 0644 | |
| 189 | - action :create_if_missing | |
| 190 | - variables( | |
| 191 | - :subpath => stype_subp, | |
| 192 | - :upstream_name => upstream_name | |
| 193 | - ) | |
| 194 | - end | |
| 195 | - site_ins.push("map $http_upgrade $connection_upgrade {\n"\ | |
| 196 | - " default upgrade;\n"\ | |
| 197 | - " '' close;\n"\ | |
| 198 | - "}") | |
| 199 | - upstreams.push( { | |
| 200 | - :name => upstream_name, | |
| 201 | - :ip => stype[:upstream_ip] || '127.0.0.1', | |
| 202 | - :port => stype[:upstream_port] || '8080' | |
| 203 | - } ) | |
| 204 | - site_includes.push("#{inc_dir}/inc_type_webserver_#{site_sname}") | |
| 205 | - | |
| 206 | - else | |
| 207 | - Chef::Log.error("Unknown site type: #{stype[:type]}") | |
| 208 | - raise 'Unknown site type' | |
| 209 | - end | |
| 210 | - end | |
| 211 | - | |
| 212 | - # Create the main config file for this site | |
| 213 | - template "#{node['nginx']['dir']}/sites-available/#{site_sname}" do | |
| 214 | - source 'nginx_site.conf.erb' | |
| 215 | - action :create_if_missing | |
| 216 | - mode 0644 | |
| 217 | - notifies :restart, 'service[nginx]' | |
| 218 | - variables( | |
| 219 | - :server_name => site_sname, | |
| 220 | - :aliases => site_aliases, | |
| 221 | - :doc_root => site_doc_root, | |
| 222 | - :index => site_index, | |
| 223 | - :ssl => site_ssl, | |
| 224 | - :auth => site_auth, | |
| 225 | - | |
| 226 | - :access_log_options => site_alo, | |
| 227 | - :catch_all => site_catch_all, | |
| 228 | - | |
| 229 | - :path_crt => path_crt, | |
| 230 | - :path_key => path_key, | |
| 231 | - :path_pass => path_pass, | |
| 232 | - :path_dhparam => path_dhparam, | |
| 233 | - :path_rest => path_rest, | |
| 234 | - | |
| 235 | - :upstreams => upstreams, | |
| 236 | - :includes => site_includes, | |
| 237 | - :init_statements => site_ins, | |
| 238 | - :custom_statements => site_cs | |
| 239 | - ) | |
| 240 | - end | |
| 241 | - | |
| 242 | - nginx_site site_sname do | |
| 243 | - enable true | |
| 244 | - end | |
| 245 | -end | |
| 33 | +include_recipe "#{cookbook_name}::nginx_configure" | ... | ... |
recipes/nginx_configure.rb
0 → 100644
| 1 | +# | |
| 2 | +# Author:: Earth U (<sysadmin @ chromedia.com>) | |
| 3 | +# Cookbook Name:: cfe-nginx-php-fpm | |
| 4 | +# Recipe:: nginx_configure | |
| 5 | +# | |
| 6 | +# Copyright 2016, Chromedia Far East, Inc. | |
| 7 | +# | |
| 8 | +# Licensed under the Apache License, Version 2.0 (the "License"); | |
| 9 | +# you may not use this file except in compliance with the License. | |
| 10 | +# You may obtain a copy of the License at | |
| 11 | +# | |
| 12 | +# http://www.apache.org/licenses/LICENSE-2.0 | |
| 13 | +# | |
| 14 | +# Unless required by applicable law or agreed to in writing, software | |
| 15 | +# distributed under the License is distributed on an "AS IS" BASIS, | |
| 16 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 17 | +# See the License for the specific language governing permissions and | |
| 18 | +# limitations under the License. | |
| 19 | +# | |
| 20 | + | |
| 21 | +# Create necessary directories | |
| 22 | +inc_dir = node['cfe-nginx-php-fpm']['nginx']['inc_dir'] | |
| 23 | +priv_dir = node['cfe-nginx-php-fpm']['nginx']['priv_dir'] | |
| 24 | + | |
| 25 | +[ inc_dir, priv_dir ].each do |ndir| | |
| 26 | + directory ndir do | |
| 27 | + recursive true | |
| 28 | + end | |
| 29 | +end | |
| 30 | + | |
| 31 | +# The restrictions file containing default rules for virtual servers. | |
| 32 | +path_rest = "#{inc_dir}/inc_restrictions" | |
| 33 | +restfa = node['cfe-nginx-php-fpm']['nginx']['restriction_file'] | |
| 34 | +template path_rest do | |
| 35 | + action :create_if_missing | |
| 36 | + mode 0644 | |
| 37 | + variables( | |
| 38 | + :log_robots => restfa['log_robots'], | |
| 39 | + :log_hidden => restfa['log_hidden'], | |
| 40 | + :log_static => restfa['log_static'], | |
| 41 | + :static_types => restfa['static_types'] | |
| 42 | + ) | |
| 43 | +end | |
| 44 | + | |
| 45 | +# Generate config files for each virtual server. | |
| 46 | +catch_all_def_false = node['cfe-nginx-php-fpm']['nginx']['sites'].length > 1 | |
| 47 | + | |
| 48 | +node['cfe-nginx-php-fpm']['nginx']['sites'].each do |site| | |
| 49 | + | |
| 50 | + if site.is_a?(Array) | |
| 51 | + site_sname = site[0] | |
| 52 | + site = site[1] | |
| 53 | + else | |
| 54 | + site_sname = site[:server_name] | |
| 55 | + end | |
| 56 | + | |
| 57 | + # Assign default values to attributes | |
| 58 | + site_index = site[:index] || nil | |
| 59 | + site_aliases = site[:aliases] || [] | |
| 60 | + site_doc_root = site[:doc_root] || nil | |
| 61 | + site_alo = site[:access_log_options] || nil | |
| 62 | + site_ssl = site[:ssl] || nil | |
| 63 | + site_auth = site[:auth] || nil | |
| 64 | + site_ins = site[:init_statements] || [] | |
| 65 | + site_ss1 = site[:server_statements_1] || [] | |
| 66 | + site_ss2 = site[:server_statements_2] || [] | |
| 67 | + | |
| 68 | + temp_catch_all = site.has_key?(:catch_all) ? site[:catch_all] : true | |
| 69 | + site_catch_all = catch_all_def_false ? false : temp_catch_all | |
| 70 | + site_types = ( site[:types] || [] ).uniq { |e| e[:type] } | |
| 71 | + site_aheads = site[:add_headers] || { | |
| 72 | + 'X-Frame-Options' => 'SAMEORIGIN', | |
| 73 | + 'X-Content-Type-Options' => 'nosniff', | |
| 74 | + 'X-XSS-Protection' => '"1; mode=block"', | |
| 75 | + 'X-Permitted-Cross-Domain-Policies' => 'none' | |
| 76 | + } | |
| 77 | + | |
| 78 | + # If TLS/SSL is enabled, configure it: | |
| 79 | + if site_ssl | |
| 80 | + if site_ssl[:letsencrypt] | |
| 81 | + le_base_dir = site_ssl[:le_base_dir] || '/etc/letsencrypt/live' | |
| 82 | + le_sub_dir = site_ssl[:le_sub_dir] || site_sname | |
| 83 | + path_crt = "#{le_base_dir}/#{le_sub_dir}/fullchain.pem" | |
| 84 | + path_key = "#{le_base_dir}/#{le_sub_dir}/privkey.pem" | |
| 85 | + | |
| 86 | + else | |
| 87 | + path_crt = "#{priv_dir}/#{site_sname}.crt" | |
| 88 | + path_key = "#{priv_dir}/#{site_sname}.key" | |
| 89 | + | |
| 90 | + if site_ssl[:cert].nil? | |
| 91 | + Chef::Log.error('Missing SSL certificate') | |
| 92 | + raise 'Missing SSL certificate' | |
| 93 | + end | |
| 94 | + | |
| 95 | + if site_ssl[:key].nil? | |
| 96 | + Chef::Log.error('Missing SSL key file') | |
| 97 | + raise 'Missing SSL key file' | |
| 98 | + end | |
| 99 | + | |
| 100 | + file path_crt do | |
| 101 | + mode 0644 | |
| 102 | + content site_ssl[:cert] | |
| 103 | + sensitive true | |
| 104 | + action :create_if_missing | |
| 105 | + end | |
| 106 | + | |
| 107 | + file path_key do | |
| 108 | + mode 0644 | |
| 109 | + content site_ssl[:key] | |
| 110 | + sensitive true | |
| 111 | + action :create_if_missing | |
| 112 | + end | |
| 113 | + end | |
| 114 | + | |
| 115 | + # Configure a high modulus DH param | |
| 116 | + path_dhparam = "#{priv_dir}/#{site_sname}.dhparam" | |
| 117 | + dh_modulus = site_ssl[:dh_modulus] || 4096 | |
| 118 | + execute "openssl dhparam -out #{path_dhparam} #{dh_modulus}" do | |
| 119 | + not_if { ::File.exist?(path_dhparam) } | |
| 120 | + end | |
| 121 | + | |
| 122 | + else | |
| 123 | + path_crt = '' | |
| 124 | + path_key = '' | |
| 125 | + path_dhparam = '' | |
| 126 | + end | |
| 127 | + | |
| 128 | + # If basic auth is enabled, create htpasswd file | |
| 129 | + if site_auth | |
| 130 | + path_pass = "#{priv_dir}/#{site_sname}.htpasswd" | |
| 131 | + site_auth[:users].each do |auser, apass| | |
| 132 | + execute "Generate #{path_pass}" do | |
| 133 | + command "printf \"#{auser}:"\ | |
| 134 | + "$( openssl passwd -apr1 '#{apass}' )"\ | |
| 135 | + "\\n\" >> #{path_pass}" | |
| 136 | + action :run | |
| 137 | + sensitive true | |
| 138 | + not_if { ::File.exist?(path_pass) } | |
| 139 | + end | |
| 140 | + end | |
| 141 | + else | |
| 142 | + path_pass = '' | |
| 143 | + end | |
| 144 | + | |
| 145 | + site_includes = [path_rest] | |
| 146 | + upstreams = [] | |
| 147 | + # upstreams element: | |
| 148 | + # { | |
| 149 | + # :name => 'string', | |
| 150 | + # :servers => [ | |
| 151 | + # '127.0.0.1:9000', | |
| 152 | + # '/var/run/php-fpm.sock' | |
| 153 | + # ] | |
| 154 | + # } | |
| 155 | + | |
| 156 | + # Create necessary include files for each type of this site | |
| 157 | + site_types.each do |stype| | |
| 158 | + stype_subp = stype[:subpath] ? stype[:subpath].gsub(/^\/+|\/+$|\s/, '') : '' | |
| 159 | + stype_subp = stype_subp.length > 0 ? "#{stype_subp}/" : stype_subp | |
| 160 | + stype_ads = stype[:add_statements] || [] | |
| 161 | + stype_ups = stype[:upstream_name] || | |
| 162 | + "#{stype[:type]}_#{site_sname.gsub('.', '_')}" | |
| 163 | + | |
| 164 | + upstreams.push( { | |
| 165 | + :name => stype_ups, | |
| 166 | + :servers => stype[:upstream_servers] || [] | |
| 167 | + } ) | |
| 168 | + | |
| 169 | + case stype[:type] | |
| 170 | + # BASIC PHP SITE | |
| 171 | + when 'basic' | |
| 172 | + stype_intererror = stype.has_key?(:fastcgi_intercept_errors) ? | |
| 173 | + stype[:fastcgi_intercept_errors] : false | |
| 174 | + | |
| 175 | + template "#{inc_dir}/inc_type_basic_#{site_sname}" do | |
| 176 | + source 'inc_type_basic.erb' | |
| 177 | + mode 0644 | |
| 178 | + action :create_if_missing | |
| 179 | + variables( | |
| 180 | + :index => site_index, | |
| 181 | + :subpath => stype_subp, | |
| 182 | + :upstream_name => stype_ups, | |
| 183 | + :add_statements => stype_ads, | |
| 184 | + :fastcgi_intercept_errors => stype_intererror | |
| 185 | + ) | |
| 186 | + end | |
| 187 | + site_includes.push("#{inc_dir}/inc_type_basic_#{site_sname}") | |
| 188 | + | |
| 189 | + # STANDARD WORDPRESS SITE | |
| 190 | + when 'wordpress' | |
| 191 | + stype_intererror = stype.has_key?(:fastcgi_intercept_errors) ? | |
| 192 | + stype[:fastcgi_intercept_errors] : false | |
| 193 | + | |
| 194 | + template "#{inc_dir}/inc_type_wordpress_#{site_sname}" do | |
| 195 | + source 'inc_type_wordpress.erb' | |
| 196 | + mode 0644 | |
| 197 | + action :create_if_missing | |
| 198 | + variables( | |
| 199 | + :index => site_index, | |
| 200 | + :subpath => stype_subp, | |
| 201 | + :upstream_name => stype_ups, | |
| 202 | + :add_statements => stype_ads, | |
| 203 | + :loginpage_statements => stype[:loginpage_statements] || [], | |
| 204 | + :fastcgi_intercept_errors => stype_intererror | |
| 205 | + ) | |
| 206 | + end | |
| 207 | + site_includes.push("#{inc_dir}/inc_type_wordpress_#{site_sname}") | |
| 208 | + | |
| 209 | + # REVERSE PROXY WEBSERVER | |
| 210 | + when 'webserver' | |
| 211 | + template "#{inc_dir}/inc_type_webserver_#{site_sname}" do | |
| 212 | + source 'inc_type_webserver.erb' | |
| 213 | + mode 0644 | |
| 214 | + action :create_if_missing | |
| 215 | + variables( | |
| 216 | + :subpath => stype_subp, | |
| 217 | + :upstream_name => stype_ups, | |
| 218 | + :add_statements => stype_ads | |
| 219 | + ) | |
| 220 | + end | |
| 221 | + site_ins.push("map $http_upgrade $connection_upgrade {\n"\ | |
| 222 | + " default upgrade;\n"\ | |
| 223 | + " '' close;\n"\ | |
| 224 | + "}") | |
| 225 | + site_includes.push("#{inc_dir}/inc_type_webserver_#{site_sname}") | |
| 226 | + | |
| 227 | + else | |
| 228 | + Chef::Log.error("Unknown site type: #{stype[:type]}") | |
| 229 | + raise 'Unknown site type' | |
| 230 | + end | |
| 231 | + end | |
| 232 | + | |
| 233 | + # Create the main config file for this site | |
| 234 | + template "#{node['nginx']['dir']}/sites-available/#{site_sname}" do | |
| 235 | + source 'nginx_site.conf.erb' | |
| 236 | + action :create_if_missing | |
| 237 | + mode 0644 | |
| 238 | + notifies :restart, 'service[nginx]', :delayed | |
| 239 | + variables( | |
| 240 | + :server_name => site_sname, | |
| 241 | + :aliases => site_aliases, | |
| 242 | + :doc_root => site_doc_root, | |
| 243 | + :index => site_index, | |
| 244 | + :ssl => site_ssl, | |
| 245 | + :auth => site_auth, | |
| 246 | + | |
| 247 | + :access_log_options => site_alo, | |
| 248 | + :catch_all => site_catch_all, | |
| 249 | + | |
| 250 | + :path_crt => path_crt, | |
| 251 | + :path_key => path_key, | |
| 252 | + :path_pass => path_pass, | |
| 253 | + :path_dhparam => path_dhparam, | |
| 254 | + | |
| 255 | + :upstreams => upstreams, | |
| 256 | + :includes => site_includes, | |
| 257 | + :init_statements => site_ins, | |
| 258 | + :add_headers => site_aheads, | |
| 259 | + :server_statements_1 => site_ss1, | |
| 260 | + :server_statements_2 => site_ss2, | |
| 261 | + | |
| 262 | + :log_dir => node['nginx']['log_dir'] | |
| 263 | + ) | |
| 264 | + end | |
| 265 | + | |
| 266 | + nginx_site site_sname do | |
| 267 | + enable true | |
| 268 | + end | |
| 269 | +end | ... | ... |
| 1 | 1 | # |
| 2 | -# Author:: Earth U (<sysadmin@chromedia.com>) | |
| 2 | +# Author:: Earth U (<sysadmin @ chromedia.com>) | |
| 3 | 3 | # Cookbook Name:: cfe-nginx-php-fpm |
| 4 | 4 | # Recipe:: php-fpm |
| 5 | 5 | # |
| ... | ... | @@ -53,8 +53,6 @@ if node['php-fpm']['pools'] |
| 53 | 53 | pool2['php_options'] = def_php_opts unless pool['php_options'] |
| 54 | 54 | pool2['user'] = node['nginx']['user'] unless pool['user'] |
| 55 | 55 | pool2['group'] = node['nginx']['user'] unless pool['group'] |
| 56 | - pool2['listen'] = | |
| 57 | - node['cfe-nginx-php-fpm']['php_fastcgi_socket'] unless pool['listen'] | |
| 58 | 56 | |
| 59 | 57 | node.default['php-fpm']['pools'][key] = pool2 |
| 60 | 58 | end | ... | ... |
templates/default/inc_basic_php_fastcgi.erb
deleted
100644 → 0
| 1 | -# Generated by Chef | |
| 2 | -# | |
| 3 | - | |
| 4 | -# No need to enable this if PHP and Nginx share the same filesystem | |
| 5 | -#fastcgi_index index.php; | |
| 6 | - | |
| 7 | -# You should have "cgi.fix_pathinfo = 0;" in php.ini | |
| 8 | -fastcgi_split_path_info ^(.+\.php)(/.+)$; | |
| 9 | -include fastcgi_params; | |
| 10 | -fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | |
| 11 | - | |
| 12 | -<% socket = @socket[0] == '/' ? "unix:#{@socket}" : @socket -%> | |
| 13 | -fastcgi_pass <%= socket %>; |
templates/default/inc_restrictions.erb
renamed from
templates/default/restrictions.conf.erb
| ... | ... | @@ -2,18 +2,33 @@ |
| 2 | 2 | # |
| 3 | 3 | # A basic PHP site config. |
| 4 | 4 | |
| 5 | -# Pass all .php files onto a php-fpm/php-fcgi server. | |
| 5 | +<% @add_statements.each do |ads| -%> | |
| 6 | +<%= ads %> | |
| 7 | + | |
| 8 | +<% end -%> | |
| 9 | +# Pass all .php files onto a PHP-FPM fastcgi server. | |
| 6 | 10 | #location ~ [^/]\.php(/|$) { |
| 7 | 11 | # Customized location directive to account for URL subpathing: |
| 8 | 12 | location ~ ^/<%= @subpath %>.+\.php(/|$) { |
| 9 | 13 | try_files $uri =404; |
| 10 | 14 | |
| 11 | - # Enable only if implementing custom error pages | |
| 12 | - #fastcgi_intercept_errors on; | |
| 15 | + # No need to enable this if PHP and Nginx share the same filesystem | |
| 16 | + #fastcgi_index index.php; | |
| 17 | + | |
| 18 | +<% if @fastcgi_intercept_errors -%> | |
| 19 | + # Enable if implementing custom error pages | |
| 20 | + fastcgi_intercept_errors on; | |
| 21 | + | |
| 22 | +<% end -%> | |
| 23 | + # You should have "cgi.fix_pathinfo = 0;" in php.ini | |
| 24 | + fastcgi_split_path_info ^(.+\.php)(/.+)$; | |
| 25 | + include fastcgi_params; | |
| 26 | + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | |
| 13 | 27 | |
| 14 | - include <%= @basic_php_fastcgi %>; | |
| 28 | + fastcgi_pass <%= @upstream_name %>; | |
| 15 | 29 | } |
| 16 | 30 | |
| 17 | 31 | location ~ ^/<%= @subpath %> { |
| 18 | - try_files $uri $uri/ /<%= @subpath %><%= @index %>?$args; | |
| 32 | +<% str = @fastcgi_intercept_errors ? '=404' : "/#{@subpath}#{@index}?$args" -%> | |
| 33 | + try_files $uri $uri/ <%= str %>; | |
| 19 | 34 | } | ... | ... |
| ... | ... | @@ -6,6 +6,10 @@ if ($http_user_agent ~ "MSIE") { |
| 6 | 6 | return 303 https://browser-update.org/update.html; |
| 7 | 7 | } |
| 8 | 8 | |
| 9 | +<% @add_statements.each do |ads| -%> | |
| 10 | +<%= ads %> | |
| 11 | + | |
| 12 | +<% end -%> | |
| 9 | 13 | location ~ ^/<%= @subpath %> { |
| 10 | 14 | proxy_pass http://<%= @upstream_name %>; |
| 11 | 15 | proxy_http_version 1.1; | ... | ... |
| ... | ... | @@ -6,6 +6,10 @@ |
| 6 | 6 | # Add trailing slash to */wp-admin requests. |
| 7 | 7 | rewrite /<%= @subpath %>wp-admin$ $scheme://$host$uri/ permanent; |
| 8 | 8 | |
| 9 | +<% @add_statements.each do |ads| -%> | |
| 10 | +<%= ads %> | |
| 11 | + | |
| 12 | +<% end -%> | |
| 9 | 13 | # Deny access to any files with a .php extension in the uploads directory |
| 10 | 14 | # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban) |
| 11 | 15 | location ~* /<%= @subpath %>(.+/)*(?:uploads|files)/.*\.php$ { |
| ... | ... | @@ -26,7 +30,12 @@ location ~ ^/<%= @subpath %>(wp-admin|wp-login\.php) { |
| 26 | 30 | fastcgi_intercept_errors on; |
| 27 | 31 | |
| 28 | 32 | <% end -%> |
| 29 | - include <%= @basic_php_fastcgi %>; | |
| 33 | + # You should have "cgi.fix_pathinfo = 0;" in php.ini | |
| 34 | + fastcgi_split_path_info ^(.+\.php)(/.+)$; | |
| 35 | + include fastcgi_params; | |
| 36 | + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | |
| 37 | + | |
| 38 | + fastcgi_pass <%= @upstream_name %>; | |
| 30 | 39 | } |
| 31 | 40 | } |
| 32 | 41 | |
| ... | ... | @@ -40,9 +49,15 @@ location ~ ^/<%= @subpath %>.+\.php(/|$) { |
| 40 | 49 | fastcgi_intercept_errors on; |
| 41 | 50 | |
| 42 | 51 | <% end -%> |
| 43 | - include <%= @basic_php_fastcgi %>; | |
| 52 | + # You should have "cgi.fix_pathinfo = 0;" in php.ini | |
| 53 | + fastcgi_split_path_info ^(.+\.php)(/.+)$; | |
| 54 | + include fastcgi_params; | |
| 55 | + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | |
| 56 | + | |
| 57 | + fastcgi_pass <%= @upstream_name %>; | |
| 44 | 58 | } |
| 45 | 59 | |
| 46 | 60 | location ~ ^/<%= @subpath %> { |
| 47 | - try_files $uri $uri/ /<%= @subpath %><%= @index %>?$args; | |
| 61 | +<% str = @fastcgi_intercept_errors ? '=404' : "/#{@subpath}#{@index}?$args" -%> | |
| 62 | + try_files $uri $uri/ <%= str %>; | |
| 48 | 63 | } | ... | ... |
| 1 | 1 | # Generated by Chef |
| 2 | 2 | # |
| 3 | -<% | |
| 4 | -@init_statements.each do |ins| | |
| 5 | --%> | |
| 6 | -<%= ins %> | |
| 7 | - | |
| 8 | -<% | |
| 9 | -end | |
| 10 | 3 | |
| 11 | -@upstreams.each do |us| | |
| 12 | --%> | |
| 4 | +<% ## -%> | |
| 5 | +<% ## Initial directives -%> | |
| 6 | +<% ## -%> | |
| 7 | +<% @init_statements.each do |ins| -%> | |
| 8 | +<%= ins %> | |
| 9 | +<% end -%> | |
| 10 | +<% ## -%> | |
| 11 | +<% ## List upstreams -%> | |
| 12 | +<% ## Example @upstreams element: -%> | |
| 13 | +<% ## { -%> | |
| 14 | +<% ## :name => 'string', -%> | |
| 15 | +<% ## :servers => [ -%> | |
| 16 | +<% ## '127.0.0.1:9000', -%> | |
| 17 | +<% ## '/var/run/php-fpm.sock' -%> | |
| 18 | +<% ## ] -%> | |
| 19 | +<% ## } -%> | |
| 20 | +<% ## -%> | |
| 21 | +<% @upstreams.each do |us| -%> | |
| 22 | +<% us_servers = us[:servers].inject([]) do |acc, serv| -%> | |
| 23 | +<% acc << ( serv[0] == '/' ? "unix:#{serv}" : serv ) -%> | |
| 24 | +<% acc -%> | |
| 25 | +<% end -%> | |
| 13 | 26 | upstream <%= us[:name] %> { |
| 14 | - server <%= us[:ip] %>:<%= us[:port] %>; | |
| 27 | +<% us_servers.each do |serv| -%> | |
| 28 | + server <%= serv %>; | |
| 29 | +<% end -%> | |
| 15 | 30 | } |
| 16 | 31 | |
| 17 | -<% | |
| 18 | -end | |
| 19 | - | |
| 20 | -servers = [@server_name] | |
| 21 | -@aliases.each do |aname| | |
| 22 | - servers << aname | |
| 23 | -end | |
| 24 | -servers.uniq! | |
| 25 | - | |
| 26 | -if @catch_all | |
| 27 | --%> | |
| 32 | +<% end -%> | |
| 33 | +<% ## -%> | |
| 34 | +<% ## Server block for default nameless server -%> | |
| 35 | +<% ## -%> | |
| 36 | +<% if @catch_all -%> | |
| 28 | 37 | server { |
| 29 | 38 | listen 80 default_server; |
| 30 | 39 | server_name _; |
| 31 | 40 | return 444; |
| 32 | 41 | } |
| 33 | 42 | |
| 34 | -<% | |
| 35 | -end | |
| 36 | -if @ssl | |
| 37 | - if @catch_all | |
| 38 | --%> | |
| 43 | +<% end -%> | |
| 44 | +<% ## -%> | |
| 45 | +<% ## Main server block -%> | |
| 46 | +<% ## -%> | |
| 47 | +<% servers = @aliases.inject([@server_name]) do |acc, elem| -%> | |
| 48 | +<% acc << elem -%> | |
| 49 | +<% end -%> | |
| 50 | +<% servers.uniq! -%> | |
| 51 | +<% if @ssl -%> | |
| 52 | +<% if @catch_all -%> | |
| 39 | 53 | server { |
| 40 | 54 | listen 443 default_server; |
| 41 | 55 | server_name _; |
| 42 | 56 | return 444; |
| 43 | 57 | } |
| 44 | 58 | |
| 45 | -<% | |
| 46 | - end | |
| 47 | --%> | |
| 59 | +<% end -%> | |
| 48 | 60 | server { |
| 49 | 61 | listen 80; |
| 50 | 62 | server_name <%= servers.join(' ') %>; |
| ... | ... | @@ -57,53 +69,66 @@ server { |
| 57 | 69 | ssl_certificate <%= @path_crt %>; |
| 58 | 70 | ssl_certificate_key <%= @path_key %>; |
| 59 | 71 | <% unless @ssl[:self_signed] -%> |
| 72 | +<% if @ssl[:cipher_suite] == 'modern' -%> | |
| 60 | 73 | |
| 61 | 74 | # Modern cipher suite: |
| 62 | - #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK; | |
| 75 | + ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK; | |
| 76 | +<% else -%> | |
| 77 | + | |
| 63 | 78 | # Medium compatibility cipher suite (compatible with IE7 WinXP): |
| 64 | 79 | ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA; |
| 80 | +<% end -%> | |
| 65 | 81 | ssl_prefer_server_ciphers on; |
| 66 | 82 | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; |
| 67 | 83 | ssl_session_cache shared:SSL:10m; |
| 68 | 84 | ssl_dhparam <%= @path_dhparam %>; |
| 69 | 85 | <% end -%> |
| 70 | - | |
| 71 | -<% | |
| 72 | - hsts = "max-age=#{@ssl[:hsts_max_age]};" | |
| 73 | - hsts << 'includeSubDomains;' if @ssl[:hsts_include_subdomains] | |
| 74 | --%> | |
| 86 | +<% hage = @ssl[:hsts_max_age] || '15758000' -%> | |
| 87 | +<% hsub = @ssl.has_key?(:hsts_subdomains) ? @ssl[:hsts_subdomains] : true -%> | |
| 88 | +<% hsts = "max-age=#{hage};" -%> | |
| 89 | +<% hsts << 'includeSubDomains;' if hsub -%> | |
| 75 | 90 | add_header Strict-Transport-Security "<%= hsts %>"; |
| 76 | -<% | |
| 77 | -else | |
| 78 | --%> | |
| 91 | +<% else -%> | |
| 79 | 92 | server { |
| 80 | 93 | listen 80; |
| 81 | 94 | |
| 82 | -<% | |
| 83 | -end | |
| 84 | --%> | |
| 85 | - add_header X-Frame-Options SAMEORIGIN; | |
| 86 | - add_header X-Content-Type-Options nosniff; | |
| 95 | +<% end -%> | |
| 96 | +<% @add_headers.each do |header, value| -%> | |
| 97 | + add_header <%= header %> <%= value %>; | |
| 98 | +<% end -%> | |
| 99 | + | |
| 100 | + # Add CSP headers here: | |
| 101 | + # [https://www.owasp.org/index.php/Content_Security_Policy] | |
| 102 | + # [http://www.html5rocks.com/en/tutorials/security/content-security-policy/] | |
| 103 | + # | |
| 104 | + #add_header Content-Security-Policy "default-src 'self'"; | |
| 105 | + #add_header X-Content-Security-Policy "default-src 'self'"; | |
| 87 | 106 | |
| 88 | 107 | server_name <%= servers.join(' ') %>; |
| 89 | - | |
| 108 | +<% if @doc_root -%> | |
| 90 | 109 | root <%= @doc_root %>; |
| 110 | +<% end -%> | |
| 111 | +<% if @index -%> | |
| 91 | 112 | index <%= @index %>; |
| 113 | +<% end -%> | |
| 92 | 114 | |
| 93 | 115 | <% if @auth -%> |
| 94 | 116 | auth_basic "<%= @auth[:msg] %>"; |
| 95 | 117 | auth_basic_user_file <%= @path_pass %>; |
| 96 | 118 | |
| 97 | 119 | <% end -%> |
| 98 | - access_log <%= node['nginx']['log_dir'] %>/<%= @server_name %>.access.log<% if @access_log_options %> <%= @access_log_options %><% end %>; | |
| 99 | - error_log <%= node['nginx']['log_dir'] %>/<%= @server_name %>.error.log; | |
| 120 | + access_log <%= @log_dir %>/<%= @server_name %>.access.log<% if @access_log_options %> <%= @access_log_options %><% end %>; | |
| 121 | + error_log <%= @log_dir %>/<%= @server_name %>.error.log; | |
| 122 | + | |
| 123 | +<% @server_statements_1.each do |s1| -%> | |
| 124 | + <%= sm %> | |
| 125 | +<% end -%> | |
| 100 | 126 | |
| 101 | - include <%= @path_rest %>; | |
| 102 | 127 | <% @includes.each do |inc| -%> |
| 103 | 128 | include <%= inc %>; |
| 104 | 129 | <% end -%> |
| 105 | 130 | |
| 106 | -<% @custom_statements.each do |sm| -%> | |
| 107 | - <%= sm %> | |
| 131 | +<% @server_statements_2.each do |s2| -%> | |
| 132 | + <%= s2 %> | |
| 108 | 133 | <% end -%> |
| 109 | 134 | } | ... | ... |