Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Install Ubuntu 11.04 Nginx based web server with PHP-FPM, MySQL and MongoDB
#!/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)" <mysqlPassword>
#
# Be sure to replace <mysqlPassword> 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 ..
"'
@shama

This comment has been minimized.

Copy link

commented Jan 5, 2012

You could do git clone -b 1.3 git://github.com/cakephp/cakephp.git cakephp-1.3 and skip the next 3 lines when cloning cake. :)

@predominant

This comment has been minimized.

Copy link
Owner Author

commented Jan 5, 2012

Thanks @shama! I did exactly that :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.