windows下使用Linux子系統

在 Windows 上進行 web 開發,比較普遍的方案是使用 phpstudy 或者別的一些集成環境軟件進行環境搭建,寫好代碼後將代碼上傳至版本管理工具 git/svn,再將代碼同步到 Linux 服務器,這個過程當中開發者的開發環境(Windows)與代碼最終執行的環境(Linux)不一致經常會導致一些奇奇怪怪的問題,想在 Windows 上進行 linux 下的 web 開發,不想用 mac(畢竟沒錢買 mac),又不想使用虛擬機(虛擬機開機速度慢,添加站點需要重啓,分配內存會導致機器變得卡頓),這時候,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
報錯

  • Starting OpenBSD Secure Shell server sshd Could not load host key: /etc/ssh/ssh_host_rsa_key
    Could not load host key: /etc/ssh/ssh_host_dsa_key

Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key

執行:ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key

接下來就可以使用 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/c、mnt/d、mnt/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 吧!

如何卸載

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

在 『開始』 菜單找到 ubuntu 圖標,把鼠標放到上面右鍵顯示 『卸載』,直接卸載
組合鍵win + x,選擇 『運行』,輸入 cmd 進入 windows 命令行界面,分爲兩種卸載:
刪掉 ubuntu 系統以及下載安裝的組件,保留創建的賬戶信息,輸入 lxrun /uninstall
刪掉 ubuntu 系統以及下載安裝的組件,不保留創建的賬戶信息,輸入 lxrun /unistall /full

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章