Shell script: create virtual hosts with PHP/fastCGI (mod_fcgi)
UPDATES:
Version 1.1 – June 20 2011
- Added “FcgidMaxRequestLen 1000000000” to virtual host settings in order to get the WordPress Flash based image uploader to work. The default value in fcgid caused it to throw a “HTTP Error” when crunching the images.
- Commented out the Apache directive “ServerAlias” which in previous version defaulted to *.example.com. That of course might cause problems when setting up both root domain and sub domains on the same server. Feel free to uncomment or add custom aliases.
- Moved the ports.conf tip from script echo to comments at the end.
#!/bin/bash
# Shell script to create virtual hosts running PHP/FastCGI with mod_fcgi
# on Apache 2
# -------------------------------------------------------------------------
# Version 1.1 (June 20 2011)
# -------------------------------------------------------------------------
# Copyright (c) 2011 Finn Hensner <http://www.gerillafilm.se>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
clear
echo "# -----------------------------------------------------------"
echo "# ---------- Virtual host with mod_fcgi - installer ---------"
echo "# -----------------------------------------------------------"
read -p "Enter domain name to use: " domainName
read -p "Enter port number for virtual host: " port
if [ $(id -u) -eq 0 ]; then
read -p "Enter username : " userName
read -s -p "Enter password : " userPassword
egrep "^$userName" /etc/passwd >/dev/null
if [ $? -eq 0 ]; then
echo "$userName exists!"
exit 1
else
pass=$(perl -e 'print crypt($ARGV[0], "password")' $userPassword)
groupadd $userName;
useradd -s /bin/sh -p $pass -d /var/www/$domainName -m -g $userName $userName
[ $? -eq 0 ] && echo "User has been added to system!" || echo "Failed to add a user!"
fi
else
echo "Only root may add a user to the system"
exit 2
fi
clear
echo -e "\n\tDomain name: $domainName:$port"
echo -e "\tUser name: $userName"
echo -e "\tPassword: $userPassword"
echo "(Your user credentials will be saved in a .txt-file outside your web root)"
echo -e "\tFinish with these settings?\n\n"
select yn in "Yes" "No"; do
case $yn in
Yes ) echo "Preparing...";
#sleep 1
#groupadd $userName;
echo "Added group $groupName"
#sleep 1
#useradd -s /bin/sh -p $userPassword -d /var/www/$domainName -m -g $userName $userName
#echo "Added user $userName"
sleep 1
mkdir -p /var/www/$domainName/public_html
echo "Creating folder /var/www/$domainName/public_html"
sleep 2
chown -R $userName:$userName /var/www/$domainName
echo "Added ownership to webroot"
sleep 2
mkdir -p /var/www/php-fcgi-scripts/$domainName
echo "Created cgi script folder for $domainName"
sleep 1
echo -e "#!/bin/sh\nPHPRC=/etc/php5/cgi/\nexport PHPRC\nexport PHP_FCGI_MAX_REQUESTS=5000\nexport PHP_FCGI_CHILDREN=8\nexec /usr/lib/cgi-bin/php" > /var/www/php-fcgi-scripts/$domainName/php-fcgi-starter
echo "Created cgi-wrapper for $domainName"
sleep 1
chmod 755 /var/www/php-fcgi-scripts/$domainName/php-fcgi-starter
chown -R $userName:$userName /var/www/php-fcgi-scripts/$domainName
echo "Changed ownership on fcgi-wrapper"
sleep 1
echo -e "<VirtualHost *:$port>\n\tServerName $domainName\n\t#ServerAlias $domainName *.$domainName\n\tServerAdmin webmaster@$domainName\n\tDocumentRoot /var/www/$domainName/public_html\n\n\n\t<IfModule mod_fcgid.c>\n\t\tSuexecUserGroup $userName $userName\n\t\tFcgidMaxRequestLen 1000000000\n\t\t<Directory /var/www/$domainName/public_html>\n\t\t\tOptions +ExecCGI\n\t\t\tAllowOverride All\n\t\t\tAddHandler fcgid-script .php\n\t\t\tFCGIWrapper /var/www/php-fcgi-scripts/$domainName/php-fcgi-starter .php\n\t\t\tOrder allow,deny\n\t\t\tAllow from all\n\t\t</Directory>\n\t</IfModule>\n\n\nServerSignature Off\n\n\n</VirtualHost>" > /etc/apache2/sites-available/$domainName
echo "Added virtual host for $domainName"
sleep 1
a2ensite $domainName
echo "Enabling virtual host $domainName"
sleep 1
/etc/init.d/apache2 reload
echo "Restarting apache"
sleep 1
echo -e "Your account credentials:\n\nDomain name: $domainName:$port\nUser name: $userName\nPassword: $userPassword" > /var/www/$domainName/login-$domainName.txt
echo -e "******************************************************************************"
echo -e "Your account credentials:\n\nDomain name: $domainName:$port\nUser name: $userName\nPassword: $userPassword"
echo -e "Saved text file with credentials in /var/www/$domainName/login-$domainName.txt"
echo -e "******************************************************************************\n\n"
chown $userName:$userName /var/www/$domainName/login-$domainName.txt
chmod 600 /var/www/$domainName/login-$domainName.txt
break;;
No ) exit;;
esac
done
# -------------------------------------------------------------------------
# Make sure you edit /etc/apache2/ports.conf and add another NameVirtualHost
# if you want your server to listen to additional ports, ie 8080 for proxying.
# -------------------------------------------------------------------------
Instructions
To run the script, begin with pasting it into a new file:
nano vhost-fcgi.sh
Make it executable:
chmod 755 vhost-fcgi.sh
Run it:
./vhost-fcgi.sh
To easily install Apache 2 and dependencies, read Shell script: install Apache 2 with dependencies for PHP/mod_fcgi