使用 wsl 代替虛擬機的可行性方案


在 Windows 上進行 web 開發,比較普遍的方案是使用 phpstudy 或者別的一些集成環境軟件進行環境搭建,寫好代碼后將代碼上傳至版本管理工具 git/svn,再將代碼同步到 Linux 服務器,這個過程當中開發者的開發環境(Windows)與代碼最終執行的環境(Linux)不一致經常會導致一些奇奇怪怪的問題,想在 Windows 上進行 linux 下的 web 開發,又不想使用虛擬機(虛擬機開機速度慢,添加站點需要重啟,分配內存會導致機器變得卡頓),這時候,wsl 的出現就完美解決了這些問題。無需通過虛擬機以及雙系統的形式體驗 Linux ,並且可以實現系統級別的文件交互操作,實在是太具有吸引力了。


什么是 wsl

在 Windows 10 系統下內置了 Linux,子系統 Linux 運行在 Windows 10 上,微軟將這個 Linux 系統命名為:Windows Subsystem for Linux。簡稱 WSL。

啟動 Linux 子系統

系統要求:Windows 10 且必須是 64 位。在 『控制面板』 –> 『程序和功能』 –> 『啟用和關閉 Windows 功能』 中勾選 『適用於 Linux 的 Windows 子系統』,確定后重啟。重啟后,在 Microsoft Store 中搜索 Linux,搜索結果當中我喜歡的 Linux 版本是比較通用的 Ubuntu,選擇版本 16.04 LTS,點擊安裝,安裝好了之后,在 『開始』 菜單中就可以找到 Ubuntu 應用了,這個應用就是 Windows 當中的子系統 Linux。

基本的設置

打開 Ubuntu 應用,第一次打開會進行初始化安裝,一般持續幾分鍾,之后會提示設置 Linux 用戶名和密碼,按照提示進行操作即可。

更換 Linux 子系統的軟件源並更新

使用 Ubuntu 系統的好處就是可以使用 『軟件源』 進行軟件安裝,即從指定的地址下載軟件,因為默認的軟件源是 Ubuntu 的官網地址,需要設置成國內阿里的鏡像以提高速度。

切換 root 用戶

sudo -i

備份當前軟件源

cp /etc/apt/sources.list /etc/apt/sources.list.old

編輯 『軟件源』 管理文件

vim /etc/apt/sources.list

使用以下代碼復制替換

# deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

保存退出后執行跟新

apt-get update

這樣就成功的將 Ubuntu 的軟件源切換到阿里雲的源了。

啟動 ssh 並使用 ssh 客戶端登錄

在 Windows 10 當中使用 Ubuntu 應用需要通過 Windows 的 CMD 或者 PowerShell 來操作 Linux,對於大多數開發者來說不如直接使用 Xshell 或者 SFTP 來的更熟悉。因此配置 ssh 遠程登錄是非常必要的。為了避免使用 sudo -i 進行提權操作,需要為 root 用戶設置密碼並且切換為 root 用戶進行操作

sudo passwd root // 為 root 用戶設置密碼
su root // 切換 root 用戶

與修改 『軟件源』 類似,需要對原始 ssh 配置文件進行備份,備份 ssh 相關配置文件

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

編輯 ssh 配置文件

sudo vim /etc/ssh/sshd_config

編輯調整以下 ssh 相關的設置項

Port 8022(更換新的端口)
(去掉前面的 #)ListenAddress 0.0.0.0
UsePrivilegeSeparation no(原來是 yes)
PermitRootLogin yes(修改成 yes)
(在前面加上 #)StrictModes yes
PasswordAuthentication yes(原來是 no)

配置完成后啟動 ssh

sudo /etc/init.d/ssh start

接下來就可以使用 Xshell 來登錄了,地址是 127.0.0.1,端口號 8022,用戶名和密碼分別是 root、剛才為 root 用戶設置的密碼。我登錄的過程會遇到登錄上然后瞬間斷開的情況,這時候在 wsl 執行

sudo ssh-keygen -A

然后再登錄就能正常連上了。

使用腳本搭建環境

徒手搭建環境需要一個個安裝軟件,容易漏裝或者裝錯,這里我使用了腳本的方式進行 LNMP 環境部署,只需要一條命令即可完成環境部署,假如團隊當中另外的小伙伴需要部署也是直接輸入該命令即可,既提高了效率也有利於統一開發環境。具體如下:首先,執行sudo -H -s切換為 root 賬戶(需要注意的是這個腳本只支持 Ubuntu 14.04 LTS 和 16 的版本)

安裝執行

wget -qO- https://raw.githubusercontent.com/summerblue/laravel-ubuntu-init/master/download.sh - | bash

此腳本會安裝 Git、PHP 7.2、Nginx、MySql、Sqlite3、Composer、Nodejs 8、Yarn、Redis、Beansalkd、Memcached,安裝結束會輸出 Mysql 的 root 賬號的密碼,需要保存。

創建測試站點

利用腳本自帶的命令,新增 Nginx 站點

./laravel-ubuntu-init/16.04/nginx_add_site.sh

會提示輸入站點名稱、域名,確認后會創建對於的 Nginx 配置並重啟 Nginx,為了便於測試,我創建了兩個項目,分別是 example、example2,域名為 example.com、example2.com,添加成功后將這兩個域名添加到本地(Windows)的 Host 文件,配置好 nginx 配置文件后,創建軟連接,重啟 nginx,具體可參考 Linux nginx 配置多站點

service nginx restart

啟動 php

在使用腳本命令安裝好 php7.2-fpm 之后,發現直接啟動會報錯,執行以下命令即可

sudo mkdir -p /var/run/php
sudo service php7.2-fpm start

這時候瀏覽器訪問 example.com 和 example2.com 應該可以顯示網頁內容了,不過會發現網頁打開的速度極慢,通常需要一兩分鍾才能完全加載一個頁面,需要修改 nginx 的配置文件/etc/nginx/nginx.conf,添加以下代碼

...
http {
	fastcgi_buffering off;
}
...

再次刷新頁面就可以正常打開了。

啟動 Mysql

執行命令啟動 mysql

sudo service mysql start

在 winsows 本地可以用 mysql 可視化工具直接訪問,地址是 127.0.0.1,端口 3306,密碼是搭建環境時腳本自動設置的密碼。

共享 windows 文件夾

到這里,基本上標志着已經可以在 wsl 上進行 web 開發了,不過痛點是每次在 windows 上寫好代碼再同步到 wsl 上比較麻煩,可不可以直接將 windows 上的項目目錄直接鏈接到 wsl 上呢?這樣只要保存就可以在 wsl 上看到效果,不用復制粘貼代碼豈不是美滋滋。答案是可以的,在 wsl 上可以找到 windows 的目錄,路徑是 /mnt/cmnt/dmnt/e,添加一個軟連接,指向需要在 wsl 上執行的項目。比如:我 windows 上的 d 盤下存放着項目目錄 www,我想把 www 目錄下的 laravel_demo 項目放到 wsl 上執行,只需要執行

ln -s /mnt/d/www/laravel_demo /var/www/laravel_demo

這樣,就在 wsl 上創建了一個 laravel_demo 項目,為其配置 nginx 站點文件

cp /etc/nginx/sites-avalible/example.conf /etc/nginx/sites-avalible/laravel_demo.conf
vim /etc/nginx/sites-avalible/laravel_demo.conf

...
server {
	...
	server_name   laravel_demo.test www.laravel_demo.test; // 修改成對應的域名
	root        /var/www/laravel_demo/public; // 修改成項目的文件夾路徑
	...
}
...

將 laravel_demo.test 添加進 windows 本地 hosts 文件,這樣在 windows 上編寫的代碼,執行保存后即可在 linux 上實時看到效果了,很方便有沒有?

支持多版本 php

很多時候,不同的項目可能需要用到不同版本的 php,wsl 是支持同時運行多個版本的 php 的,只需要為不同的項目配置不一樣的 php-fpm.sock 文件,這里以 nginx 為例。首先,安裝所需要的 php 版本,裝好之后,啟動,例如,需要同時支持 5.6 和 7.2 版本的 php

service php5.6-fpm start
service php7.2-fpm start

為對應項目修改 nginx 配置文件的 php 分配,我這里將 example.com 項目配置為 php5.6 的環境下運行,laravel_demo.test 配置為 php7.2 的環境下運行

vim /etc/nginx/sites-avalible/example.conf

...
fastcgi_pass unix:/var/run/php5.6-fpm/php-fpm.sock;// 修改成 php5.6 版本
...

vim /etc/nginx/sites-avalible/laravel_demo.conf

...
fastcgi_pass unix:/var/run/php-fpm/php7.2-fpm.sock;// 修改成 php7.2 版本
...

重啟 nginx 使其生效

service nginx restart

再次訪問 example.com 和 laravel_demo.test 發現均能正常訪問。折騰完畢,在 windows 上也可以進行 linux web 開發了,好好玩耍 php 吧!

權限問題

在使用的過程中遇到的權限問題:

  • php 腳本執行 chmod 方法提示權限不足,參考 chmod WSL (Bash) doesn’t work,解決辦法:在該路徑下新建 /etc/wsl.conf,並輸入

[automount]
enabled = true
options = “metadata”

如何卸載

有幾種方式卸載這個子系統:

  • 在 『開始』 菜單找到 ubuntu 圖標,把鼠標放到上面右鍵顯示 『卸載』,直接卸載

  • 組合鍵

    win + x
    

    ,選擇 『運行』,輸入

    cmd
    

    進入 windows 命令行界面,分為兩種卸載:

    • 刪掉 ubuntu 系統以及下載安裝的組件,保留創建的賬戶信息,輸入 lxrun /uninstall
    • 刪掉 ubuntu 系統以及下載安裝的組件,不保留創建的賬戶信息,輸入 lxrun /unistall /full

遇到的一些報錯以及解決辦法

參考鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM