Commit e853b45d9b0bc1c206c5a182ae43cae521a4e5c3

Authored by Earth Ugat
1 parent bb2c5262

Bump to v0.2.0. Add 'webserver' config. Fix some bugs.

  1 +# 0.2.0
  2 +
  3 +Add basic proxied webserver config
  4 +
1 5 # 0.1.2
2 6
3 7 Fix the derived attribute pitfalls
... ...
... ... @@ -2,7 +2,7 @@
2 2
3 3 Installs PHP5-FPM, Nginx, Postfix, and MariaDB client on a server. Also sets up webserver configs for all virtual servers, including TLS and basic auth.
4 4
5   -Can also auto-generate config files for certain site types, such as Wordpress, etc. (right now it's just Wordpress).
  5 +Can also auto-generate config files for certain site types, such as Wordpress, etc. (right now it's: `wordpress`, `basic`, and `webserver`).
6 6
7 7 ## Supported Platforms
8 8
... ...
... ... @@ -50,20 +50,20 @@ default['cfe-nginx-php-fpm']['nginx']['restriction_file']['static_types'] = %w{
50 50 }
51 51
52 52 default['cfe-nginx-php-fpm']['nginx']['sites'] = [
53   - {
54   - :server_name => 'example.com',
55   - :aliases => ['www.example.com'],
56   - :doc_root => '/var/www/example.com',
57   - :index => 'index.php',
  53 + #{
  54 + #:server_name => 'example.com',
  55 + #:aliases => ['www.example.com'],
  56 + #:doc_root => '/var/www/example.com',
  57 + #:index => 'index.php',
58 58
59 59 # Access log options as one long string. Default: false
60   - #:access_log_options => '<some options>'
  60 + #:access_log_options => '<some options>',
61 61
62 62 # Whether to include a default virtual server named '_' or not.
63 63 # If there is more than one server given in this 'sites' array,
64 64 # 'catch_all' value will always be overriden to 'false'.
65 65 # Default: true
66   - #:catch_all => true
  66 + #:catch_all => true,
67 67
68 68 # Necessary values for SSL/TLS setup. Default: :ssl => false
69 69 #:ssl => {
... ... @@ -73,7 +73,7 @@ default['cfe-nginx-php-fpm']['nginx']['sites'] = [
73 73 # :self_signed => false,
74 74 # :hsts_max_age => '15758000',
75 75 # :hsts_include_subdomains => true
76   - #}
  76 + #},
77 77
78 78 # Necessary values for Basic Auth setup. Default: :auth => false
79 79 #:auth => {
... ... @@ -81,11 +81,15 @@ default['cfe-nginx-php-fpm']['nginx']['sites'] = [
81 81 # :users => {
82 82 # 'example_user' => 'secretpassword123'
83 83 # }
84   - #}
  84 + #},
  85 +
  86 + # Array of strings that will be written before the start of
  87 + # the 'server' declaration. Default: []
  88 + #:init_statements => [],
85 89
86 90 # An array of strings that will be included as statements in the main
87 91 # nginx config file for this server. Default: []
88   - #:custom_statements => []
  92 + #:custom_statements => [],
89 93
90 94 # Enumerates the different site types this server supports.
91 95 # Possible elements of :types are (only :type is mandatory):
... ... @@ -101,8 +105,15 @@ default['cfe-nginx-php-fpm']['nginx']['sites'] = [
101 105 # # written on the config for the
102 106 # # /wp-login.php and /wp-admin pages.
103 107 # }
104   - :types => [ { :type => 'basic' } ]
105   - }
  108 + # {
  109 + # :type => 'webserver',
  110 + # :subpath => '',
  111 + # :upstream_name => 'example',
  112 + # :upstream_ip => '127.0.0.1',
  113 + # :upstream_port => '8080',
  114 + # }
  115 + #:types => []
  116 + #}
106 117 ]
107 118
108 119 #
... ... @@ -178,7 +189,7 @@ default['postfix']['main']['mydestination'] =
178 189 #
179 190 # nginx cookbook
180 191 #
181   -default['nginx']['version'] = '1.9.14'
  192 +default['nginx']['version'] = '1.9.15'
182 193 default['nginx']['install_method'] = 'package'
183 194 default['nginx']['package_name'] = 'nginx'
184 195 default['nginx']['repo_source'] = 'nginx'
... ... @@ -188,16 +199,29 @@ default['nginx']['upstream_repository'] =
188 199 # nginx package's pid file. Otherwise, it fails to restart.
189 200 default['nginx']['pid'] = '/var/run/nginx.pid'
190 201 default['nginx']['default_site_enabled'] = false
191   -default['nginx']['client_max_body_size'] = '10m'
192   -default['nginx']['event'] = 'epoll'
193   -default['nginx']['worker_processes'] = 'auto'
194   -default['nginx']['worker_connections'] = 1_024
195   -default['nginx']['keepalive_timeout'] = 15
196   -default['nginx']['keepalive_requests'] = 200
197   -default['nginx']['disable_access_log'] = false
198   -default['nginx']['server_tokens'] = 'off'
199   -default['nginx']['gzip_comp_level'] = '5'
200   -default['nginx']['extra_configs'] = {
  202 +
  203 +default['nginx']['client_max_body_size'] = '10m'
  204 +default['nginx']['client_body_buffer_size'] = '64k'
  205 +default['nginx']['keepalive_timeout'] = 15
  206 +default['nginx']['keepalive_requests'] = 200
  207 +
  208 +default['nginx']['event'] = 'epoll'
  209 +default['nginx']['multi_accept'] = true
  210 +
  211 +# Setting worker_processes to 'auto' will automatically
  212 +# set the value to the number of CPUs. But we're going to
  213 +# set it to twice that.
  214 +default['nginx']['worker_processes'] =
  215 + ( %x(grep ^processor /proc/cpuinfo | wc -l).to_i ) * 2
  216 +# Either use `ulimit -n` (usually 1024) for worker_connections, or
  217 +# set it to a much higher value, but not exceeding worker_rlimit_nofile.
  218 +default['nginx']['worker_connections'] = 10000
  219 +default['nginx']['worker_rlimit_nofile'] = 15000
  220 +
  221 +default['nginx']['disable_access_log'] = false
  222 +default['nginx']['server_tokens'] = 'off'
  223 +default['nginx']['gzip_comp_level'] = '5'
  224 +default['nginx']['extra_configs'] = {
201 225 'reset_timedout_connection' => 'on'
202 226 }
203 227 # Increase this to 128 if using super long server names
... ...
... ... @@ -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.1.2'
  7 +version '0.2.0'
8 8
9 9 {
10 10 'php-fpm' => '0.7.5',
... ...
... ... @@ -79,11 +79,11 @@ attribs['sites'].each do |site|
79 79 site_index = site[:index] || 'index.php'
80 80 site_aliases = site[:aliases] || []
81 81 site_doc_root = site[:doc_root] || ''
82   - site_index = site[:index] || 'index.html'
83 82 site_ssl = site[:ssl] || false
84 83 site_auth = site[:auth] || false
85 84 site_alo = site[:access_log_options] || false
86 85 site_cs = site[:custom_statements] || []
  86 + site_ins = site[:init_statements] || []
87 87
88 88 site_types = ( site[:types] || [] ).uniq { |e| e[:type] }
89 89
... ... @@ -142,10 +142,12 @@ attribs['sites'].each do |site|
142 142 end
143 143
144 144 site_includes = []
  145 + upstreams = []
145 146
146 147 # Create necessary include files for each type of this site
147 148 site_types.each do |stype|
148   - stype_subpath = stype[:subpath] || ''
  149 + stype_subp = stype[:subpath] ? stype[:subpath].gsub(/^\/+|\/$|\s/, '') : ''
  150 + stype_subp = stype_subp.length > 0 ? "#{stype_subp}/" : stype_subp
149 151
150 152 case stype[:type]
151 153 # BASIC PHP SITE
... ... @@ -156,7 +158,7 @@ attribs['sites'].each do |site|
156 158 action :create_if_missing
157 159 variables(
158 160 :index => site_index,
159   - :subpath => stype_subpath,
  161 + :subpath => stype_subp,
160 162 :basic_php_fastcgi => path_bpf
161 163 )
162 164 end
... ... @@ -170,7 +172,7 @@ attribs['sites'].each do |site|
170 172 action :create_if_missing
171 173 variables(
172 174 :index => site_index,
173   - :subpath => stype_subpath,
  175 + :subpath => stype_subp,
174 176 :basic_php_fastcgi => path_bpf,
175 177 :loginpage_statements => stype[:loginpage_statements] || [],
176 178 :fastcgi_intercept_errors => stype[:fastcgi_intercept_errors] || false
... ... @@ -178,9 +180,32 @@ attribs['sites'].each do |site|
178 180 end
179 181 site_includes.push("#{inc_dir}/inc_type_wordpress_#{site_sname}")
180 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 +
181 206 else
182 207 Chef::Log.error("Unknown site type: #{stype[:type]}")
183   - raise 'Missing SSL key file'
  208 + raise 'Unknown site type'
184 209 end
185 210 end
186 211
... ... @@ -207,7 +232,9 @@ attribs['sites'].each do |site|
207 232 :path_dhparam => path_dhparam,
208 233 :path_rest => path_rest,
209 234
  235 + :upstreams => upstreams,
210 236 :includes => site_includes,
  237 + :init_statements => site_ins,
211 238 :custom_statements => site_cs
212 239 )
213 240 end
... ...
1   -<%
2   -subp = @subpath ? @subpath.gsub(/^\/+|\/$|\s/, '') : ''
3   -subp = subp.length > 0 ? "#{subp}/" : subp
4   --%>
5 1 # Generated by Chef
6 2 #
7 3 # A basic PHP site config.
... ... @@ -9,7 +5,7 @@ subp = subp.length > 0 ? "#{subp}/" : subp
9 5 # Pass all .php files onto a php-fpm/php-fcgi server.
10 6 #location ~ [^/]\.php(/|$) {
11 7 # Customized location directive to account for URL subpathing:
12   -location ~ ^/<%= subp %>.+\.php(/|$) {
  8 +location ~ ^/<%= @subpath %>.+\.php(/|$) {
13 9 try_files $uri =404;
14 10
15 11 # Enable only if implementing custom error pages
... ... @@ -18,6 +14,6 @@ location ~ ^/<%= subp %>.+\.php(/|$) {
18 14 include <%= @basic_php_fastcgi %>;
19 15 }
20 16
21   -location ~ ^/<%= subp %> {
22   - try_files $uri $uri/ /<%= subp %><%= @index %>?$args;
  17 +location ~ ^/<%= @subpath %> {
  18 + try_files $uri $uri/ /<%= @subpath %><%= @index %>?$args;
23 19 }
... ...
  1 +# Generated by Chef
  2 +#
  3 +# Basic config for proxied webserver (with websocket support)
  4 +
  5 +if ($http_user_agent ~ "MSIE") {
  6 + return 303 https://browser-update.org/update.html;
  7 +}
  8 +
  9 +location ~ ^/<%= @subpath %> {
  10 + proxy_pass http://<%= @upstream_name %>;
  11 + proxy_http_version 1.1;
  12 + proxy_set_header Upgrade $http_upgrade;
  13 + proxy_set_header Connection $connection_upgrade;
  14 + proxy_set_header X-Real-IP $remote_addr;
  15 + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  16 + proxy_set_header Host $http_host;
  17 +
  18 + if ($uri != '/') {
  19 + expires 30d;
  20 + }
  21 +}
... ...
1   -<%
2   -subp = @subpath ? @subpath.gsub(/^\/+|\/$|\s/, '') : ''
3   -subp = subp.length > 0 ? "#{subp}/" : subp
4   --%>
5 1 # Generated by Chef
6 2 #
7 3 # WordPress single blog rules.
8 4 # Designed to be included in any server {} block.
9 5
10 6 # Add trailing slash to */wp-admin requests.
11   -rewrite /<%= subp %>wp-admin$ $scheme://$host$uri/ permanent;
  7 +rewrite /<%= @subpath %>wp-admin$ $scheme://$host$uri/ permanent;
12 8
13 9 # Deny access to any files with a .php extension in the uploads directory
14 10 # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
15   -location ~* /<%= subp %>(.+/)*(?:uploads|files)/.*\.php$ {
  11 +location ~* /<%= @subpath %>(.+/)*(?:uploads|files)/.*\.php$ {
16 12 deny all;
17 13 }
18 14
19 15 <% if @loginpage_statements.length > 0 -%>
20   -location ~ ^/<%= subp %>(wp-admin|wp-login\.php) {
  16 +location ~ ^/<%= @subpath %>(wp-admin|wp-login\.php) {
21 17 <% @loginpage_statements.each do |statement| -%>
22 18 <%= statement %>
23 19 <% end -%>
24 20
25   - location ~ ^/<%= subp %>.+\.php(/|$) {
  21 + location ~ ^/<%= @subpath %>.+\.php(/|$) {
26 22 try_files $uri =404;
27 23
28 24 <% if @fastcgi_intercept_errors -%>
... ... @@ -36,7 +32,7 @@ location ~ ^/<%= subp %>(wp-admin|wp-login\.php) {
36 32
37 33 <% end -%>
38 34 # Pass all PHP files to the fastcgi proxy
39   -location ~ ^/<%= subp %>.+\.php(/|$) {
  35 +location ~ ^/<%= @subpath %>.+\.php(/|$) {
40 36 try_files $uri =404;
41 37
42 38 <% if @fastcgi_intercept_errors -%>
... ... @@ -47,6 +43,6 @@ location ~ ^/<%= subp %>.+\.php(/|$) {
47 43 include <%= @basic_php_fastcgi %>;
48 44 }
49 45
50   -location ~ ^/<%= subp %> {
51   - try_files $uri $uri/ /<%= subp %><%= @index %>?$args;
  46 +location ~ ^/<%= @subpath %> {
  47 + try_files $uri $uri/ /<%= @subpath %><%= @index %>?$args;
52 48 }
... ...
1 1 # Generated by Chef
2 2 #
  3 +<%
  4 +@init_statements.each do |ins|
  5 +-%>
  6 +<%= ins %>
  7 +
  8 +<%
  9 +end
  10 +
  11 +@upstreams.each do |us|
  12 +-%>
  13 +upstream <%= us[:name] %> {
  14 + server <%= us[:ip] %>:<%= us[:port] %>;
  15 +}
  16 +
3 17 <%
  18 +end
  19 +
4 20 servers = [@server_name]
5 21 @aliases.each do |aname|
6 22 servers << aname
... ...