#!/bin/bash ### # # Copyright (c) 2011 Cake Development Corporation (http://cakedc.com) # # Ubuntu 11.04 based web server installation script # Run this by executing the following from a fresh install of Ubuntu 11.04 server: # # bash -c "$(curl -fsSL https://raw.github.com/gist/1264701)" # # Be sure to replace with your intended MySQL Password. # Also, run this as root, unless you enjoy failing. # # Its handy to install 'screen' if you want to ensure your remote connection to # a server doesn't disrupt the installation process. If you want to do this, just # do the following before running the main bash command: # # apt-get install screen -y # screen # # To recover your session if you are disconnected, ssh to your server as root again, # and type: # # screen -x # # Dependencies: # - curl # # Todo: # - SSL Configuration # ### EXPECTEDARGS=0 if [ $# -ne $EXPECTEDARGS -o "x$0" == "x" -o $0 == "bash" ]; then echo "Usage:" echo " Parameter 1: MySQL root password" exit 1 fi MYSQLPASS=$1 export DEBIAN_FRONTEND=noninteractive ######################################## ## System Updates ######################################## apt-get update apt-get install \ curl \ aptitude \ -y apt-get upgrade -y ######################################## ## Tools and Utilities ######################################## apt-get install \ git-core \ subversion \ -y ######################################## ## MySQL ######################################## apt-get install \ mysql-client \ mysql-server \ -y mysqladmin -u root password $MYSQLPASS ######################################## ## PHP ######################################## apt-get install \ php5 \ php5-cli \ php5-common \ php5-curl \ php5-ffmpeg \ php5-fpm \ php5-gd \ php5-geoip \ php5-gmp \ php5-imagick \ php5-intl \ php5-json \ php5-mcrypt \ php5-memcached \ php5-mysql \ php-apc \ php-pear \ -y ######################################## ## Configure PHP-FPM ######################################## read -r -d '' FILECONTENT <<'ENDFILECONTENT' [www] listen = 127.0.0.1:9000 listen.allowed_clients = 127.0.0.1 user = www-data group = www-data pm = dynamic pm.max_children = 50 pm.start_servers = 25 pm.min_spare_servers = 5 pm.max_spare_servers = 35 pm.max_requests = 2500 pm.status_path = /php-status slowlog = log/$pool.log.slow chdir = / ;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com ;php_flag[display_errors] = off ;php_admin_value[error_log] = /var/log/fpm-php.www.log ;php_admin_flag[log_errors] = on ;php_admin_value[memory_limit] = 32M ENDFILECONTENT cp /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/www.conf.original echo "$FILECONTENT" > /etc/php5/fpm/pool.d/www.conf /etc/init.d/php5-fpm restart ######################################## ## Nginx ######################################## apt-get install \ nginx \ -y ## CakePHP Configuration read -r -d '' FILECONTENT <<'ENDFILECONTENT' include php.conf; location / { try_files $uri $uri/ /index.php?$uri&$args; expires max; access_log off; } ENDFILECONTENT echo "$FILECONTENT" > /etc/nginx/cakephp.conf ## Common Configuration read -r -d '' FILECONTENT <<'ENDFILECONTENT' index index.html; location ~ /\.ht { deny all; } ENDFILECONTENT echo "$FILECONTENT" > /etc/nginx/common.conf ## FastCGI Configuration read -r -d '' FILECONTENT <<'ENDFILECONTENT' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param HTTPS $ssl_session_id; fastcgi_index index.php; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200; fastcgi_connect_timeout 60; fastcgi_read_timeout 180; fastcgi_send_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; ENDFILECONTENT echo "$FILECONTENT" > /etc/nginx/fastcgi_params ## Nginx Main Configuration read -r -d '' FILECONTENT <<'ENDFILECONTENT' user www-data; worker_processes 4; pid /var/run/nginx.pid; events { worker_connections 768; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 2; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; gzip on; gzip_disable "msie6"; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } ENDFILECONTENT echo "$FILECONTENT" > /etc/nginx/nginx.conf ## PHP Configuration read -r -d '' FILECONTENT <<'ENDFILECONTENT' location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; } index index.php; ENDFILECONTENT echo "$FILECONTENT" > /etc/nginx/php.conf ## Default Site Configuration read -r -d '' FILECONTENT <<'ENDFILECONTENT' server { listen 80; ## listen for ipv4; this line is default and implied root /usr/share/nginx/www; index index.html index.htm; server_name localhost; location / { try_files $uri $uri/ /index.html; } location /doc { root /usr/share; autoindex on; allow 127.0.0.1; deny all; } location /images { root /usr/share; autoindex off; } } ENDFILECONTENT echo "$FILECONTENT" > /etc/nginx/sites-available/default ## Example CakePHP Site read -r -d '' FILECONTENT <<'ENDFILECONTENT' server { listen 80; server_name cakephpsite.com; root /var/virtual/cakephp-2.0/cakephpsite.com/webroot; access_log /var/log/nginx/cakephpsite.com-access.log; include common.conf; include cakephp.conf; } server { listen 80; server_name www.cakephpsite.com; rewrite ^ http://cakephpsite.com$uri permanent; } ENDFILECONTENT echo "$FILECONTENT" > /etc/nginx/sites-available/cakephp.example ## Example Plain PHP Site read -r -d '' FILECONTENT <<'ENDFILECONTENT' server { listen 80; server_name phpsite.com; root /var/virtual/phpsite.com; access_log /var/log/nginx/phpsite.com-access.log; include common.conf; include php.conf; } server { listen 80; server_name www.phpsite.com; rewrite ^ http://phpsite.com$uri permanent; } ENDFILECONTENT echo "$FILECONTENT" > /etc/nginx/sites-available/php.example /etc/init.d/nginx restart ######################################## ## CakePHP and Sites ######################################## mkdir -p /var/virtual mkdir -p /var/www chown www-data:www-data /var/virtual /var/www su www-data -c 'bash -c " cd /var/virtual git clone -b 1.3 git://github.com/cakephp/cakephp.git cakephp-1.3 cp -r cakephp-1.3 cakephp-2.0 cd cakephp-2.0 git checkout -b 2.0 origin/2.0 git branch -d 1.3 cd .. "'