PHP 7.0 trong nhiều trường hợp nhanh gấp đôi PHP 5.x
Cài đặt các thư viện phụ thuộc khá đơn giản, chỉ cần thay đổi tiền tố php5- thành php7.0-
Thí dụ:
apt-get install -y nginx php5-common php5-cli php5-fpm php5-curl
thay đổi thành
apt-get install -y nginx php7.0-common php7.0-cli php7.0-fpm php7.0-curl
Script sau đây giúp cài đặt PHP 7.0, mysql 5.6 và nginx 1.10, ngay cả trong trường hợp đã có webserver với phiên bản cũ hơn.
Trong khi cài đặt sẽ xuất hiện một vài thông báo lỗi do chưa nâng cấp perl.
Copy script vào một file trong RPi, cấp quyền thực thi cho file và chạy nó
#!/bin/bash
if [ "$(whoami)" != "root" ]; then
echo "Script này chạy với quyền root (sudo)"
exit
fi
function runbar() {
[ $# -lt 2 ] && { echo "usage: $(basename $0) commandline message"; exit; }
start=$(date +%s); st="$2"; mlen=10
$1 &>/dev/null &
pid="$!"
setterm -cursor off
cnt=0; line=1; clear_eol=$(tput el); printf "\r${clear_eol}#${line} $st "
while [ -d "/proc/$pid" ] ; do
if [ $cnt -lt $mlen ]; then
printf '.'; sleep 1s; (( cnt = cnt + 1 ))
else
(( line = line + 1 )); cnt=0; printf "\r${clear_eol}#${line} $st "
fi
done
printf "\r${clear_eol}"
setterm -cursor on
return 0
}
echo "deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi" > /etc/apt/sources.list.d/stretch.list
cat > /etc/apt/preferences << EOF
Package: *
Pin: release n=jessie
Pin-Priority: 600
EOF
echo "APT::Default-Release \"jessie\";" > /etc/apt/apt.conf.d/99-default-release
echo
echo "1. Cập nhật OS và ứng dụng..."
echo
apt-get update -y
apt-get upgrade -y
apt-get dist-upgrade -y
apt-get install -y rpi-update
echo
echo "2. Cài đặt PHP 7..."
echo
apt-get install -t stretch -y php7.0 php7.0-fpm php7.0-cli php7.0-opcache php7.0-mbstring php7.0-curl php7.0-mysql php7.0-json php7.0-xml php7.0-gd
echo
echo "3. Cài đặt nginx..."
echo
apt-get install -t stretch -y nginx
update-rc.d nginx defaults
update-rc.d php7.0-fpm defaults
sed -i 's/^;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php/7.0/fpm/php.ini
sed -i 's/# server_names_hash_bucket_size/server_names_hash_bucket_size/' /etc/nginx/nginx.conf
echo
read -n 1 -s -p '4. Cài đặt ssl cho nginx [Y/n]?' answer
echo
if [ -z $answer ] || [ "${answer,}" = 'y' ]; then
read -p 'Cấu hình nginx: Nhập domain name của webserver (Enter nếu không có): ' domain
[ -z $domain ] && domain='_'
mkdir /etc/nginx/ssl &> /dev/null
openssl req -newkey rsa:2048 -sha256 -nodes -keyout /etc/nginx/ssl/nginx.key -x509 -days 365 -out /etc/nginx/ssl/nginx.crt -subj "/C=VN/ST=HCM/L=HCM City/O=LNT Company/CN=$domain"
SSL=$(cat <<EOF
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
EOF
)
else
SSL=''
fi
echo
read -p "Cấu hình nginx: Nhập thư mục gốc của web server (Enter nếu không biết): " www
echo
[ -z $www ] && www='/var/www/default/public'
cat > /etc/nginx/sites-enabled/default << EOF
# Default server
server {
listen 80 default_server;
listen [::]:80 default_server;
$SSL
server_name $domain;
root $www;
index index.php index.html index.htm default.html;
location / {
try_files $uri $uri/ =404;
}
# pass the PHP scripts to FastCGI server
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
# optimize static file serving
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
access_log off;
log_not_found off;
expires 30d;
}
# deny access to .htaccess files, should an Apache document root conflict with nginx
location ~ /\.ht {
deny all;
}
}
EOF
mkdir -p $www &> /dev/null
rm -rf /var/www/html &> /dev/null
usermod -a -G www-data pi
chown -R pi:www-data $www
chgrp -R www-data $www
chmod -R g+rw $www
echo "Xóa file không dùng..."
runbar "apt-get -y autoremove" "Vui lòng chờ"
echo
echo "Khởi động lại web server..."
service nginx restart
service php7.0-fpm restart
# MySQL
echo
echo "5. Cài đặt mysql..."
echo
apt-get -y install mysql-server
read -s -p "Gõ lại mật khẩu MySQL: " mysqlPass
mysql --user="root" --password="$mysqlPass" --database="mysql" --execute="GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '$mysqlPass'; FLUSH PRIVILEGES;"
sed -i 's/^bind-address/#bind-address/' /etc/mysql/mysql.conf.d/mysqld.cnf
sed -i 's/^skip-networking/#skip-networking/' /etc/mysql/mysql.conf.d/mysqld.cnf
service mysql restart
echo
echo "Xóa file không dùng..."
runbar "apt-get -y autoremove" "Vui lòng chờ"
# PhpMyAdmin
echo
read -p "7. Cài đặt PhpMyAdmin? <Y/n> " answer
echo
if [ -z $answer ] || [ "${answer,}" = 'y' ]; then
apt-get install -t stretch -y phpmyadmin
echo
rmdir -rf $www/phpmyadmin &> /dev/null
ln -s /usr/share/phpmyadmin $www/ &> /dev/null
ip=$(ifconfig eth0 | grep -Po '(?<=inet addr:)([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})')
echo "Gõ http://$ip/phpmyadmin để mở PhpMyAdmin"
fi
echo
echo "Cài đặt xong! Dọn dẹp lần cuối..."
runbar "apt-get -y autoremove" "Vui lòng chờ"
Chú thích
- Trình cài đặt mysql-5.6 và 5.7 cho RPi có lỗi nên chúng ta cài mysql-5.5
Dòng lệnh cài đặt không có tham số -t stretch - Phiên bản phpmyadmin 4.6.5.1deb1 có một lỗi chánh tả làm ứng dụng không chạy được.
Mở file /usr/share/phpmyadmin/libraries/vendor_config.php, tìm đến dòng
define('GETTEXT_INC', '/usr/share/php/php-php-gettext/gettext.inc');
sửa thành
define('GETTEXT_INC', '/usr/share/php/php-gettext/gettext.inc');
- Chúng ta tạo link cho /usr/share/phpmyadmin đặt ở thư mục www, khi đó không cần sửa file cấu hình của nginx.
Để link thư mục phpmyadmin có thể chia sẻ qua samba thì cần thêm vào file /etc/samba/smb.conf dòng
[global] allow insecure wide links = yes
- Raspberry Jessie November 2016 đã cài đặt sẳn apache2 nên nếu cài thêm nginx sẽ bị xung đột cổng 80. Thông báo lỗi tương tự như sau
[emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)
Khi đó có thể dùng lệnh
sudo fuser -k 80/tcp
rồi chạy lại nginx
service nginx start
Tuy nhiên sau đó vẫn phải gở bỏ apache2
apt-get purge apache2