Cài đặt PHP 7.0, mysql 5.5 và nginx 1.10 (update 23-12-2016)

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

Leave a Comment

Filed under Software

Leave a Reply