Build a real website from scratch Part 1: Setup Dev Environment

Recently I started to learn PHP, and one of the best ways to learn is to practice. So I planned to build a real website using PHP, and write down the steps.

First we need setup the development environment.

CentOS 7:

Download the ISO image and copy it to USB stick.

$ wget http://mirror.vcu.edu/pub/gnu_linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
$ diskutil list
$ diskutil unmountDisk /dev/disk<#id>
$ dd if=CentOS-7-x86_64-Minimal-1511.iso of=/dev/rdisk<#id> bs=1m

After installation, let’s make sure the time is correctly set, otherwise we may see strange issues later.

# sudo yum install -y ntp
# sudo systemctl enable ntpd
# sudo systemctl start ntpd
# date

LAMP

Next we need to setup the Apache web server,  MySQL database and PHP module. There are lots of good tutorials on this topic, for example howtoforge. Bascially we need following steps to install Apache web server.

# sudo yum install httpd
# sudo systemctl start httpd.service
# sudo systemctl enable httpd.service

// if you have firewall setup.
# sudo firewall-cmd --zone=public --add-service=http
# sudo firewall-cmd --zone=public --list-services

Followed by MySQL server and PHP module.

# sudo yum -y install mariadb-server mariadb
# sudo systemctl start mariadb.service
# sudo systemctl enable mariadb.service
# sudo mysql_secure_installation
# sudo yum -y install php
# sudo systemctl restart httpd.service

Add php file and visit it from http://<ip>/info.php to verify installation succeeded.

# sudo echo -e "<?php\n phpinfo(); \n?>" > /var/www/html/info.php

Git

Now let’s install the version control tool git.

# sudo yum -y install git
# git config --global user.name "You Name"
# git config --global core.editor "emacs"

There are different choices for where to host the repository, for example Github or Visual Studio Online,  are both free if you only have one or two repository. For Visual Studio Online, sign in using your Microsoft ID, create your project, get the repository URL. Let’s clone that project to existing folder /var/www.

# sudo chmod -R 777 /var/www
# ln -s /var/www ~/www
# git clone https://{name}.visualstudio.com/_git/idphotoweb temp
# mv temp/.git ~/www/.git
# rm -rf temp

Now let’s check in the info.php file.

# cd ~/www
# git add html/info.php
# git commit -m "first checkin"
# git push origin master

Go back to visual studio online and verify info.php is there, and now we finish the basic development environment setup.

Install and configure CentOS 7 on a Raspberry Pi 3

I just bought the Raspberry Pi 3 from Amazon.com CanaKit Raspberry Pi 3 Complete Starter Kit – 32 GB Edition. It seems the Amazon One Day delivery never worked for me, last time my order with one day delivery got cancelled, and this time better it took two days :).

I don’t want to use the default Raspbian OS and instead CentOS 7 is preferred, which is the version I’m using for daily work. The installation is pretty straight forward with help from Google. Basically you need find the correct disk id, download the image, unzip it and copy it the USB MicroSD with your Mac. There is one MicroSD reader included in above Kit.

$ diskutil list
/dev/disk0 (internal, physical):
   ....
/dev/disk1 (internal, virtual):
   ....

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *31.4 GB    disk2
   1:             Windows_FAT_16 RECOVERY                1.2 GB     disk2s1
   2:                      Linux                         33.6 MB    disk2s5
$ wget http://buildlogs.centos.org/centos/7/isos/armhfp/CentOS-Userland-7-armv7hl-Minimal-1602-RaspberryPi3.img.xz
$ unxz CentOS-Userland-7-armv7hl-Minimal-1602-RaspberryPi3.img.xz
$ diskutil unmountDisk /dev/disk<#diskid>
$ sudo dd bs=1m if=CentOS-Userland-7-armv7hl-Minimal-1602-RaspberryPi3.img of=/dev/disk<#diskid>

The copy of dd will take a few minutes.

Now insert the SD card to the RespberryPi 3 and boot, then use root/centos to login.

After login we will immediately find that wireless doesn’t work, actually wlan0 device is not recognized by OS.

[root@centos-rpi3 ~]# nmcli d
DEVICE  TYPE      STATE         CONNECTION
eth0    ethernet  connected     eth0
lo      loopback  unmanaged     --

In order to setup the wireless connection, we have to connect to wire connection first and make sure we have internet access. If you want, you can ssh root@<ip> to the Raspberry Pi from you Mac, with the ip address by run ifconfig from the Raspberry Pi.

Now we need first make sure the time is correct by setting up the ntp service, otherwise download later will fail with error complaining certificate error.

# yum install -y ntp
# systemctl enable ntpd
# systemctl start ntpd

Verify the date is correct now:

[root@centos-rpi3 ~]# date
Fri Jun 17 04:20:43 UTC 2016

Then we need download updated firmware from github, update it, then reboot.

# yum -y install git
# git clone https://github.com/RPi-Distro/firmware-nonfree.git
# mv /lib/firmware/brcm{,.org}
# cp -R firmware-nonfree/brcm80211/brcm /lib/firmware/brcm
# curl -L --output /usr/bin/rpi-update https://raw.githubusercontent.com/Hexxeh/rpi-update/master/rpi-update
# chmod +x /usr/bin/rpi-update
# rpi-update
# reboot

After reboot finished, the wlan0 interface will be available.

[root@centos-rpi3 ~]# nmcli d
DEVICE  TYPE      STATE         CONNECTION
eth0    ethernet  connected     eth0
wlan0   wifi      disconnected  --
lo      loopback  unmanaged     --

Now find the SSID of your wifi connection point, and connect to it.

[root@centos-rpi3 ~]# nmcli d wifi
*  SSID               MODE   CHAN  RATE       SIGNAL  BARS  SECURITY
   kobuk              Infra  5     54 Mbit/s  60      ▂▄▆_  WPA2
   --                 Infra  1     54 Mbit/s  20      ▂___  WPA1 WPA2
   .....

[root@centos-rpi3 ~]# nmcli d wifi connect <your_uuid> password <your_pwd>
[root@centos-rpi3 ~]# nmcli d
DEVICE  TYPE      STATE      CONNECTION 
eth0    ethernet  connected  eth0       
wlan0   wifi      connected  <your_uuid>    
lo      loopback  unmanaged  --

Now confirm the wifi connection state and with the ip address we can remove the wire network connection.

root@centos-rpi3 ~]# nmcli d show wlan0
GENERAL.DEVICE:                         wlan0
GENERAL.TYPE:                           wifi
GENERAL.HWADDR:                         B8:27:EB:6F:DF:97
GENERAL.MTU:                            0
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     ....
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/2
IP4.ADDRESS[1]:                         192.168.1.56/24
IP4.GATEWAY:                            192.168.1.1
IP4.DNS[1]:                             192.168.1.1
IP4.DOMAIN[1]:                          hsd1.wa.comcast.net
IP6.ADDRESS[1]:                         ....
IP6.GATEWAY: