怠azineは、VirtualBoxに基づいてWeb開発のための環境を作成するための進行状況または私のバージョンのエンジンです





何らかの方法で、すべてのWeb開発者は、Webアプリケーションを開発するために何らかのサーバーを必要とします。 誰かがDenverを使用し、誰かがOpenServerを使用し、より高度な仮想サーバー(VPS)を使用し、さらに高度なVagrantを使用します。 ここでは、VirtualBox、bash、および松葉杖を使用してWeb開発アプリケーションを展開する方法を説明します。 怠け者で猫の下を見たくない人のために:ゲストOSの共有フォルダーをマウントする1つのbashスクリプトと、システムを停止する前に起動してデーモンインターフェースを実装する最初のスクリプトを実行するハーフデーモンについて説明します。



ゲストOSとしてCentOS 6.5 Linuxディストリビューションが選択され、WebサーバーとしてApache 2.2.15が選択されました。



すぐに予約します。インターネットには多くのマナがあるため、LAMPサーバーのインストールと構成については説明しません。



スクリプトの最初のバージョンは次のようになりました。



#!/bin/sh mount -t vboxsf $1 $2
      
      







徐々に、次のスクリプトに成長しました。

スクリプト1-主力-/root/scripts/vbox-sf.sh
 #!/bin/sh # Author: Dmitry Vapelnik # Email: dvapelnik@gmail.com #  - logfile='/var/log/vbox-sf.log' # ,      mountPrefix='/var/www/html/'; # - hn='.'`hostname` #   ,    VirtualBox sharedFolders=`df | egrep "\/media\/sf_\$2[^ ]*" -o | sed -e 's/\/media\/sf_//'` #================ LOG ==========================================================# function log { echo [`date +"%F %T"`] $1 $2 >> $logfile } #================ MOUNTING =====================================================# function mountFn { echo "Mounting...."; for f in $sharedFolders; do mountPath=$mountPrefix$f$hn if cat /proc/mounts | grep vbox | grep $mountPath &> /dev/null; then echo Already mounted. Continue..; else rm -rf $mountPath 2> /dev/null; mkdir -p $mountPath; chown apache:apache $mountPath; if mount -t vboxsf $f $mountPath -o umask=0022,uid=apache,gid=apache; then echo Mounted $f log mounted $mountPath #        #   XDebug mkdir -p /var/www/html/$f$hn/xd_profile_$f$hn mkdir -p /var/www/html/$f$hn/xd_trace_$f$hn if [ -f $mountPath'/httpd.conf' ]; then #   httpd     cat $mountPath'/httpd.conf' | sed -e "s/<%domain%>/$f$hn/g" > /etc/httpd/conf/sf/$f$hn.conf if [ -f $mountPath'/aftermount.sh' ]; then #    ,   #      bash $mountPath'/aftermount.sh' $mountPath; fi fi fi fi done; #  - service httpd restart } #================ UNMOUNTING ===================================================# function umountFn { echo "Unmounting..." #  - service httpd stop for f in $sharedFolders; do mountPath=$mountPrefix$f$hn #   - find $mountPath -type f -name httpd_"$f""$hn"_*.log -exec rm -f {} \; #      rm -rf $mountPath/xd_profile_"$f""$hn" rm -rf $mountPath/xd_trace_"$f""$hn" #    ,   #      if [ -f $mountPath'/beforeumount.sh' ]; then bash $mountPath'/beforeumount.sh' $mountPath; fi #   umount $mountPath #    if [[ $? -eq 0 ]]; then rm -rf $mountPath 2> /dev/null rm -f /etc/httpd/conf/sf/$f$hn.conf 2> /dev/null echo "Unmounted and removed $f" log umounted $mountPath else echo "Not unmounted" fi done; #  - service httpd start } #================ STATUS =======================================================# function statusFn { com=0 for f in $sharedFolders; do mountPath=$mountPrefix$f$hn if df | grep $mountPath &> /dev/null; then com=`expr $com + 1`; if [ $com -eq 1 ]; then echo List of mounted resources: fi df | grep $mountPath | egrep -o '\/.+$' fi done if [ $com -eq 0 ]; then echo No shared storage mounted fi } #===============================================================================# if [ "$1" == "mount" ]; then mountFn; exit 0 elif [ "$1" == "umount" ]; then umountFn; exit 0 elif [ "$1" == "status" ]; then statusFn; exit 0 else cat << EOF No arguments supplied ----------------------------------------------------------------------------- Usage: ----------------------------------------------------------------------------- Using with single argument one of: mount : for mounting all shared folders under /var/www/html directory umount : for unmounting all shared folders under /var/www/html directory status : for checking mount status ----------------------------------------------------------------------------- Using with two argument for mounting or unmounting single folder Example: vbox-sf mount foo : will mount shared folder /media/sf_foo into /var/www/html/foo.domain.com vbox-sf umount foo : will umount shared folder /media/sf_foo from /var/www/html/foo.domain.com EOF exit 1 fi exit 0
      
      







必要なものとその仕組み



  1. ゲストマシンにWebサーバーをインストールする必要があります(Apacheを選択しました)。
  2. ゲストOSで共有フォルダーを正しくマウントするには、 Guest Additionsをインストールする必要があります。
  3. マウントするフォルダーは短く、一意である必要があります-この名前はサーバーのドメインのサブドメインになります。
  4. Webサーバーの仮想ホスト構成テンプレートを共有フォルダーのルートに配置する必要があります。

    Webサーバーの概算の仮想ホスト構成
     <VirtualHost *:80> DocumentRoot /var/www/html/<%domain%> ServerName <%domain%> ServerAlias www.<%domain%> DirectoryIndex index.php <Directory /var/www/html/<%domain%>> AllowOverride All php_admin_value open_basedir /var/www/html/<%domain%>:/tmp:/usr/share:/var/lib </Directory> CustomLog /var/www/html/<%domain%>/httpd_<%domain%>_access.log combined ErrorLog /var/www/html/<%domain%>/httpd_<%domain%>_error.log php_admin_value xdebug.profiler_output_dir /var/www/html/<%domain%>/xd_profile_<%domain%> php_admin_value xdebug.trace_output_dir /var/www/html/<%domain%>/xd_trace_<%domain%> </VirtualHost>
          
          





    構成自体は変更される可能性がありますが、主なポイントを保存する必要があります:<%domain%>-Webアプリケーションのドメインに置き換えられるマスク、プロファイリングとトレース用のログファイルとフォルダー(必要な場合)。 アプリケーションで必要なものに応じて、味わう他のすべて。




  5. フォルダーは、自動マウントと、できれば書き込み権限で共有する必要があります。このアプリケーションを介して何かをアップロードできるため、ファイルを保存する必要があります。 そして誰かがファイルに何かをキャッシュできます。 書く権利は害を与えません。 自動マウントは重要です-スクリプトは、 / media / sf_ *に既にマウントされているフォルダーのリストから必要なフォルダーを選択します。これが、フォルダーを自動マウントでマウントする必要がある理由です。 スクリーンショットのように見えるはずです。
  6. ゲストマシンでは、SELinuxを無効にする必要があります。 SELinuxを有効にすると、Webサーバーは/ var / www / html /にマッピングされたフォルダーを認識しません-それらはhttpdではなくvboxコンテキストにマウントされます。 私はまだそれを修正する方法を見つけていないので、松葉杖で支えられました-SELinuxを無効にしました。
  7. ホストマシンホストはドメインの形式である必要があります。 natty.natがあるため、このゲストマシンにダウンロードするすべてのWebアプリケーションは次のようになります:[共有するフォルダーの名前]。[ホスト名]。 例: test.natty.nat 個人的には、そのようなドメインにハングアップするのは便利でした。
  8. / etc / httpd / conf / sfフォルダーを作成する必要があります。
     # mkdir -p /etc/httpd/conf/sf
          
          



    Webサーバーの仮想ホストの構成が保存される場所。 同時に、 / etc / httpd / conf / httpd.confファイルの最後に、上記のフォルダーに保存するすべての構成を含める必要があります。

     include "conf/sf/*.conf"
          
          







すべてが順調であれば、仮想マシン上のプロジェクトとフォルダーを共有して実行し、次のコマンドを実行することで、開発の準備が整います。



 # /path/to/vbox-sf.sh mount
      
      







したがって、すべての共有フォルダーをマウントします。 2番目の引数としてフォルダーの名前を指定すると、そのフォルダーのみをマウントまたは分解できます。



 # /path/to/vbox-sf.sh mount test
      
      





 # /path/to/vbox-sf.sh umount test
      
      









しかし、今ではこのビジネスを何らかの形で自動化するのがいいでしょう。 デーモンのパスを選択しましたが、/ etc / rcファイルを変更するよりも正しいと思います。 次のスクリプトは/etc/init.d用に作成されました

2番目のスクリプト-デーモン-/etc/init.d/vboxsf
 #!/bin/bash # # Author: Dmitry Vapelnik # Email: dvapelnik@gmail.com ### BEGIN INIT INFO # Required-Start: httpd mysqld vboxadd-service vboxadd # Required-Stop: httpd mysqld vboxadd-service vboxadd # Default-Start: 3 # Default-Stop: 0 6 # Short-Description: Mounting VirtualBox shared folders # Description: This file should be used to mount and umount # VirtualBox shared folders ### END INIT INFO # Get function from functions library . /etc/init.d/functions prog="VBoxSF" lockfile='/var/lock/subsys/vboxsf' # Start the service vbox-sf start() { # initlog -c "echo -n Starting $prog server: " /root/bin/vbox-sf mount &> /dev/null && touch $lockfile success $"$prog: mounted" echo } # Restart the service vbox-sf stop() { # initlog -c "echo -n Umounting $prog: " /root/bin/vbox-sf umount &> /dev/null && rm -f $lockfile success $"$prog: umounted" echo } status() { /root/bin/vbox-sf status } ### main logic ### case "$1" in start) start ;; stop) stop ;; status) status ;; restart|reload|condrestart) stop start ;; *) echo $"Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0
      
      







このスクリプトは、ディレクトリ/etc/init.dに配置し、ファイルにvboxsfという名前を付ける必要があります。 実際、ここではファイル名は重要ではありません。 chkconfigを使用して新しいデーモンを追加するとき、このファイルの名前を指定する必要があります。 次に、 vboxsfを使用します



そこで、ファイルを追加しました。 ここで、スクリプトを/ root / binにリンクする必要があります。



 # mkdir -p /root/bin # ln -s /root/scripts/vbox-sf.sh /root/bin/vbox-sf
      
      







chkconfigに追加します。



 # chkconfig --add vboxsf
      
      







すべてが追加されているかどうかを確認します。



 # chkconfig | grep vboxsf
      
      







すべてが順調であれば、スクリプトを実行するレベルを表示する必要があります。







その結果、次のコマンドを簡単に使用できるようになりました。



 # service vboxsf start # service vboxsf stop # service vboxsf restart # service vboxsf status
      
      







そうでない場合は、間違ったことを確認してください。 原則として、この時点ですべてが機能するはずです。起動時にマウントされ、シャットダウンする前に分解されます。



そして今おいしい



フォルダーをマウントした後、アンマウントする前に実行するスクリプトを覚えていますか? したがって、より便利な作業のために、データベースをダンプからMySQLサーバーにデプロイし、マウント解除が発生する前に、データベースをダンプにマージします。 したがって、マシンの電源を切った後に実際のベースダンプがあり、マシンの電源を入れた後に実際のベースがあります。



これらのスクリプトは次のとおりです。

3番目のスクリプト-ダンプからデータベースを復元する-aftermount.sh
 #!/bin/sh # Author: Dmitry Vapelnik # Email: dvapelnik@gmail.com if [ $# -eq 0 ]; then echo 'No arguments supplied'; echo 'Exit'; exit 0; fi ###################################################### dbAdminUser='ourDbAdminLogin' dbAdminPass='ourDbAdminPassword' dbName='ourDbName' dbUser='ourDbUser' dbPass='ourDbPassword' dbHost='localhost' dbDump=$1'/db.sql' ###################################################### queryCreateUser="CREATE USER '$dbUser'@'$dbHost' IDENTIFIED BY '$dbPass'; CREATE DATABASE IF NOT EXISTS \`$dbName\`; GRANT ALL PRIVILEGES ON \`$dbName\`.* TO '$dbUser'@'$dbHost'; FLUSH PRIVILEGES;" echo Creating new user... if mysql -u$dbAdminUser -p$dbAdminPass -e "$queryCreateUser"; then echo User added echo Using MySQL dump if mysql -u$dbAdminUser -p$dbAdminPass $dbName < $dbDump; then echo MySQL dump loaded into $dbName else echo MySQL dump not loaded fi else echo Error: user not added exit fi
      
      







重要! 了解! dbAdminUserとdbAdminPassは、データベース管理者のログインとパスワードであり、ユーザーの作成/削除、データベースの作成、ダンプの入力ができます。

ourDbName、ourDbUser、ourDbPassword-データベースの名前と、開発中のマウントされたWebアプリケーションで使用されるMySQLユーザーのユーザー名とパスワード。



このスクリプトの機能:

  1. ユーザーを作成します。
  2. データベースを作成します。
  3. ダンプの内容をこのデータベースに注ぎます




必要なもの:



  1. DBAがユーザーを追加し、DBを作成し、ダンプを入力できるようにするために(MySQLルートユーザーと短いパスワードを使用します。VirtualBoxでサーバーが破損することはありません)。
  2. データベースのダンプは、 db.sqlファイルの共有フォルダーのルートにある必要があります。 別の名前を付けて別の場所に配置することもできますが、スクリプトも修正する必要があります。これは、必要であれば問題になりません。
  3. 清潔さを維持するために、作成されたユーザーもデータベースも、ビジネス全体を展開する前であってはなりません。




2番目のスクリプトは、データベースの内容をファイルに保存し、ユーザーをクリーンアップしてデータベースを削除するだけです。

4番目のスクリプト-データベースをダンプに保存する-beforeumount.sh
 #!/bin/sh # Author: Dmitry Vapelnik # Email: dvapelnik@gmail.com if [ $# -eq 0 ]; then echo 'No arguments supplied'; echo 'Exit'; exit 0; fi ###################################################### dbAdminUser='dbAdminUser' dbAdminPass='dbAdminPass' dbName='ourDbName' dbUser='ourDbUser' dbHost='localhost' dbDump=$1'/db.sql' ###################################################### queryRemove="DROP DATABASE \`$dbName\`; DROP USER '$dbUser'@'$dbHost'; FLUSH PRIVILEGES;" echo Dumping MySQL DB into file.. if mysqldump -u$dbAdminUser -p$dbAdminPass $dbName > $dbDump; then echo DB dumped into file echo Removing user and database if mysql -u$dbAdminUser -p$dbAdminPass -e "$queryRemove"; then echo User and DB was removed else echo Error on removing fi fi
      
      





前のスクリプトと同じ設定。 この時点で、すべてが透明になっているはずです。



これらすべての操作の後、次のようになります。VirtualBoxの下で実行されている仮想サーバーがあります。 オンにすると、フォルダーが自動的にマウントされ、MySQLにデータベースが作成され、事前に準備されたダンプがアップロードされます-作業できます-ログは実際にマシン上にあり、ファイルとトレースのプロファイリングもマシン上にあります; 作業が完了すると、サーバーの電源をオフにします。ログが削除され、プロファイルファイルとトレースがフォルダーと共に削除され、データベースの内容がファイルにダンプされ、フォルダーが解体され、マシンの電源がオフになります。 実際、サーバーは一種の代理人またはドナーの役割を果たします。最終的には何も保存されず、動き回ることはありませんが、投げたものを再現するだけです。



便利で便利なボーナス:複数のサーバーを異なるソフトウェアバージョンでセットアップし、同時にWebアプリケーションがphp、MySQL、Apacheの各バージョンでどのように機能するかを確認できます。 ログ、トレース、プロファイリングファイルは、ヒープ内のすべてに干渉しないように、ドメイン名に応じて個別のファイルに配置されます。



必要に応じて、他のスイーツやアメニティを掛けることができますが、これは各開発者の好みやニーズに応じて個別に行います。 必要なのは、マウント後にマウント解除する前に実行されるスクリプトに押し込まれます。



はい、別の重要な詳細。 開発に使用できるサブドメインの動物園全体を登録しないようにするには、サーバーマシン(開発中のVirtualBoxがインストールされているマシンにラップトップがあります)にインストールする必要がありますDnsmasqは軽量のDNS、DHCP、TFTP(BOOTP、PXE )サーバー。 単純に全く厄介なチューニングです。 クリーンな設定は次のようになります(はい、3台のマシンがあります:5.3、5.4、5.5):



 $ cat /etc/dnsmasq.conf | egrep -v "(^#.*|^$)" listen-address=127.0.0.1 address=/natty.nat/192.168.191.160 address=/ketty.nat/192.168.191.161 address=/betsy.nat/192.168.191.162
      
      







したがって、これらのドメインのすべてのサブドメインは、指定されたIPアドレスに向けられます。



それでも、誰かがXDebugに役立つ/etc/php.iniを便利だと感じるかもしれません。

/etc/php.iniからの断片
 ;      -    XDebug zend_extension="xdebug.so" xdebug.cli_color=1 xdebug.remote_enable=true xdebug.remote_host="192.168.191.1" xdebug.remote_port=9000 xdebug.remote_handler="dbgp" xdebug.remote_connect_back=1 ; Profiler xdebug.profiler_enable = 0 xdebug.profiler_enable_trigger = 1 xdebug.profiler_append = 0 ; Trace options xdebug.collect_includes = 1 xdebug.collect_params = 4 xdebug.collect_vars = 0 xdebug.dump.REQUEST = * xdebug.dump.SESSION = * ;xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHOD xdebug.dump.SERVER = * xdebug.dump_globals = 1 xdebug.dump_once = 1 xdebug.dump_undefined = 0 xdebug.show_mem_delta = Off ;xdebug.file_link_format = '' xdebug.manual_url = http://www.php.net xdebug.show_exception_trace = 1 xdebug.show_local_vars = 1 xdebug.show_mem_delta = 1 ; Traces xdebug.auto_trace = 0 xdebug.collect_assignments = 1 xdebug.collect_return = 1 xdebug.trace_enable_trigger = 1 ; 0 for parsing ; 1 human readable xdebug.trace_format = 1 xdebug.trace_options = 0 xdebug.trace_output_name = trace.%c
      
      







誰も知らない場合、XDebug- 最も簡単なXdebugで作業するための便利な拡張機能があります。これは、ブレークポイントの停止、プロファイリング、およびトレースを有効/無効にすることができます。



ネットワーク192.168.191.0/24にすべてを作成し、次にこのサブネットからIPを作成しました。 別のサブネットがある場合-必要に応じて変更します。



All Articles