[wsl]成為寫PHP程式測試環境

目前寫PHP程式的測試環境是用uniform server,架設及操作使用皆十分方便,唯一的缺點是執行效能,點個網頁得等上2-3秒的時間,爬文也沒找到解決的方案。最近WSL2興起,於是想想是不是可以用來架設測試環境,經過幾天的嘗試,發現效能竟然不錯。以下是架設的過程。

安裝WSL2

​手動下載 Windows 子系統 Linux 版散發版本套件 https://docs.microsoft.com/zh-tw/windows/wsl/install-manual
使用ubuntu 16.04
安裝散發版本 PowerShell  Add-AppxPackage .\app_name.appx

★★★安裝相關套件
apt update
apt install tasksel
安裝LAMP server

apt install phpmyadmin

★★★在 Windows 10 中將 WSL(Ubuntu) 重設
https://blog.0t2.me/reset-wsl-in-windows-10/
windows設定 –>應用程式 –>ubuntu16.04 –> 進階選項–>重設

★★★Ubuntu 14.04更改Apache網站根目錄  https://www.itread01.com/p/163145.html
修改檔案:/etc/apache2/sites-enabled/000-default
在文件中找到 DocumentRoot 在後面修改你要放置網頁檔案的目錄
DocumentRoot /mnt/d/sport

大多數教程只是到了這一步!!然而這樣是有問題的。
還需要配置Apache2.conf檔案![這裡寫圖片描述](http://img.blog.csdn.net/20160407143221995)
<Directory /mnt/d/sport/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

修改完後重啟apache2伺服器即可,重啟命令: sudo /etc/init.d/apache2 restart

 

★★★WSL檔案放在
%LOCALAPPDATA%\Packages\<PackageFamilyName>\LocalState\<disk>.vhdx
CanonicalGroupLimited.Ubuntu16.04onWindows_79rhkp1fndgsc
C:\Users\sairwolf\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu16.04onWindows_79rhkp1fndgsc\LocalState


★★★https://blog.miniasp.com/post/2020/07/26/Multiple-Linux-Dev-Environment-build-on-WSL-2
關閉 WSL Distro 執行
關閉特定 WSL Distro 執行

wsl -t WLinux
關閉所有 WSL Distro 執行(等同於關閉 VM 執行)

wsl –shutdown
移除 WSL Distro 版本
注意:所有該 WSL Distro 下所有的檔案,都會被全數刪除,刪除後無法復原喔!

wsl.exe –unregister WLinux2


★★★安裝php5.6
http://dchesmis.blogspot.tw/2016/09/ubunt-1604php5x.html
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php5.6
sudo apt-get install php5.6-mbstring php5.6-mcrypt php5.6-mysql php5.6-xml
sudo php -v

sudo apt-get install php5.6-gd

從 php7 切換到 php5:
         sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart
     CLI:
          sudo update-alternatives -set php /usr/bin/php5.6

★★★設定mysql 模式
關閉Ubuntu預設mysql5.7版的strict mode設定方法(嚴格模式)
1、SSH連線到伺服器的root,找到以下路徑,並建立一個disable_strict_mode.cnf檔案
/etc/mysql/conf.d/disable_strict_mode.cnf <-建立檔案
2、打開文件並寫入以下語法:
[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
3、輸入指令重新啟用mysql
sudo service mysql restart
為了確認strict mode模式是不是已經被關閉了,可以在phpMyAdmin的sql中輸入SELECT @@GLOBAL.sql_mode進行測試
如果顯示IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FO則表示strict mode模式已經被關閉,恭喜您可以脫離苦海了。

★★★phpmyadmin設定連線時間
一、修改 /etc/php.ini
設定系統逾時的秒數
session.gc_maxlifetime = 86400
重啟 apache 生效

二、修改 /path/to/phpmyadmin 設定檔
到你安裝phpmyadmin的目錄/etc/phpmyadmin
理論上在 phpmyadmin的根目錄下應該有 config.inc.php 這個檔案,如果沒有的話,請將sample設定檔拿來用:
# cp config.sample.inc.php config.inc.php
修改config.inc.php
最上面加入一行,設定時間(秒數)即可
$cfg[‘LoginCookieValidity’] = 86400;

★★★目前未解決的問題
1.無法設定固定IP:暫時用hEdit_x64編輯hosts檔,新增wsl 指向動態IP來解決
2.ssh連入時無法用密碼登入,只能用public key [修改/etc/sshd_config  設定 PasswordAuthentication yes 就可以了]
3..sh檔無法執行 解決方法寫bat
例service_start.bat
 

REM wsl.exe --shutdown
wsl.exe -u root service ssh start
wsl.exe -u root service mysql start
wsl.exe -u root service apache2 start
PAUSE


hosts

 

127.0.0.1       localhost
::1             localhost
::1             lo
::1             w.lo

localhost 會自動導向wsl主機,如要少打一些字記得加入 ::1 的轉向。
w.lo可以讓瀏覽器認得這是一個網址,直接打lo瀏覽器會當成搜尋字串。

在windows 的CMD命令提示字元視窗執行wsl指令就可以進ubuntu

 

目前WSL2沒有像VM那樣的網路橋接器功能,所以其他機器無法透過IP存取WSL2裡的資源,翻了github找到一個解法,用windows的netsh把port映射到WSL2。
參考文件:Joe Huang

1.開啟power shell 執行外部script的權限
以系統管理員身份執行power shell並執行以下指令
PS C:\> Set-ExecutionPolicy RemoteSigned
選擇全部皆是

2.執行下面的script
其他的機器可以成功的連入,檔案通知的機制也能正常運作
 

$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if( $found ){
  $remoteport = $matches[0];
} else{
  echo "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;
}

#[Ports]

#All the ports you want to forward separated by coma
$ports=@(80,443,10000,3000,5000);


#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";


#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";

#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";

for( $i = 0; $i -lt $ports.length; $i++ ){
  $port = $ports[$i];
  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}

 

更換預設語系
阿舍的隨手記記 Ubuntu 用指令設定終端機顯示中文訊息
 

sudo locale-gen zh_TW 
sudo locale-gen zh_TW.UTF-8
sudo dpkg-reconfigure locales 
sudo update-locale LANG="zh_TW.UTF-8" LANGUAGE="zh_TW"

用locale指令可以查得目前的語系設定

本篇發表於 Linux系統, Windows系統, 程式設計。將永久鏈結加入書籤。