My brother called to talk about moving his company's web development and testing environment in-house. They had already downloaded Ubuntu but didn't know how to get Apache, MySQL, or PHP installed. I sent him one command and 5 minutes later, they had a fully functional LAMP stack running.
THIS POST IS VERY OLD. There are better resources out there, like the DigitalOcean guide to installing Apache on Ubuntu 22.04.
Below is a laundry list of commands to help you configure the perfect Ubuntu server.
Last Update: 12/16/2019 - local copy and user permission updates
First things first: update
sudo apt-get update && sudo apt-get upgradeLAMP Stack (Apache, Mysql, PHP)
This will install the LAMP stack in one command. (Note: this will not include the latest versions of things, but is the easiest way. See below to obtain bleeding edge things)
sudo apt-get install lamp-server^PHP 7.1
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install -y php7.1http://askubuntu.com/questions/705880/how-to-install-php-7
Apache 2.4+
sudo add-apt-repository ppa:ondrej/apache2
sudo apt-get update
sudo apt-get install apache2MySQL 5.7+
sudo add-apt-repository -y ppa:ondrej/mysql-5.7
sudo apt-get update
sudo apt-get install mysql-server-5.7NGINX
NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server.
sudo apt-get install nginxNGINX doesn't start on its own, so:
sudo service nginx startLearn about configuring NGINX as a front-end proxy with Apache.
phpMyAdmin
phpMyAdmin allows you to manage your MySQL Database via web browser.
sudo apt-get install phpmyadminChoose Apache and then YES for dbconfig-common. If you ever need to edit phpMyAdmin config:
sudo nano /etc/dbconfig-common/phpmyadmin.confWebmin
Webmin is an open-source server management tool much like cPanel.
sudo nano /etc/apt/sources.listScroll to the bottom and paste the following lines then save:
deb http://download.webmin.com/download/repository sarge contrib
deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib
Import the key:
wget http://www.webmin.com/jcameron-key.asc
sudo apt-key add jcameron-key.ascUpdate the sources list:
sudo apt-get updateRun the install:
sudo apt-get install webminStart Webmin:
sudo /etc/webmin/startWhen it's finished, open Firefox or Chrome and type:
http://localhost:10000/http://your-server-ip:10000/(if on a network)
If you've installed a fresh copy of Ubuntu (or if you don't know your password) you can set a new one:
sudo passwd ubuntuYou'll be prompted to enter your new password twice. Now, you can login to Webmin.
ProFTPd
ProFTPd is a high-performance FTP server.
sudo apt-get install proftpd(I always select "standalone")
Turn on Passive FTP via Webmin: Servers -> ProFTPD server -> Virtual Servers -> Default Server -> Networking Options
- Masquerade as address = your-server-outside-ip
- PASV Port Range: 1024-1088
Sendmail
sudo apt-get install sendmailPostFix Mail
sudo apt-get install postfixSelect "Internet Site" and then enter the domain name you want the Reverse DNS entry to be.
BTW: To avoid your server being blacklisted, get a reverse DNS entry!
Alternative PHP Cache (APC)
APC is a PHP opcode cacher and works by caching PHP objects, functions, and database queries into your server's RAM. If you run a WordPress website, it takes full advantage of APC out-of-the-box. See my post on The Perfect APC Configuration. Note, APC is no longer available in PHP 5.5+ as it's now called opcache.
sudo apt-get install php-apcBy default, Ubuntu will install this from a repository that has an outdated version. To install the latest version of APC:
sudo apt-get install make
sudo apt-get install libpcre3-dev
sudo apt-get install php-pear
sudo pecl install apc
sudo /etc/init.d/apache2 restartUninstall APC:
sudo pecl uninstall apcMemcached
Memcached is a high-performance, distributed memory object caching system. However, it can work together with multiple servers (unlike APC).
sudo apt-get install memcached
sudo apt-get install php-pear
sudo pecl install memcacheCheck to see if Memcached is running:
ps aux | grep memcachedFail2Ban
Fail2Ban scans log files (e.g. /var/log/apache/error_log) and automatically bans IPs that show malicious signs for exploits.
sudo apt-get install fail2banRSYNC
RSYNC is an open source utility that provides fast incremental file transfer.
sudo apt-get install rsyncServer-to-server transfers with RSYNC:
rsync -zvr /path/to/local/folder [email protected]:path/to/remote/folderImageMagick
ImageMagick is a software suite to create, edit, compose, or convert bitmap images.
sudo apt-get install imagemagickImage Optimization
First, install both jpegoptim and optipng.
sudo apt-get install jpegoptim optipngCD into a directory that has images and type:
jpegoptim *.jpg -p -v -t -T 10Optimize PNGs:
optipng *.pngIcecast2
Icecast is a streaming audio server. If you ever wanted to have your own web radio station (like Shoutcast) this is the software.
sudo apt-get install icecast2Configure Icecast2. Mainly, setting up your passwords and default port.
sudo nano /etc/icecast2/icecast.xmlEnable init.d script. Scroll to the bottom and change enable=true:
sudo nano /etc/default/icecast2/Start icecast2:
sudo /etc/init.d/icecast2 startIf you left the default port as 8000 then you can view your Icecast2 Server at http://your-server.com:8000/.
Munin
Munin is a networked resource monitoring tool that can help analyze resource trends and "what just happened to kill our performance?" problems.
sudo apt-get install php-cliNow, this is a single server setup, so let's install munin and munin-node:
sudo apt-get install munin munin-nodeConfigure Munin:
sudo nano /etc/munin/munin.confThe first thing you should see is the operating directories. We need to change one of them:
# dbdir /var/lib/munin
# htmldir /var/cache/munin/www
# logdir /var/log/munin
# rundir /var/run/munin
to:
# dbdir /var/lib/munin
htmldir /var/www/munin
# logdir /var/log/munin
# rundir /var/run/munin
Now let's edit apache.conf:
sudo nano /etc/munin/apache.confDelete everything inside apache.conf and just add:
Alias /munin /var/www/munin
Move the web files to /var/www/munin:
sudo mv /var/cache/munin/www/ /var/www/muninSet permissions:
sudo chown munin.munin -R /var/www/muninRestart Munin:
sudo /etc/init.d/munin-node restartFinally, restart Apache:
sudo /etc/init.d/apache2 restartThen visit http://your-server.com/munin.
Cacti
Cacti graphical server monitor provides a fast poller, advanced graph templating, multiple data acquisition methods, and user management features out of the box.
sudo apt-get install cacti-spineChoose YES for dbconfig-common and Apache2. When finished you need to configure at http://your-server-ip-address/cacti. Default user and password: admin / admin.
Remove cacti:
sudo apt-get remove cactiBMON
bmon is a bandwidth monitor capable of retrieving statistics from various input modules.
sudo apt-get install bmonWhen it's finished installing:
bmonZip and Unzip
In my experience ZIP is great for creating archives for sharing via email or ftp. It's a universal format that almost everyone can open. I would NOT use ZIP for file backups. For large backups, see 7ZIP or TAR below.
sudo apt-get install zipZip up a folder:
zip uploads-backup.zip /wp-content/uploadsUnzip (extract) an archive:
unzip uploads-backup.zip /wp-content/uploads7ZIP
7ZIP is a very popular archiving program with excellent compression. Plus, it's open source and supports multiple operating systems.
sudo apt-get install p7zipCreate an archive:
7za a uploads-backup.7z /wp-content/uploadsExtract an archive:
7za e uploads-backup.7z /wp-content/uploadsTAR (Tape Archive)
TAR is the preferred way to handle file backups. The maximum allowed file size only depends on your hard drive. A disk formatted with FAT32 only allows 2GB. You can also compress TAR using GZIP or BZ2.
tar -cvf uploads-backup.tar /wp-content --exclude='uploads/*'GZIP - good compression, very fast. Note: .tar.gz and .tgz are the same:
tar -cvzf uploads-backup.tgz /wp-content --exclude='uploads/*'BZ2 - excellent compression, but slower. Works best archiving a smaller directory. Note: .tar.bz2 and .tbz are the same:
tar -cvfj plugins-backup.tbz /wp-content --exclude='uploads/*'Untar (extract) an archive and if tarball already contains a directory name, strip it:
tar -xvf -backup.tar -C /DESTINATION/FOLDER --strip-components=1If you want to tarball the directory you're currently in with gzip:
tar -cvzf backup.tar.gz .Other handy commands
View all running services:
service --status-allCreate a MySQL database backup:
mysqldump --databases db1 db2 db3 > database_backup.sqlRestart PHP 7.0:
sudo restart php7.0-fpmMove files from one directory to another:
mv -v /source-dir/* /destination-dir/Copy files from one directory to another:
cp -a /source-dir/. /destination-dir/Note: You may need to reset permissions since they will be copied over also.
sudo chmod -R 775 /PATH/TO/FOLDER
sudo chown -R www-data:www-data /PATH/TO/FOLDERSet the server timezone:
sudo dpkg-reconfigure tzdataAdd a user to the list of sudoers (you have to be logged in as root, or know the sudo password):
sudo adduser username sudoDownload files:
wget http://example.com/wp-content/uploads/uploads-backup.tarLocal-to-server transfers with SCP:
scp path/to/local-file [email protected]:/path/to/server/folderServer-to-local transfers with SCP (transfer entire directories):
scp -r [email protected]:/path/to/server/folder /path/to/local/folderServer-to-local transfers with SCP (transfer single file):
scp [email protected]:/path/to/server/file /path/to/local/folderServer-to-server transfers with SCP:
scp -P 22 -r [email protected]:path/to/remote/folder path/to/local/folderServer-to-server transfer with SCP into the current directory (read more about SCP):
scp -P 22 -r [email protected]:path/to/remote/folder .List size of directories:
du -a -h --max-depth=1 | sort -hrSet a password:
sudo passwd ubuntuEdit PHP.ini
sudo nano /etc/php5/apache2/php.iniRestart Apache:
sudo /etc/init.d/apache2 restartSet Recursive Permissions for your websites directory
sudo chmod -R 775 /PATH/TO/FOLDER
sudo chown -R www-data:www-data /PATH/TO/FOLDERBlock IP address using IPTABLES
Single IP:
sudo iptables -I INPUT -s 192.168.100.1 -j DROPIP Range:
sudo iptables -I INPUT -s 192.168.100.0/24 -j DROPYou can also manage IPTABLES (the Linux firewall) via Webmin under Networking -> Linux Firewall.
Manage packages
sudo apt-get update && sudo apt-get upgrade
sudo apt-get autoremoveRemove LAMP
sudo apt-get purge libapache2-mod-auth-mysql phpmyadmin
sudo apt-get purge mysql-server mysql-server-5.1 mysql-server-core-5.1
sudo apt-get purge apache2 apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common libapache2-mod-php5
sudo apt-get autoremoveServe your websites from an EBS volume
This practice has saved my butt on more than one occasion. Rather than use the given storage attached to the EC2 instance, I always create a 1TB EBS volume and mount it as /public_html/. That way, if your EC2 instance crashes, your web site files will not.
For this, we'll assume our attached EBS volume is /xvdf/.
Check out the official documentation from Amazon AWS.
First you must be logged in as root:
suMake sure you're in the file system root:
cdNow, let's list all the attached drives. You should see /dev/xvda1, /dev/xvdb, /dev/xvdf/ etc.:
sudo fdisk -lLet's make a directory (such as /public_html/):
mkdir /public_html/Finally, let's mount our EBS volume:
mount -t ext4 /dev/xvdf /public_html/Now you can serve your websites from an EBS volume!
Benchmark the CPU
for i in {0..10000}; do for j in {0..1000}; do :; done; doneMore resources
- What is Amazon EC2? (official user guides for Amazon AWS)
- Setup Virtual Hosts in Webmin
- http://www.ubuntugeek.com/step-by-step-ubuntu-11-04-natty-lamp-server-setup.html
- http://www.howtoforge.com/ubuntu_lamp_for_newbies
- http://www.techtickle.com/how-to-setup-lamp-on-ubuntu.html
- List of PHP accelerators
- Distributed Caching with Memcached
- Run your own webradio station with Icecast
- How to recover a Linux EC2 Instance after being locked out
- Install LAMP on Amazon EC2
- Install and configure Cacti Monitor Tool in Ubuntu
- Install NGINX instead of Apache
- Install/Setup WordPress on Amazon EC2
- RSYNC for transfers
- RSYNC commands
- Using Fail2Ban with IP Tables
- http://www.tecmint.com/optimize-and-compress-jpeg-or-png-batch-images-linux-commandline/
