Introduction
For a Symfony (an MVC framework) based project that I’m currently working on, I’ve had to install Apache (2.2) and Symfony 3 (and PHP 7) on Red Hat Enterprise Linux (RHEL). This blog outlines the steps I had to go through. This may be helpful for someone in the future.
Install/Configure Apache
Installing Apache on RHEL is as simple as running the following command:
yum install httpd
You need to prepend the above command with “sudo
” if you don’t have admin privileges (which is typical).
Once installed, you’ll need to edit the config file:
vi /etc/httpd/conf/httpd.conf
If you notice when using vi that comments are shown with a incredibly hard to read dark blue color, then you’ll want to edit your “~/.vimrc” file to at least add “:color desert
”. You can read more about it in my vim runtime control blog article.
Edit the httpd.conf file to at least make these changes:
ServerAdmin youremail@somedomain.com
...
# Use hostname if dns can be used, otherwise use IP address.
ServerName machine.host.name:80
#ServerName 192.168.0.10:80
That’s enough config until we install Symfony. Use “:wq!
” to save the changes.
Install PHP 7.0
By default, RHEL would install PHP 5.x (probably PHP 5.3 at this time), and this may not actually work for most modern PHP frameworks. PHP 7.0 has about a 2 times performance increase over PHP 5.x and it’s becoming readily adopted. Thus, it’s highly recommended to install PHP 7.0 these days.
To install PHP 7.0 on RHEL, you’ll need to enable the EPEL and IUS repositories. Use the following commands (run in your home directory) to first install EPEL:
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
sudo rpm -Uvh epel-release-*.rpm
Then install the IUS repo:
wget https://centos6.iuscommunity.org/ius-release.rpm
sudo rpm -Uvh ius-release*.rpm
When you’re using yum to search for PHP 7.0 items to install, you need to search for “php70u
”. This identifies PHP 7 verses PHP 5, which is simply “php
”. Now to install PHP 7 and some of the requirements needed for Symfony (and other PHP frameworks), run the following command:
sudo yum install php70u-cli php70u-json
php70u-ldap php70u-mbstring php70u-pdo php70u-mysqlnd php70u-xml php70u-process
After running the above command, run “php -v
” to verify it shows PHP version 7.
Install MariaDB
You should probably now be using MariaDB instead of MySQL. If you’re not sure why MariaDB is preferable, read the MariaDB article on Wikipedia. On RHEL, you’ll need to add a repository file. First go to: https://downloads.mariadb.org/mariadb/repositories/ and follow the instructions by selecting a Linux Distro and selecting the latest stable version of MariaDB.
Copy the text generated and paste it into the repo file that you will create with vi:
sudo vi /etc/yum.repos.d/MariaDB.repo
Save the file in vi (“:wq!
”), then run the following command:
yum install MariaDB-server MariaDB-client
After install, start the service:
sudo service mysql start
Verify it starts correctly. If it doesn’t, try to figure out why before proceeding. Then change the root password to something more secure (especially if this is going to be a production machine). Use the following command, where newpassword is what you want to change the new password to:
sudo mysqladmin -u root password newpassword
Install Composer
Composer is a dependency management software for PHP, and is needed for Symfony and many other PHP frameworks. Run the following commands:
cd ~
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') ===
'92102166af5abdb03f49ce52a40591073a7b859a86e8ff13338cf7db58a19f7844fbc0bb79b2773bf30791e935dbd938')
{ echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); }
echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"composer
This creates a “composer.phar” in your home directory. You need to copy it to the “/usr/local/bin” folder to make it globally available:
sudo mv composer.phar /usr/local/bin/composer
Run the command “composer
” to verify it works.
Install Symfony Binary
Now install the latest Symfony binary. Don’t use the Symfony available with yum, since that is typically really old. Change to your home directory and run the following:
cd ~
sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony
sudo chmod a+x /usr/local/bin/symfony
Now, change to your Apache root web folder:
cd /var/www/html
Then, let’s create a new Symfony project. This is a sample project that you can try out, and get to know how Symfony works:
symfony new testproject
Note: If for some reason “symfony” doesn’t run, you may need to run it from the absolute path or run with “sudo
” or even using both, i.e., “sudo /usr/local/bin/symfony new testproject”.
The above creates the folder “testproject” under “/var/www/html”. Normally, you run the above commands as a system user not as the “apache” user, so you need to change the user:group of the folder and files. Do this recursively:
sudo chown -R apache:apache testproject
Also, set some special permission on the var folder:
sudo setfacl -R -m u:"apache":rwX -m u:apache:rwX var
sudo setfacl -dR -m u:"apache":rwX -m u:apache:rwX var
Let’s go back to update the Apache config.
Apache Config
We need to update the DocumentRoot
and Directory
directives to the Symfony web folder we created above. The web folder will be under testproject, i.e., “testproject/web”. So make the following changes to the Apache config:
sudo vi /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html/testproject/web"
...
<Directory "/var/www/html/testproject/web">
...
Options Indexes FollowSymLinks MultiViews
...
AllowOverride All
...
</Directory>
The above changes are needed also for mod_rewrite
. Start the Apache server:
sudo service httpd start
Make sure it starts with “[OK]
” normally, if not, check the logs in “/var/log/httpd/”.
Verify Symfony Requirements
There were a large number of configuration items just performed, so it’s probably a good idea to check the Symfony requirements to verify everything you’ve installed is correct and no further changes are needed. There is a “symfony_requirements
” script in the bin folder to achieve this specific purpose. From the “/var/www/html/testproject” folder, run:
php bin/symfony_requirements
You should get a green [OK] if everything is fine, otherwise it prints out anything that you need to address.
RHEL SELINUX & IPTABLES
Most likely, if you installed Apache fresh, then SELINX won’t be configured for the web folders, and quite possibly iptables are configured. Run the command “sudo iptables -S
” to check the iptables configuration. If there is anything other than ACCEPT
, and nothing specific to port 80, then most likely this will block your web port. Run “sudo iptables -F
” to flush the tables.
The easiest way to quickly disable SELINUX is using “setenforce permissive
”.
I’m not giving guidelines here on how to setup iptables or SELINUX, as for a production environment, a lot of thought should be put into correct configuration, and I only intend to show how to use Symfony here.
Checking Everything
Presuming your Apache server is running (run a “sudo service restart
” if it is not), you should be able to use wget
to check if everything is working “locally”:
cd ~
wget 192.168.0.10
This should copy an “index.html” to your home folder. Use “vi index.html
” to check the contents. If you get errors, you need to investigate the problems.
After checking locally, use another machine and enter the hostname or IP address in the URL field of a browser. You should get a Symfony Welcome! message.