1. 程式人生 > >斐訊k3搭建nginx+php+MariaDB(mysql )的教程

斐訊k3搭建nginx+php+MariaDB(mysql )的教程

安裝nginx+php+MariaDB

以前用k3安裝了onmp,中間踩了不少坑。以前發到貼吧的,現在發過來記錄一下,順便給大家參考一下。

斐訊k3效能比較強,拿來建小型網站還是可以的。但是內建儲存太小,需要額外的u盤或是行動硬碟來掛載。我是官改1.6,但是理論上官root也行的。

先說說流程和所遇到的坑吧:

把行動硬碟或是u盤用diskgenius格式化一個ext4的分割槽(也可以格式化一個ext4分割槽一個ntfs分割槽只掛載ext4的分割槽)。我是把h1硬碟格式化了100g的ext4掛載到/opt下面,一個800g的ext4作為smb和路由器共享盤以及迅雷遠端下載,Syncthing同步軟體同步資料夾。一個30+g的ntfs分割槽作為windows下臨時拷貝需要的分割槽。掛載命令:mount -t ext4 /dev/sda1 /opt & sda1換成你需要掛載的分割槽,使用df命令可以檢視掛載分割槽情況。

掛載之後路由器/opt目錄就為掛載盤下面的內容了,但是軟體中心的檔案就沒了,需要重新安裝。這裡有個深淵巨坑。軟體中心安裝會重新清除/opt下面的所有檔案!也就是你掛載的盤檔案會被RM -f ,第一次我的資料盤裡檔案就被清了…

現在開始安裝onmp了,但是網上找了許多版本,包括官網版本。都不能順利安裝!倒騰了無數遍後,發現opkg裡的mariadb-client-extra已經被刪除了,onmp安裝命令裡有他就會報錯。實際不安裝他也能順利使用mariadb的。所以刪除這個包。我會把修改好的onmp安裝檔案放在最後,安裝方法用ssh(shell)到檔案目錄下 ./onmp.sh 開始安裝。你也可以把它複製出來貼上的shell裡敲回車執行~

輸入 1 回車就可以開始安裝環境了:安裝介面借用triton的帖子裡的圖片:
在這裡插入圖片描述

安裝完畢後的介面:可能第一次php和msql資料庫啟動不了…

接下來就是配置PHP了,新建一個www使用者的命令: adduser www ,修改/opt/etc/php7-fpm.d/http://www.conf配置檔案
把 /opt/etc/php7-fpm.d/http://www.conf 大約在第22行,user = nobody改成user = www,現在執行命令onmp start的話應該php可以啟動了。

最麻煩的是資料庫,mariadb(mysql)的配置及其**,我搞了好多天都沒搞定。開始是安裝不成功,後來安裝成功了啟動不了,最後是啟動了但是沒有遠端訪問的使用者和許可權… 總之步步是坑…

mariadb(mysql)的配置檔案在etc/mysql/my.cnf中,現在我是ubuntu系統,打不開它。容我儲存一下部落格切換到win10開啟它之後在繼續說說my.cnf的配置。

如圖:
my.cnf檔案

執行msql -r root -p 輸入密碼後看報什麼錯,sock命令或是pid命令就去相應路徑下建。

有一步不太安全但是能夠解決部分問題的方法:吧/opt目錄下許可權全設為777。命令是到其目錄下輸入 chmod -R 777 *

onmp restart 反覆執行2次,都能成功啟動就說明都安裝好了。

試試進入資料庫 mysql -r root -p ,初始應該沒密碼按回車就進去了。

現在要建一個遠端登入的賬戶了,因為便於管理。如果只是建網站那現在就不用向下看了…

命令:GRANT ALL PRIVILEGES ON . TO ‘an’@’%'IDENTIFIED BY ‘654321’ WITH GRANT OPTION

這命令意思是建一個使用者叫 an 密碼為 654321 可以任意位置訪問%的賬戶

然後pc端可以用工具軟體連線資料庫了,我用的navicat,連線如下:
navicat軟體介面,也可以用其他資料庫管理軟體

好了,剩下的就是拷貝php專案到wwwroot下面。使用瀏覽器安裝或是瀏覽了。

#!/bin/sh
# @Author: xzhih
# @Date:   2017-07-29 06:10:54
# @Last Modified by:   xzhih
# @Last Modified time: 2018-06-07 08:33:18

# 軟體包列表
pkglist="wget unzip grep sed tar ca-certificates coreutils-whoami php7 php7-cgi php7-cli php7-fastcgi php7-fpm php7-mod-mysqli php7-mod-pdo php7-mod-pdo-mysql nginx-extras mariadb-server mariadb-client mariadb-client-extra"

phpmod="php7-mod-calendar php7-mod-ctype php7-mod-curl php7-mod-dom php7-mod-exif php7-mod-fileinfo php7-mod-ftp php7-mod-gd php7-mod-gettext php7-mod-gmp php7-mod-hash php7-mod-iconv php7-mod-intl php7-mod-json php7-mod-ldap php7-mod-session php7-mod-mbstring php7-mod-mcrypt php7-mod-opcache php7-mod-openssl php7-mod-pcntl php7-mod-phar php7-mod-session php7-mod-shmop php7-mod-simplexml php7-mod-snmp php7-mod-soap php7-mod-sockets php7-mod-sqlite3 php7-mod-sysvmsg php7-mod-sysvsem php7-mod-sysvshm php7-mod-tokenizer php7-mod-xml php7-mod-xmlreader php7-mod-xmlwriter php7-mod-zip php7-pecl-dio php7-pecl-http php7-pecl-libevent php7-pecl-propro php7-pecl-raphf snmpd snmp-mibs snmp-utils zoneinfo-core zoneinfo-asia"

# 後續可能增加的包(缺少源支援)
# php7-mod-imagick imagemagick imagemagick-jpeg imagemagick-png imagemagick-tiff imagemagick-tools

# Web程式
# (1) phpMyAdmin(資料庫管理工具)
url_phpMyAdmin="https://files.phpmyadmin.net/phpMyAdmin/4.8.1/phpMyAdmin-4.8.1-all-languages.zip"

# (2) WordPress(使用最廣泛的CMS)
url_WordPress="https://cn.wordpress.org/wordpress-4.9.4-zh_CN.zip"

# (3) Owncloud(經典的私有云)
url_Owncloud="https://download.owncloud.org/community/owncloud-10.0.8.zip"

# (4) Nextcloud(Owncloud團隊的新作,美觀強大的個人雲盤)
url_Nextcloud="https://download.nextcloud.com/server/releases/nextcloud-13.0.2.zip"

# (5) h5ai(優秀的檔案目錄)
url_h5ai="https://release.larsjung.de/h5ai/h5ai-0.29.0.zip"

# (6) Lychee(一個很好看,易於使用的Web相簿)
url_Lychee="https://github.com/electerious/Lychee/archive/master.zip"

# (7) Kodexplorer(可道雲aka芒果雲線上文件管理器)
url_Kodexplorer="http://static.kodcloud.com/update/download/kodexplorer4.25.zip"

# (8) Typecho (流暢的輕量級開源部落格程式)
url_Typecho="http://typecho.org/downloads/1.1-17.10.30-release.tar.gz"

# (9) Z-Blog (體積小,速度快的PHP部落格程式)
url_Zblog="https://update.zblogcn.com/zip/Z-BlogPHP_1_5_2_1935_Zero.zip"

# (10) DzzOffice (開源辦公平臺)
url_DzzOffice="https://codeload.github.com/zyx0814/dzzoffice/zip/master"

# 通用環境變數獲取
get_env()
{
    # 獲取使用者名稱
    if [[ $USER ]]; then
        username=$USER
    elif [[ -n $(whoami 2>/dev/null) ]]; then
        username=$(whoami 2>/dev/null)
    else
        username=$(cat /etc/passwd | sed "s/:/ /g" | awk 'NR==1'  | awk '{printf $1}')
    fi

    # 獲取路由器IP
    localhost=$(ifconfig  | grep "inet addr" | awk '{ print $2}' | awk -F: '{print $2}' | awk 'NR==1')
    if [[ ! -n "$localhost" ]]; then
        localhost="你的路由器IP"
    fi
}

##### 軟體包狀態檢測 #####
install_check()
{
    notinstall=""
    for data in $pkglist ; do
        if [[ `opkg list-installed | grep $data | wc -l` -ne 0 ]];then
            echo "$data 已安裝"
        else
            notinstall="$notinstall $data"
            echo "$data 正在安裝..."
            opkg install $data
        fi
    done
}

# 安裝PHP mod 
install_php_mod()
{
    notinstall=""
    for data in $phpmod ; do
        if [[ `opkg list-installed | grep $data | wc -l` -ne 0 ]];then
            echo "$data 已安裝"
        else
            notinstall="$notinstall $data"
            echo "$data 正在安裝..."
            opkg install $data
        fi
    done
}

############## 安裝軟體包 #############
install_onmp_ipk()
{
    opkg update

    # 軟體包狀態檢測
    install_check

    for i in 'seq 3'; do
        if [[ ${#notinstall} -gt 0 ]]; then
            install_check
        fi
    done

    if [[ ${#notinstall} -gt 0 ]]; then
        echo "可能會因為某些問題某些核心軟體包無法安裝,請保持/opt/目錄足夠乾淨,如果是網路問題,請掛全域性VPN再次執行命令"
    else
        echo "----------------------------------------"
        echo "|********** ONMP軟體包已完整安裝 *********|"
        echo "----------------------------------------"
        echo "是否安裝自動PHP的模組,你也可以手動安裝"
#
read -p "輸入你的選擇[y/n]: " input
case $input in
    y) install_php_mod;;
n) echo "如果程式提示需要安裝外掛,你可以自行使用opkg命令安裝";;
*) echo "你輸入的不是 y/n"
exit;;
esac 
        echo "現在開始初始化ONMP"
        init_onmp
        echo ""
    fi
}

################ 初始化onmp ###############
init_onmp()
{
    # 初始化網站目錄
    rm -rf /opt/wwwroot
    mkdir -p /opt/wwwroot/default
    chmod -R 777 /opt/tmp

    # 初始化Nginx
    init_nginx > /dev/null 2>&1

    # 初始化資料庫
    init_sql > /dev/null 2>&1

    # 初始化PHP
    init_php > /dev/null 2>&1

    # 新增探針
    cp /opt/onmp/tz.php /opt/wwwroot/default -R
    add_vhost 81 default
    sed -e "s/.*\#php-fpm.*/    include     \/opt\/etc\/nginx\/conf\/php-fpm.conf\;/g" -i /opt/etc/nginx/vhost/default.conf

    # 生成ONMP命令
    set_onmp_sh
    onmp start
}

############### 初始化Nginx ###############
init_nginx()
{
    get_env
    /opt/etc/init.d/S80nginx stop > /dev/null 2>&1
    rm -rf /opt/etc/nginx/vhost 
    rm -rf /opt/etc/nginx/conf
    mkdir -p /opt/etc/nginx/vhost
    mkdir -p /opt/etc/nginx/conf

# 初始化nginx配置檔案
cat > "/opt/etc/nginx/nginx.conf" <<-\EOF
user theOne root;
pid /opt/var/run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 65535;
events {
    use epoll;
    multi_accept on;
    worker_connections 51200;
}
http {
    sendfile                        on;
    tcp_nopush                      on;
    tcp_nodelay                     on;
    default_type                    application/octet-stream;
    server_tokens                   off;
    keepalive_timeout               60;
    client_max_body_size            2000m;
    client_body_temp_path           /opt/tmp/;
    client_header_buffer_size       8k;
    large_client_header_buffers     4 32k;
    server_names_hash_bucket_size   128;
    gzip                            on;
    gzip_vary                       on;
    gzip_proxied                    expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types                      application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    gzip_disable                    "MSIE [1-6]\.";
    gzip_buffers                    4 16k;
    gzip_comp_level                 4;
    gzip_min_length                 1k;
    gzip_http_version               1.1;
    fastcgi_buffers                 4 64k;
    fastcgi_buffer_size             64k;
    fastcgi_send_timeout            300;
    fastcgi_read_timeout            300;
    fastcgi_connect_timeout         300;
    fastcgi_busy_buffers_size       128k;
    fastcgi_temp_file_write_size    256k;
    include                         mime.types;
    include                         /opt/etc/nginx/vhost/*.conf;
}
EOF

sed -e "s/theOne/$username/g" -i /opt/etc/nginx/nginx.conf

# 特定程式的nginx配置
nginx_special_conf

}

##### 特定程式的nginx配置 #####
nginx_special_conf()
{
# php-fpm
cat > "/opt/etc/nginx/conf/php-fpm.conf" <<-\OOO
location ~ \.php(?:$|/) {
    fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    fastcgi_pass                    unix:/opt/var/run/php7-fpm.sock;
    fastcgi_index                   index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include                         fastcgi_params;
}
OOO

# nextcloud
cat > "/opt/etc/nginx/conf/nextcloud.conf" <<-\OOO
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}
location = /.well-known/carddav {
  return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
  return 301 $scheme://$host/remote.php/dav;
}
location / {
    rewrite ^ /index.php$uri;
}
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
    deny all;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
    deny all;
}
location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_pass unix:/opt/var/run/php7-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param modHeadersAvailable true;
    fastcgi_param front_controller_active true;
    fastcgi_intercept_errors on;
    fastcgi_request_buffering off;
}
location ~ ^/(?:updater|ocs-provider)(?:$|/) {
    try_files $uri/ =404;
    index index.php;
}
location ~ \.(?:css|js|woff|svg|gif)$ {
    try_files $uri /index.php$uri$is_args$args;
    add_header Cache-Control "public, max-age=15778463";
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    access_log off;
}
location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
    try_files $uri /index.php$uri$is_args$args;
    access_log off;
}
OOO

# owncloud
cat > "/opt/etc/nginx/conf/owncloud.conf" <<-\OOO
gzip off;
index index.php;
error_page 403 /core/templates/403.php;
error_page 404 /core/templates/404.php;
rewrite ^/.well-known/carddav /remote.php/carddav/ permanent;
rewrite ^/.well-known/caldav /remote.php/caldav/ permanent;
location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}
location ~ ^/(build|tests|config|lib|3rdparty|templates|data)/ {
    deny all;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
    deny all;
}
location / {
    rewrite ^/remote/(.*) /remote.php last;
    rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
    try_files $uri $uri/ =404;
}
location ~* \.(?:css|js)$ {
    add_header Cache-Control "public, max-age=7200";
    access_log off;
}
location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)$ {
    access_log off;
}
OOO

# wordpress
cat > "/opt/etc/nginx/conf/wordpress.conf" <<-\OOO
location / {
    try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
OOO

# typecho
cat > "/opt/etc/nginx/conf/typecho.conf" <<-\OOO
if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php$1 last;
    }
OOO

}

############## 重置、初始化MySQL #############
init_sql()
{
    get_env
    /opt/etc/init.d/S70mysqld stop > /dev/null 2>&1
    sleep 10
    rm -rf /opt/mysql
    rm -rf /opt/var/mysql
    mkdir -p /opt/etc/mysql/

# MySQL設定
cat > "/opt/etc/mysql/my.cnf" <<-\MMM
[client-server]
port               = 3306
socket             = /opt/var/run/mysqld.sock

[mysqld]
user               = theOne
socket             = /opt/var/run/mysqld.sock
pid-file           = /opt/var/run/mysqld.pid
basedir            = /opt
lc_messages_dir    = /opt/share/mysql
lc_messages        = en_US
datadir            = /opt/var/mysql/
tmpdir             = /opt/tmp/

skip-external-locking

bind-address       = 127.0.0.0

key_buffer_size    = 24M
max_allowed_packet = 24M
thread_stack       = 192K
thread_cache_size  = 8

[mysqldump]
quick
quote-names
max_allowed_packet = 24M

[mysql]
#no-auto-rehash

[isamchk]
key_buffer_size    = 24M

[mysqlhotcopy]
interactive-timeout
MMM

sed -e "s/theOne/$username/g" -i /opt/etc/mysql/my.cnf

chmod 644 /opt/etc/mysql/my.cnf

mkdir -p /opt/var/mysql

# 資料庫安裝
/opt/bin/mysql_install_db --user=$username --basedir=/opt --datadir=/opt/var/mysql/
echo -e "\n正在初始化資料庫,請稍等1分鐘"
sleep 20

# 初次啟動MySQL
/opt/etc/init.d/S70mysqld start
sleep 60

# 設定資料庫密碼
mysqladmin -u root password 123456
echo -e "\033[41;37m 資料庫使用者:root, 初始密碼:123456 \033[0m"
onmp restart
}

############## PHP初始化 #############
init_php()
{
# PHP7設定 
/opt/etc/init.d/S79php7-fpm stop > /dev/null 2>&1

mkdir -p /opt/usr/php/tmp/
chmod -R 777 /opt/usr/php/tmp/

sed -e "/^doc_root/d" -i /opt/etc/php.ini
sed -e "s/.*memory_limit = .*/memory_limit = 128M/g" -i /opt/etc/php.ini
sed -e "s/.*output_buffering = .*/output_buffering = 4096/g" -i /opt/etc/php.ini
sed -e "s/.*post_max_size = .*/post_max_size = 8000M/g" -i /opt/etc/php.ini
sed -e "s/.*max_execution_time = .*/max_execution_time = 2000 /g" -i /opt/etc/php.ini
sed -e "s/.*upload_max_filesize.*/upload_max_filesize = 8000M/g" -i /opt/etc/php.ini
sed -e "s/.*listen.mode.*/listen.mode = 0666/g" -i /opt/etc/php7-fpm.d/www.conf

# PHP配置檔案
cat >> "/opt/etc/php.ini" <<-\PHPINI
session.save_path = "/opt/usr/php/tmp/"
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=60
opcache.fast_shutdown=1
PHPINI

cat >> "/opt/etc/php7-fpm.d/www.conf" <<-\PHPFPM
env[HOSTNAME] = $HOSTNAME
env[PATH] = /opt/bin:/usr/local/bin:/usr/bin:/bin
env[TMP] = /opt/tmp
env[TMPDIR] = /opt/tmp
env[TEMP] = /opt/tmp
PHPFPM
}

############# 使用者設定資料庫密碼 ############
set_passwd()
{
    /opt/etc/init.d/S70mysqld start
    sleep 3
    echo -e "\033[41;37m 初始密碼:123456 \033[0m"
    mysqladmin -u root -p password
    onmp restart
}

################ 解除安裝onmp ###############
remove_onmp()
{
    /opt/etc/init.d/S70mysqld stop > /dev/null 2>&1
    /opt/etc/init.d/S79php7-fpm stop > /dev/null 2>&1
    /opt/etc/init.d/S80nginx stop > /dev/null 2>&1
    killall -9 nginx mysqld php-fpm > /dev/null 2>&1
    for pkg in $pkglist; do
        opkg remove $pkg --force-depends
    done
    for mod in $phpmod; do
        opkg remove $mod --force-depends
    done
    rm -rf /opt/wwwroot
    rm -rf /opt/etc/nginx/vhost
    rm -rf /opt/bin/onmp
    rm -rf /opt/mysql
    rm -rf /opt/var/mysql
    rm -rf /opt/etc/nginx/
    rm -rf /opt/etc/php*
    rm -rf /opt/etc/mysql
}

################ 生成ONMP命令 ###############
set_onmp_sh()
{
# 刪除
rm -rf /opt/bin/onmp

# 寫入檔案
cat > "/opt/bin/onmp" <<-\EOF
#!/bin/sh

# 獲取路由器IP
localhost=$(ifconfig | grep "inet addr" | awk '{ print $2}' | awk -F: '{print $2}' | awk 'NR==1')
if [[ ! -n "$localhost" ]]; then
    localhost="你的路由器IP"
fi

vhost_list()
{
    echo "網站列表:"
    logger -t "【ONMP】" "網站列表:"
    for conf in /opt/etc/nginx/vhost/*;
    do
        path=$(cat $conf | awk 'NR==4' | awk '{print $2}' | sed 's/;//')
        port=$(cat $conf | awk 'NR==2' | awk '{print $2}' | sed 's/;//')
        echo "$path        $localhost:$port"
        logger -t "【ONMP】" "$path     $localhost:$port"
    done
    echo "瀏覽器位址列輸入:$localhost:81 檢視php探針"
}

onmp_restart()
{
    /opt/etc/init.d/S70mysqld stop > /dev/null 2>&1
    /opt/etc/init.d/S79php7-fpm stop > /dev/null 2>&1
    /opt/etc/init.d/S80nginx stop > /dev/null 2>&1
    killall -9 nginx mysqld php-fpm > /dev/null 2>&1
    sleep 3
    /opt/etc/init.d/S70mysqld start > /dev/null 2>&1
    /opt/etc/init.d/S79php7-fpm start > /dev/null 2>&1
    /opt/etc/init.d/S80nginx start > /dev/null 2>&1
    sleep 3
    num=0
    for PROC in 'nginx' 'php-fpm' 'mysqld'; do 
        if [ -n "`pidof $PROC`" ]; then
            echo $PROC "啟動成功";
        else
            echo $PROC "啟動失敗";
            num=`expr $num + 1`
        fi 
    done

    if [[ $num -gt 0 ]]; then
        echo "onmp啟動失敗"
        logger -t "【ONMP】" "啟動失敗"
    else
        echo "onmp已啟動"
        logger -t "【ONMP】" "已啟動"
        vhost_list
    fi
}

case $1 in
    open ) 
    /opt/onmp/onmp.sh
    ;;

    start )
    echo "onmp正在啟動"
    logger -t "【ONMP】" "正在啟動"
    onmp_restart
    ;;

    stop )
    echo "onmp正在停止"
    logger -t "【ONMP】" "正在停止"
    /opt/etc/init.d/S70mysqld stop > /dev/null 2>&1
    /opt/etc/init.d/S79php7-fpm stop > /dev/null 2>&1
    /opt/etc/init.d/S80nginx stop > /dev/null 2>&1
    echo "onmp已停止"
    logger -t "【ONMP】" "已停止"
    ;;

    restart )
    echo "onmp正在重啟"
    logger -t "【ONMP】" "正在重啟"
    onmp_restart
    ;;

    list )
    vhost_list
    ;;
    * )
    echo "----------------------------------------"
    echo "|*************  onmp 命令  *************|"
    echo "|**********  管理 onmp open  **********|"
    echo "|*********  啟動 停止 重啟ONMP  *********|"
    echo "|*****  onmp start|stop|restart   *****|"
    echo "|*******  檢視網站列表 onmp list  *******|"
    echo "----------------------------------------"
    ;;
esac
EOF

chmod +x /opt/bin/onmp
echo "----------------------------------------"
echo "|**********  onmp命令已經生成  **********|"
echo "|**********  管理 onmp open  **********|"
echo "|*********  啟動 停止 重啟ONMP  *********|"
echo "|*****  onmp start|stop|restart   *****|"
echo "|*******  檢視網站列表 onmp list  *******|"
echo "----------------------------------------"
}

############### 網站程式安裝 ##############
install_website()
{
    # 通用環境變數獲取
    get_env
    clear
    chmod -R 777 /opt/tmp
# 選擇程式
cat << AAA
----------------------------------------
|************* 選擇WEB程式 *************|
----------------------------------------
(1) phpMyAdmin(資料庫管理工具)
(2) WordPress(使用最廣泛的CMS)
(3) Owncloud(經典的私有云)
(4) Nextcloud(Owncloud團隊的新作,美觀強大的個人雲盤)
(5) h5ai(優秀的檔案目錄)
(6) Lychee(一個很好看,易於使用的Web相簿)
(7) Kodexplorer(可道雲aka芒果雲線上文件管理器)
(8) Typecho (流暢的輕量級開源部落格程式)
(9) Z-Blog (體積小,速度快的PHP部落格程式)
(10) DzzOffice (開源辦公平臺)
(0) 退出
AAA
read -p "輸入你的選擇[0-11]: " input
case $input in
    1) install_phpmyadmin;;
2) install_wordpress;;
3) install_owncloud;;
4) install_nextcloud;;
5) install_h5ai;;
6) install_lychee;;
7) install_kodexplorer;;
8) install_typecho;;
9) install_zblog;;
10) install_dzzoffice;;
0) exit;;
*) echo "你輸入的不是 0 ~ 10 之間的!"
break;;
esac
}

############### WEB程式安裝器 ##############
web_installer()
{
    clear
    echo "----------------------------------------"
    echo "|***********  WEB程式安裝器  ***********|"
    echo "----------------------------------------"
    echo "安裝 $name:"

    # 獲取使用者自定義設定
    read -p "輸入服務埠(請避開已使用的埠)[留空預設$port]: " nport
    if [[ $nport ]]; then
        port=$nport
    fi
    read -p "輸入目錄名(留空預設:$name): " webdir
    if [[ ! -n "$webdir" ]]; then
        webdir=$name
    fi

    # 檢查目錄是否存在
    if [[ ! -d "/opt/wwwroot/$webdir" ]] ; then
        echo "開始安裝..."
    else
        read -p "網站目錄 /opt/wwwroot/$webdir 已存在,是否刪除: [y/n(小寫)]" ans
        case $ans in
            y ) rm -rf /opt/wwwroot/$webdir; echo "已刪除";;
n ) echo "未刪除";;
* ) echo "沒有這個選項"; exit;;
esac
fi

    # 下載程式並解壓
    suffix="zip"
    if [[ -n "$istar" ]]; then
        suffix="tar"
    fi
    if [[ ! -d "/opt/wwwroot/$webdir" ]] ; then
        rm -rf /opt/etc/nginx/vhost/$webdir.conf
        if [[ ! -f /opt/wwwroot/$name.$suffix ]]; then
            rm -rf /opt/tmp/$name.$suffix
            wget --no-check-certificate -O /opt/tmp/$name.$suffix $filelink
            mv /opt/tmp/$name.* /opt/wwwroot/
        fi
        if [[ ! -f "/opt/wwwroot/$name.$suffix" ]]; then
            echo "下載未成功"
        else
            echo "正在解壓..."
            if [[ -n "$hookdir" ]]; then
                mkdir /opt/wwwroot/$hookdir
            fi

            if [[ -n "$istar" ]]; then
                tar zxf /opt/wwwroot/$name.$suffix -C /opt/wwwroot/$hookdir > /dev/null 2>&1
            else
                unzip /opt/wwwroot/$name.$suffix -d /opt/wwwroot/$hookdir > /dev/null 2>&1
            fi
            
            mv /opt/wwwroot/$dirname /opt/wwwroot/$webdir
            echo "解壓完成..."
        fi
    fi

    # 檢測是否解壓成功
    if [[ ! -d "/opt/wwwroot/$webdir" ]] ; then
        echo "安裝未成功"
        exit
    fi
}

# 安裝指令碼的基本結構
# install_webapp()
# {
#     # 預設配置
#     filelink=""         # 下載連結
#     name=""             # 程式名
#     dirname=""          # 解壓後的目錄名
#     port=               # 埠
#     hookdir=$dirname    # 某些程式解壓後不是單個目錄,用這個hook解決
#     istar=true          # 是否為tar壓縮包, 不是則刪除此行

#     # 執行安裝程式 
#     web_installer
#     echo "正在配置$name..."
#     # chmod -R 777 /opt/wwwroot/$webdir     # 目錄許可權看情況使用

#     # 新增到虛擬主機
#     add_vhost $port $webdir
#     sed -e "s/.*\#php-fpm.*/    include       \/opt\/etc\/nginx\/conf\/php-fpm.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf         # 新增php-fpm支援
#     onmp restart >/dev/null 2>&1
#     echo "$name安裝完成"
#     echo "瀏覽器位址列輸入:$localhost:$port 即可訪問"
# }

############# 安裝phpMyAdmin ############
install_phpmyadmin()
{
    # 預設配置
    filelink=$url_phpMyAdmin
    name="phpMyAdmin"
    dirname="phpMyAdmin-*-languages"
    port=82

    # 執行安裝程式
    web_installer 
    echo "正在配置$name..."
    cp /opt/wwwroot/$webdir/config.sample.inc.php /opt/wwwroot/$webdir/config.inc.php
    chmod 644 /opt/wwwroot/$webdir/config.inc.php
    sed -e "s/.*blowfish_secret.*/\$cfg['blowfish_secret'] = 'onmponmponmponmponmponmponmponmp';/g" -i /opt/wwwroot/$webdir/config.inc.php

    # 新增到虛擬主機
    add_vhost $port $webdir
    sed -e "s/.*\#php-fpm.*/    include     \/opt\/etc\/nginx\/conf\/php-fpm.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf
    onmp restart >/dev/null 2>&1
    echo "$name安裝完成"
    echo "瀏覽器位址列輸入:$localhost:$port 即可訪問"
    echo "phpMyaAdmin的使用者、密碼就是資料庫使用者、密碼"
}

############# 安裝WordPress ############
install_wordpress()
{
    # 預設配置
    filelink=$url_WordPress
    name="WordPress"
    dirname="wordpress"
    port=83

    # 執行安裝程式
    web_installer
    echo "正在配置$name..."
    chmod -R 777 /opt/wwwroot/$webdir

    # 新增到虛擬主機
    add_vhost $port $webdir
    sed -e "s/.*\#php-fpm.*/    include     \/opt\/etc\/nginx\/conf\/php-fpm.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf
    sed -e "s/.*\#otherconf.*/    include     \/opt\/etc\/nginx\/conf\/wordpress.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf
    onmp restart >/dev/null 2>&1
    echo "$name安裝完成"
    echo "瀏覽器位址列輸入:$localhost:$port 即可訪問"
    echo "可以用phpMyaAdmin建立資料庫,然後在這個站點上一步步配置網站資訊"
}

############### 安裝h5ai ##############
install_h5ai()
{
    # 預設配置
    filelink=$url_h5ai
    name="h5ai"
    dirname="_h5ai"
    port=85
    hookdir=$dirname

    # 執行安裝程式
    web_installer
    echo "正在配置$name..."
    cp /opt/wwwroot/$webdir/_h5ai/README.md /opt/wwwroot/$webdir/
    chmod -R 777 /opt/wwwroot/$webdir/

    # 新增到虛擬主機
    add_vhost $port $webdir
    sed -e "s/.*\#php-fpm.*/    include       \/opt\/etc\/nginx\/conf\/php-fpm.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf
    sed -e "s/.*\index index.html.*/    index  index.html  index.php  \/_h5ai\/public\/index.php;/g" -i /opt/etc/nginx/vhost/$webdir.conf
    onmp restart >/dev/null 2>&1
    echo "$name安裝完成"
    echo "瀏覽器位址列輸入:$localhost:$port 即可訪問"
    echo "配置檔案在/opt/wwwroot/$webdir/_h5ai/private/conf/options.json"
    echo "你可以通過修改它來獲取更多功能"
}

################ 安裝Lychee ##############
install_lychee()
{
    # 預設配置
    filelink=$url_Lychee
    name="Lychee"
    dirname="Lychee-master"
    port=86

    # 執行安裝程式
    web_installer
    echo "正在配置$name..."
    chmod -R 777 /opt/wwwroot/$webdir/uploads/ /opt/wwwroot/$webdir/data/

    # 新增到虛擬主機
    add_vhost $port $webdir
    sed -e "s/.*\#php-fpm.*/    include       \/opt\/etc\/nginx\/conf\/php-fpm.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf
    onmp restart >/dev/null 2>&1
    echo "$name安裝完成"
    echo "瀏覽器位址列輸入:$localhost:$port 即可訪問"
    echo "首次開啟會要配置資料庫資訊"
    echo "地址:127.0.0.1 使用者、密碼你自己設定的或者預設是root 123456"
    echo "下面的可以不配置,然後下一步建立個使用者就可以用了"
}

################# 安裝Owncloud ###############
install_owncloud()
{
    # 預設配置
    filelink=$url_Owncloud     
    name="Owncloud"         
    dirname="owncloud"      
    port=98

    # 執行安裝程式 
    web_installer
    echo "正在配置$name..."
    chmod -R 777 /opt/wwwroot/$webdir

    # 新增到虛擬主機
    add_vhost $port $webdir
    sed -e "s/.*\#php-fpm.*/    include       \/opt\/etc\/nginx\/conf\/php-fpm.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf
    sed -e "s/.*\#otherconf.*/        include     \/opt\/etc\/nginx\/conf\/owncloud.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf
    onmp restart >/dev/null 2>&1
    echo "$name安裝完成"
    echo "瀏覽器位址列輸入:$localhost:$port 即可訪問"
    echo "首次開啟會要配置使用者和資料庫資訊"
    echo "地址預設 localhost 使用者、密碼你自己設定的或者預設是root 123456"
    echo "安裝好之後可以點選左上角三條槓進入market安裝豐富的外掛,比如線上預覽圖片、視訊等"
}

################# 安裝Nextcloud ##############
install_nextcloud()
{
    # 預設配置
    filelink=$url_Nextcloud
    name="Nextcloud"
    dirname="nextcloud"
    port=99

    # 執行安裝程式
    web_installer   
    echo "正在配置$name..."
    chmod -R 777 /opt/wwwroot/$webdir

    # 新增到虛擬主機
    add_vhost $port $webdir
    # nextcloud的配置檔案中有php-fpm了, 不需要外部引入
    sed -e "s/.*\#otherconf.*/    include     \/opt\/etc\/nginx\/conf\/nextcloud.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf
    onmp restart >/dev/null 2>&1
    echo "$name安裝完成"
    echo "瀏覽器位址列輸入:$localhost:$port 即可訪問"
    echo "首次開啟會要配置使用者和資料庫資訊"
    echo "地址預設 localhost 使用者、密碼你自己設定的或者預設是root 123456"
}

############## 安裝kodexplorer芒果雲 ##########
install_kodexplorer()
{
    # 預設配置
    filelink=$url_Kodexplorer
    name="Kodexplorer"
    dirname="kodexplorer"
    port=88
    hookdir=$dirname

    # 執行安裝程式 
    web_installer
    echo "正在配置$name..."
    chmod -R 777 /opt/wwwroot/$webdir

    # 新增到虛擬主機
    add_vhost $port $webdir
    sed -e "s/.*\#php-fpm.*/    include       \/opt\/etc\/nginx\/conf\/php-fpm.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf
    onmp restart >/dev/null 2>&1
    echo "$name安裝完成"
    echo "瀏覽器位址列輸入:$localhost:$port 即可訪問"
}

############# 安裝Typecho ############
install_typecho()
{
    # 預設配置
    filelink=$url_Typecho
    name="Typecho"
    dirname="build"
    port=90
    istar=true

    # 執行安裝程式 
    web_installer
    echo "正在配置$name..."
    chmod -R 777 /opt/wwwroot/$webdir 

    # 新增到虛擬主機
    add_vhost $port $webdir
    sed -e "s/.*\#php-fpm.*/    include       \/opt\/etc\/nginx\/conf\/php-fpm.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf         # 新增php-fpm支援
    sed -e "s/.*\#otherconf.*/        include     \/opt\/etc\/nginx\/conf\/typecho.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf
    onmp restart >/dev/null 2>&1
    echo "$name安裝完成"
    echo "瀏覽器位址列輸入:$localhost:$port 即可訪問"
    echo "可以用phpMyaAdmin建立資料庫,然後在這個站點上一步步配置網站資訊"
}

######## 安裝Z-Blog ########
install_zblog()
{
    # 預設配置
    filelink=$url_Zblog
    name="Zblog"
    dirname="Z-BlogPHP_1_5_1_1740_Zero"
    hookdir=$dirname
    port=91

    # 執行安裝程式 
    web_installer
    echo "正在配置$name..."
    chmod -R 777 /opt/wwwroot/$webdir     # 目錄許可權看情況使用

    # 新增到虛擬主機
    add_vhost $port $webdir
    sed -e "s/.*\#php-fpm.*/    include       \/opt\/etc\/nginx\/conf\/php-fpm.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf         # 新增php-fpm支援
    onmp restart >/dev/null 2>&1
    echo "$name安裝完成"
    echo "瀏覽器位址列輸入:$localhost:$port 即可訪問"
}

######### 安裝DzzOffice #########
install_dzzoffice()
{
    # 預設配置
    filelink=$url_DzzOffice
    name="DzzOffice"
    dirname="dzzoffice-master"
    port=92

    # 執行安裝程式 
    web_installer
    echo "正在配置$name..."
    chmod -R 777 /opt/wwwroot/$webdir     # 目錄許可權看情況使用

    # 新增到虛擬主機
    add_vhost $port $webdir
    sed -e "s/.*\#php-fpm.*/    include       \/opt\/etc\/nginx\/conf\/php-fpm.conf\;/g" -i /opt/etc/nginx/vhost/$webdir.conf         # 新增php-fpm支援
    onmp restart >/dev/null 2>&1
    echo "$name安裝完成"
    echo "瀏覽器位址列輸入:$localhost:$port 即可訪問"
    echo "DzzOffice應用市場中,某些應用無法自動安裝的,請自行參看官網給的手動安裝教程"
}

############# 新增到虛擬主機 #############
add_vhost()
{
# 寫入檔案
cat > "/opt/etc/nginx/vhost/$2.conf" <<-\EOF
server {
    listen 81;
    server_name     localhost;
    root            /opt/wwwroot/www/;
    index index.html index.htm index.php tz.php;
    #php-fpm
    #otherconf
}
EOF

sed -e "s/.*listen.*/    listen $1\;/g" -i /opt/etc/nginx/vhost/$2.conf
sed -e "s/.*\/opt\/wwwroot\/www\/.*/    root  \/opt\/wwwroot\/$2\/\;/g" -i /opt/etc/nginx/vhost/$2.conf
}

############## 網站管理 ##############
web_manager()
{
    onmp stop > /dev/null 2>&1
    i=1
    for conf in /opt/etc/nginx/vhost/*;
    do
        path=$(cat $conf | awk 'NR==4' | awk '{print $2}' | sed 's/;//')
        echo "$i. $path"
        eval web_conf$i="$conf"
        eval web_file$i="$path"
        i=$((i + 1))
    done
    read -p "請選擇要刪除的網站:" webnum
    eval conf=\$web_conf"$webnum"
    eval file=\$web_file"$webnum"
    rm -rf "$conf"
    rm -rf "$file"
    onmp start > /dev/null 2>&1
    echo "網站已刪除"
}

############## Swap交換空間 ##############
set_swap()
{
    clear
# 
cat << SWAP
----------------------------------------
|**************** SWAP ****************|
----------------------------------------
(1) 開啟Swap
(2) 關閉Swap
(3) 刪除Swap檔案

SWAP

read -p "輸入你的選擇[1-3]: " input
case $input in
    1) on_swap;;
2) swapoff /opt/.swap;;
3) del_swap;;
*) echo "你輸入的不是 1 ~ 3 之間的!"
break;;
esac 
}

#### 開啟Swap ####
on_swap()
{
    status=$(cat /proc/swaps |  awk 'NR==2')
    if [[ -n "$status" ]]; then
        echo "Swap已啟用"
    else
        if [[ ! -e "/opt/.swap" ]]; then
            echo "正在生成swap檔案,請耐心等待..."
            dd if=/dev/zero of=/opt/.swap bs=1024 count=524288
            # 設定交換檔案
            mkswap /opt/.swap
            # 啟用交換分割槽
        fi
        swapon /opt/.swap
        echo "現在你可以使用free命令檢視swap是否啟用"
    fi
}

#### 刪除Swap ####
del_swap()
{
    # 棄用交換分割槽
    swapoff /opt/.swap
    rm -rf /opt/.swap
}

############## 資料庫自動備份 ##############
sql_backup()
{
# 輸出選項
cat << EOF
資料庫自動備份
(1) 開啟
(2) 關閉
(0) 退出
EOF

read -p "輸入你的選擇: " input
case $input in
    1) sql_backup_on;;
2) sql_backup_off;;
0) exit;;
*) echo "沒有這個選項!"
exit;;
esac 
}

### 資料庫自動備份開啟 ###
sql_backup_on()
{
    if [[ ! -d "/opt/backup" ]]; then
        mkdir /opt/backup
    fi
    read -p "輸入你的資料庫使用者名稱: " sqlusr
    read -p "輸入你的資料庫使用者密碼: " sqlpasswd

# 刪除
rm -rf /opt/bin/sqlbackup

# 寫入檔案
cat > "/opt/bin/sqlbackup" <<-\EOF
#!/bin/sh
/opt/bin/mysqldump -uusername -puserpasswd -A > /opt/backup/sql_backup_$(date +%Y%m%d%H).sql
EOF
    
sed -e 's/username/'"$sqlusr"'/g' -i /opt/bin/sqlbackup
sed -e 's/userpasswd/'"$sqlpasswd"'/g' -i /opt/bin/sqlbackup

chmod +x /opt/bin/sqlbackup

echo "命令建立成功,你可以直接使用sqlbackup命令直接備份,也可以在路由器管理頁新增定時任務 1 */3 * * * /opt/bin/sqlbackup,意思是每3 小時自動備份一次"

}

### 資料庫自動備份關閉 ###
sql_backup_off()
{
    rm -rf /opt/bin/sqlbackup
    echo "如果你使用了自動定時備份,請刪除配置"
}

###########################################
################# 指令碼開始 #################
###########################################
start()
{
# 輸出選項
cat << EOF
      ___           ___           ___           ___    
     /  /\         /__/\         /__/\         /  /\   
    /  /::\        \  \:\       |  |::\       /  /::\  
   /  /:/\:\        \  \:\      |  |:|:\     /  /:/\:\ 
  /  /:/  \:\   _____\__\:\   __|__|:|\:\   /  /:/~/:/ 
 /__/:/ \__\:\ /__/::::::::\ /__/::::| \:\ /__/:/ /:/  
 \  \:\ /  /:/ \  \:\~~\~~\/ \  \:\~~\__\/ \  \:\/:/   
  \  \:\  /:/   \  \:\  ~~~   \  \:\        \  \::/    
   \  \:\/:/     \  \:\        \  \:\        \  \:\    
    \  \::/       \  \:\        \  \:\        \  \:\   
     \__\/         \__\/         \__\/         \__\/   

=======================================================

(1) 安裝ONMP
(2) 解除安裝ONMP
(3) 設定資料庫密碼
(4) 重置資料庫
(5) 資料庫自動備份
(6) 全部重置(會刪除網站目錄,請注意備份)
(7) 安裝網站程式
(8) 網站管理
(9) 開啟Swap
(0) 退出

EOF

read -p "輸入你的選擇[0-9]: " input
case $input in
    1) install_onmp_ipk;;
2) remove_onmp;;
3) set_passwd;;
4) init_sql;;
5) sql_backup;;
6) init_onmp;;
7) install_website;;
8) web_manager;;
9) set_swap;;
0) exit;;
*) echo "你輸入的不是 0 ~ 8 之間的!"
exit;;
esac 
}

re_sh="renewsh"

if [ "$1" == "$re_sh" ]; then
    set_onmp_sh
    exit;
fi  

start