搭建WEB管理環(huán)境(NamedManager)下的DNS服務(wù)器

基礎(chǔ)組件

Bind
NamedManager

簡易安裝

全程Yum安裝
這個沒什么可說的火架,需要注意的是

/etc/namedmanager/config-bind.php 
/etc/namedmanager/config.php

這兩個文件的配置信息布轿。
最開始應(yīng)該直接用IP的方式訪問寄悯,搞清楚namedmanager的機制之后再切換域名來弄招刨。
若是測試域名記得修改

/etc/hosts

編譯安裝

這個就有點麻煩了暖释,麻煩的是很多服務(wù)/配置都得自己寫一遍戚炫,但是為了用最新版本還是采用這個跑了起來剑刑。

準(zhǔn)備

編譯安裝BIND
此教程看到安裝完成即可。(如果安裝失敗双肤,那我也無能為力)
大約需要20分鐘施掏。
安裝LNMP
可以自己yum安裝也可以用現(xiàn)成的工具,本人比較懶直接用工具裝的
CENTOS6.9 + PHP 5.6.32(php7也沒問題) + Mysql5.6.38 (5.7沒測過) + Tengine
大約需要30分鐘茅糜。
下載NamedManager
以上默認(rèn)完成了bind的編譯,LNMP環(huán)境的搭建,namedmanager的下載(zip解壓到/data/wwwroot/www)

配置namedmanager

前提說明

#配置文件信息
1.named 編譯目錄 
/usr/local/bind #所以 有些服務(wù)的位置就在 /usr/local/bind/sbin 后面會用
2.named 配置文件目錄 / 額外參數(shù)目錄 
/etc/named
/var/named
3.namedmanager 目錄 
/data/wwwroot/www
4.namedmanager 網(wǎng)站修改后會同步到數(shù)據(jù)庫及 /etc/named.namedmanager.conf (自動修改 此處僅說明)
5.同步機制 每分鐘自動運行
/etc/cron.d/namedmanager-bind
6.namedmanager 數(shù)據(jù)庫連接及配置信息 /etc/namedmanager/config.php
/etc/namedmanager/config-bind.php

直接貼配置

#named.conf
key "rndc-key" {
        algorithm hmac-md5;
        secret "BC3r7nPgyUwL8o47sjrlbC=a";
};

controls {
        inet 127.0.0.1 port 953
                allow { 127.0.0.1; } keys { "rndc-key"; };
};
options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { ::1; };
        pid-file "/var/named/named.pid";
        directory       "/var/named"; #創(chuàng)建目錄
        dump-file       "/var/named/data/cache_dump.db"; #touch 文件
        statistics-file "/var/named/data/named_stats.txt"; #touch 文件
        memstatistics-file "/var/named/data/named_mem_stats.txt"; #touch 文件
        allow-query     { any; };
        allow-query-cache     { any; };
        recursion yes;

        dnssec-enable yes;
        dnssec-validation yes;

        /* Path to ISC DLV key */
        bindkeys-file "/var/named/named.iscdlv.key"; 

        managed-keys-directory "/var/named/dynamic"; #創(chuàng)建目錄 并且給777
};

logging {
        channel default_debug {
                file "/var/named/data/named.run"; #創(chuàng)建/var/named/data 目錄 并且給777
                severity dynamic;
        };
};
zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.namedmanager.conf"; #這個是關(guān)鍵
#/etc/namedmanager/config.php

$config["db_host"] = "localhost";                       // hostname of the MySQL server
$config["db_name"] = "namedmanager";                            // database name
$config["db_user"] = "namedmanager";                            // MySQL user
$config["db_pass"] = "passwd";                                // MySQL password (if any)

$_SERVER['HTTPS'] = "TRUE"; #這個加的話 就不強制HTTPS
#/etc/namedmanager/config-bind.php
$config["api_url"]              = "http://dns.abc.cn"; //如果是IP記得在網(wǎng)站后臺也輸入IP
$config["api_server_name"]      = "dns.abc.cn";//和上方的一樣
$config["api_auth_key"]         = "anyset";

$config["bind"]["config"]       = "/etc/named.namedmanager.conf";
$config["bind"]["zonefiledir"]  = "/var/named/";
$config["log_file"]             = "/var/log/messages";
$config["bind"]["reload"] = "/usr/local/bind/sbin/rndc reload"; //關(guān)鍵
$config["bind"]["verify_zone"]          = "/usr/local/bind/sbin/named-checkzone";               // Used to verify each generated zonefile as OK
$config["bind"]["verify_config"]        = "/usr/local/bind/sbin/named-checkconf";               // Used to verify generated NamedManager configuration

注意1 service start

編譯安裝的沒有/etc/init.d/named服務(wù) 主要修改 /usr/local/bind/sbin 相關(guān)的位置 若編譯位置在 /usr/local/bind 的直接可用

#!/bin/bash
#
# named           This shell script takes care of starting and stopping
#                 named (BIND DNS server).
#
# chkconfig: - 13 87
# description: named (BIND) is a Domain Name Server (DNS) \
# that is used to resolve host names to IP addresses.
# probe: true

### BEGIN INIT INFO
# Provides: $named
# Required-Start: $local_fs $network $syslog
# Required-Stop: $local_fs $network $syslog
# Default-Start:
# Default-Stop: 0 1 2 3 4 5 6
# Short-Description: start|stop|status|restart|try-restart|reload|force-reload DNS server
# Description: control ISC BIND implementation of DNS server
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

#[ -r /etc/named ] && . /etc/named

RETVAL=0
export KRB5_KTNAME=${KEYTAB_FILE:-/etc/named.keytab}

named='named'
if [ -x /usr/local/bind/sbin/named-sdb ]; then
    named='named-sdb'
fi

# Don't kill named during clean-up
NAMED_SHUTDOWN_TIMEOUT=${NAMED_SHUTDOWN_TIMEOUT:-25}

if [ -n "$ROOTDIR" ]; then
   ROOTDIR=`echo $ROOTDIR | sed 's#//*#/#g;s#/$##'`;
   rdl=`/usr/bin/readlink $ROOTDIR`;
   if [ -n "$rdl" ]; then
      ROOTDIR="$rdl";
   fi;
fi

PIDFILE="/var/named/named.pid"

ROOTDIR_MOUNT='/etc/pki/dnssec-keys /var/named /etc/named/named.conf
/etc/named.dnssec.keys /etc/named/named.rfc1912.zones /etc/named/rndc.conf /etc/named/rndc.key
/usr/lib64/bind /usr/lib/bind /usr/local/bind /etc/named/named.iscdlv.key /etc/named/named.root.key
/etc/services /etc/protocols'

for LIB in /lib /lib64
do
  if [ -d "$ROOTDIR$LIB" ]; then
    for NSSLIB in "$LIB"/libnss_files.so.[1-9]
    do
      ROOTDIR_MOUNT+=" $NSSLIB"
    done
  fi
done

mount_chroot_conf()
{
  if [ -n "$ROOTDIR" ]; then
    for all in $ROOTDIR_MOUNT; do
      # Skip nonexistant files
      [ -e "$all" ] || continue

      # If mount source is a file
      if ! [ -d "$all" ]; then
        # mount it only if it is not present in chroot or it is empty
        if ! [ -e "$ROOTDIR$all" ] || [ "`stat -c'%s' "$ROOTDIR$all"`" -eq 0 ]; then
          touch "$ROOTDIR$all"
          mount --bind "$all" "$ROOTDIR$all"
        fi
      else
        # Mount source is a directory. Mount it only if directory in chroot is
        # empty.
    if [ -e "$all" ] && [ "`ls -1A "$ROOTDIR$all" | wc -l`" -eq 0 ]; then
          mount --bind "$all" "$ROOTDIR$all"
    fi
      fi
    done
  fi
}

umount_chroot_conf()
{
  if [ -n "$ROOTDIR" ]; then
    for all in $ROOTDIR_MOUNT; do
      # Check if file is mount target. Do not use /proc/mounts because detecting
      # of modified mounted files can fail.
      if mount | grep -q '.* on '"$ROOTDIR$all"' .*'; then
        umount "$ROOTDIR$all"
        # Remove temporary created files
        [ -f "$all" ] && rm -f "$ROOTDIR$all"
      fi
    done
  fi
}

check_pidfile() {
  PID="`pidofproc -p "$ROOTDIR$PIDFILE" "$named"`"
  if [ -n "$PID" ] && [ "`ps -p "$PID" --no-headers -o comm`" != "$named" ]; then
    rm -f $ROOTDIR$PIDFILE &> /dev/null
  fi
}

pidofnamed() {
    pidofproc -p "$ROOTDIR$PIDFILE" "$named";
}

# Check if all what named needs running
start()
{
  [ "$EUID" != "0" ] && exit 4

  # Source networking configuration.
  [ -r /etc/sysconfig/network ] && . /etc/sysconfig/network

  # Check that networking is up
  [ "${NETWORKING}" = "no" ] && exit 1


  [ -x /usr/local/bind/sbin/"$named" ] || exit 5

  if [ ! -s /etc/named/rndc.key -a ! -s /etc/named/rndc.conf ]; then
    # Generate rndc.key if doesn't exist AND there is no rndc.conf
    echo -n $"Generating /etc/named/rndc.key:"
    if /usr/local/bind/sbin/rndc-confgen -a -r /dev/urandom > /dev/null 2>&1; then
      chmod 640 /etc/named/rndc.key
      chown root.named /etc/named/rndc.key
      [ -x /sbin/restorecon ] && /sbin/restorecon /etc/named/rndc.key
      success $"/etc/named/rndc.key generation"
      echo
    else
      failure $"/etc/named/rndc.key generation"
      echo
    fi
  fi

  # Handle -c option
  previous_option='unspecified';
  for a in $OPTIONS; do
    if [ $previous_option = '-c' ]; then
      named_conf=$a;
    fi;
    previous_option=$a;
  done;

  named_conf=${named_conf:-/etc/named/named.conf};

  # check if named is running before mounting files/dirs
  echo -n $"Starting named: "
  check_pidfile
  if [ -n "`pidofnamed`" ]; then
    echo -n $"named: already running"
    success
    echo
    exit 0;
  fi;

  mount_chroot_conf

  if [ ! -r $ROOTDIR$named_conf ]; then
    echo 'Cannot find configuration file. You could create it by system-config-bind'
    exit 6;
  fi;

  [ -x /sbin/portrelease ] && /sbin/portrelease named &>/dev/null || :

  if ! [ "$DISABLE_ZONE_CHECKING" = yes ]; then
    ckcf_options='-z'; # enable named-checkzone for each zone (9.3.1+) !
  fi;

  if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then
    OPTIONS="${OPTIONS} -t ${ROOTDIR}"
    ckcf_options="$ckcf_options -t ${ROOTDIR}";
    [ -s /etc/localtime ] && cp -fp /etc/localtime ${ROOTDIR}/etc/localtime;
  fi

  RETVAL=0
  # check if configuration is correct
  if [ -x /usr/local/bind/sbin/named-checkconf ] && [ -x /usr/local/bind/sbin/named-checkzone ] && /usr/local/bind/sbin/named-checkconf $ckcf_options ${named_conf} >/dev/null 2>&1; then

    daemon --pidfile "$ROOTDIR$PIDFILE" /usr/local/bind/sbin/"$named" -u named ${OPTIONS};
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
      rm -f /var/named/{named,named-sdb}.pid;
      ln -s "$ROOTDIR$PIDFILE" /var/named/"$named".pid;
    fi;

  else
    named_err="`/usr/local/bind/sbin/named-checkconf $ckcf_options $named_conf 2>&1`";     
    echo
    echo "Error in named configuration:";
    echo "$named_err";
    failure
    echo
    [ -x /usr/bin/logger ] && echo "$named_err" | /usr/bin/logger -pdaemon.error -tnamed;
    umount_chroot_conf
    exit 2;
  fi;
  echo
  if [ $RETVAL -eq 0 ]; then
    touch /var/lock/subsys/named;
  else
    umount_chroot_conf
    exit 7;
  fi
  return 0;
}

stop() {
  [ "$EUID" != "0" ] && exit 4

  # Stop daemons.
  echo -n $"Stopping named: "
  check_pidfile
  [ -x /usr/local/bind/sbin/rndc ] && /usr/local/bind/sbin/rndc stop >/dev/null 2>&1;
  RETVAL=$?
  # was rndc successful?
  [ "$RETVAL" -eq 0 ] || \
    killproc -p "$ROOTDIR$PIDFILE" "$named" -TERM >/dev/null 2>&1

  timeout=0
  RETVAL=0
  while pidofnamed &>/dev/null; do
    if [ $timeout -ge $NAMED_SHUTDOWN_TIMEOUT ]; then
      RETVAL=1
      break
    else
      sleep 2 && echo -n "."
      timeout=$((timeout+2))
    fi;
  done

  umount_chroot_conf

  # remove pid files
  if [ $RETVAL -eq 0 ]; then
    rm -f /var/lock/subsys/named
    rm -f /var/named/{named,named-sdb}.pid
  fi;

  if [ $RETVAL -eq 0 ]; then
    success
  else
    failure
    RETVAL=1
  fi;
  echo
  return $RETVAL
}


rhstatus() {
  [ -x /usr/local/bind/sbin/rndc ] && /usr/local/bind/sbin/rndc status;
  check_pidfile
  status -p "$ROOTDIR$PIDFILE" -l named /usr/sbin/"$named";
  return $?
}   

restart() {
    stop
    start
}

reload() {
        [ "$EUID" != "0" ] && exit 

        echo -n $"Reloading "$named": "
    check_pidfile
    p=`pidofnamed`
    RETVAL=$?
    if [ "$RETVAL" -eq 0 ]; then 
        /usr/local/bind/sbin/rndc reload >/dev/null 2>&1 || /bin/kill -HUP $p;
        RETVAL=$?
        fi
    [ "$RETVAL" -eq 0 ] && success $"$named reload" || failure $"$named reload"
        echo
    return $RETVAL
}

checkconfig() {
    ckcf_options='-z';
    if [ -n "${ROOTDIR}" -a "x${ROOTDIR}" != "x/" ]; then
        ckcf_options="$ckcf_options -t ${ROOTDIR}";
        if ! [ -e "$ROOTDIR/$PIDFILE" ]; then
            mount_chroot_conf
        fi
    fi;
    if [ -x /usr/local/bind/sbin/named-checkconf ] && [ -x /usr/local/bind/sbin/named-checkzone ] && /usr/local/bind/sbin/named-checkconf $ckcf_options ${named_conf} ; then
        RETVAL=0
    else
        RETVAL=1
    fi
    if ! [ -e "$ROOTDIR/$PIDFILE" ]; then
        umount_chroot_conf
    fi
    return $RETVAL
}

# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        rhstatus;
        RETVAL=$?
        ;;
    restart)
        restart
        ;;
    condrestart|try-restart)
        if [ -e /var/lock/subsys/named ]; then restart; fi
                ;;
    reload)
        reload
        ;;
    force-reload)
        if ! reload; then restart; fi
        ;;
    checkconfig|configtest|check|test)
        checkconfig
        RETVAL=$?
        ;;
    *)
            echo $"Usage: $0 {start|stop|status|restart|try-restart|reload|force-reload}"
        [ "x$1" = "x" ] && exit 0
        exit 2
esac

exit $RETVAL

注意2 安裝namedmanager相關(guān)

https://github.com/jethrocarr/namedmanager/wiki/Installation-Git
因為我們使用的是 /data/wwwroot/www 存放這個網(wǎng)頁服務(wù)

#導(dǎo)入數(shù)據(jù)庫
cd /data/wwwroot/www
mysql --u root --p < sql/version_LATESTDATE_install.sql
#添加數(shù)據(jù)庫用戶及密碼(這個就不貼了 只要新增的用戶能夠管理上一步操作的數(shù)據(jù)庫即可)
#設(shè)置配置文件
mkdir /etc/namedmanager/
#依然在 /data/wwwroot/www 目錄
cp htdocs/include/sample-config.php /etc/namedmanager/config.php
#這一步是為了方便管理 只需要修改/etc/namedmanager/config.php 內(nèi)容即可保證web服務(wù)運行七芭,具體內(nèi)容上面有貼入
ln -s /etc/namedmanager/config.php /data/wwwroot/www/htdocs/include/config-settings.php
#以下是創(chuàng)建config-bind.php 和 上面的config.php 不是一回事 切記 切記!C镒浮狸驳!
cp bind/include/sample-config.php /etc/namedmanager/config-bind.php
ln -s /etc/namedmanager/config-bind.php /data/wwwroot/www/bind/include/config-settings.php

注意3 定時腳本及任務(wù)

在原來的官方文檔中定時腳本是和[注意2]一起出現(xiàn)的预明,經(jīng)過本人的安裝經(jīng)歷,決定單獨放出來

#依然在 /data/wwwroot/www
cp resources/namedmanager_logpush.rcsysinit /etc/init.d/namedmanager_logpush
cp resources/namedmanager-www.cron /etc/cron.d/namedmanager-www
cp resources/namedmanager-bind.cron /etc/cron.d/namedmanager-bind
#以上需要修改對應(yīng)的具體內(nèi)容耙箍,主要是改路徑
mkdir /var/log/namedmanager
chown www:www /var/log/namedmanager
#創(chuàng)建日志路徑及權(quán)限

https://github.com/jethrocarr/namedmanager/wiki/Installation-Integration-Bind
官方文檔提過

php -q /usr/share/namedmanager/bind/namedmanager_bind_configwriter.php

改為

php -q /data/wwwroot/www/bind/namedmanager_bind_configwriter.php
#這也就是定時任務(wù)中會用到的語句贮庞,記得修改定時任務(wù)中的內(nèi)容

總結(jié)

BIND安裝容易,但是NamedManager去管理不容易究西。
過程中出現(xiàn)了幾點麻煩單獨再提出以下:
1.WEB程序的的腳本路徑問題窗慎;
2.PHP的函數(shù)權(quán)限問題,需要打開exec,fopen等;
3.PHP函數(shù)的max_vars的問題 因為子域名很多默認(rèn)是1000卤材,超過1000就要去修改(搜索ini的max關(guān)鍵字);
4.修改后自動同步并重啟服務(wù)的問題遮斥,主要觀察php日志或/var/log/message的相關(guān)日志(本人出現(xiàn)這個問題是因為config-bind.php沒有指定rndc的路徑即$config["bind"]["reload"]);
5.發(fā)現(xiàn)無法同步是通過查看定時任務(wù)日志找到的原因,日志在 /var/log/cron。

當(dāng)前還有鏡像 有需要可以留言聯(lián)系扇丛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末术吗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子帆精,更是在濱河造成了極大的恐慌较屿,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卓练,死亡現(xiàn)場離奇詭異隘蝎,居然都是意外死亡,警方通過查閱死者的電腦和手機襟企,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門嘱么,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人顽悼,你說我怎么就攤上這事曼振。” “怎么了蔚龙?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵冰评,是天一觀的道長。 經(jīng)常有香客問我木羹,道長甲雅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任汇跨,我火速辦了婚禮务荆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘穷遂。我一直安慰自己函匕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布蚪黑。 她就那樣靜靜地躺著盅惜,像睡著了一般中剩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抒寂,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天结啼,我揣著相機與錄音,去河邊找鬼屈芜。 笑死郊愧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的井佑。 我是一名探鬼主播属铁,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼躬翁!你這毒婦竟也來了焦蘑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤盒发,失蹤者是張志新(化名)和其女友劉穎例嘱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宁舰,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡拼卵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了明吩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片间学。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖印荔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情详羡,我是刑警寧澤仍律,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站实柠,受9級特大地震影響水泉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窒盐,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一草则、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蟹漓,春花似錦炕横、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膜钓。三九已至,卻和暖如春卿嘲,著一層夾襖步出監(jiān)牢的瞬間颂斜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工拾枣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沃疮,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓梅肤,卻偏偏與公主長得像司蔬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凭语,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理葱她,服務(wù)發(fā)現(xiàn),斷路器似扔,智...
    卡卡羅2017閱讀 134,715評論 18 139
  • 寫在前面 一年前買的空間到期了吨些,正好阿里云送了云空間,想著把空間轉(zhuǎn)移到阿里云炒辉。才發(fā)現(xiàn)國內(nèi)的域名備案是個深坑豪墅,需要身...
    Mjolnir1107閱讀 1,113評論 0 1
  • 系統(tǒng)環(huán)境 所需軟件官方下載地址: 一、 安裝開發(fā)包環(huán)境: 二黔寇、 關(guān)閉iptables和Selinux(生產(chǎn)...
    莫名其妙的一生閱讀 1,309評論 0 4
  • 模塊類似于一個封裝庫偶器,從 Lua 5.1 開始,Lua 加入了標(biāo)準(zhǔn)的模塊管理機制缝裤,可以把一些公用的代碼放在一個文件...
    誰說我是小小云閱讀 877評論 4 1
  • 又是一部回憶殺的電影屏轰,阿浪從來不理解父親,所有的印象:父親坐了六年牢憋飞,從小不喜歡他的愛好霎苗,從小讓他學(xué)習(xí)很多東西,母...
    地瓜甜甜閱讀 619評論 0 0