Windows 下启用 WSL2 搭建 PHP 开发环境

分类: 系统
日期: 2021-12-22
浏览: 1400

常年在 Windows 下做 PHP 开发,经历了很多痛苦,这个痛苦主要来自于 PHP 环境和开发工具。工欲善其事,必先利其器,就是这个“器”折磨了我很久。

其实在 Windows 下只做一些简单的 PHP 开发还是可以的,而且 Windows 下有很多一键安装包,省去了我们搭建环境的麻烦和时间,此前我一直使用的就是 Laragon,自由灵活,墙裂推荐。但是比如 Redis 高版本之后,就没有相应的 Windows 版本了,还有定时任务、异步队列等功能,在 Windows 下开发就变得举步维艰。

后来,我使用了很长一段时间的 VirtualBox + CentOS + PHP 的方案,这在一定程度上使得我的开发环境与正式环境基本能够保持一致。不过由于太耗性能,再加上 Windows 提供了更好的方案,就放弃了这种开发方式。

直到 WSL2 出现,我便彻底转到 WSL2 下开发了,而且 PhpStormWSL 支持的也很好,最关键的是 WSL2 既方便又轻量,对于我来说是作为开发环境的不二之选。

Windows 开启 WSL2

墙裂推荐使用 Windows terminal,与 WSL2 结合使用,简直是天作之合。

官方文档:适用于 Linux 的 Windows 子系统文档 | Microsoft Docs

新版安装方式
wsl --install

此命令将启用所需的可选组件,下载最新的 Linux 内核,将 WSL2 设置为默认值,并安装 Linux 发行版(默认安装 Ubuntu)。

更改默认安装的 Linux 发行版
查看可安装的 Linux 发行版
wsl -l -o
安装其它 Linux 发行版
wsl --install -d <Distribution Name>

<Distribution Name> 替换为要安装的发行版的名称。

等待安装完成,设置用户名和密码即可。

子系统安装在 %LOCALAPPDATA%\Packages 中,里面带有 Ubuntu 的文件夹就是了。

资环管理器访问也极为方便,微软果然在 Linux 的道路上越走越远,难怪大家都说 Windows 是 Linux 最好的发行版🤣。

准备

使用 Windows terminal 进入 Ubuntu 后,还有一些准备工作要做。

因为个人很喜欢用 oh-my-zsh 所以所有的设置都是在 ~/.zshrc 中,如果不使用 zsh 的话,把 ~/.zshrc 换成 ~/.bashrc 即可!

设置普通用户 sudo 不需要输入密码

不然每次使用 sudo 都要输入密码,实在太烦了。

sudo vim /etc/sudoers
# %sudo ALL=(ALL:ALL) ALL 这里注释掉,新增下面一条
%sudo   ALL=(ALL:ALL) NOPASSWD:ALL

使用 wq! 强制保存

更换镜像

  1. 阿里云 Ubuntu 镜像

  2. 中国科技大学 Ubuntu 镜像

  3. 清华大学 Ubuntu 镜像

此处以阿里云镜像为例,使用以下命令快速更换

sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

或者手动编辑文件

sudo vim /etc/apt/sources.list

清空原来的内容(非 insert 状态下,连续按 D 键,可以逐行删除),添加以下内容

deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

更新软件

sudo apt update

sudo apt list --upgradable

sudo apt upgrade -y

安装必要的软件

sudo apt install -y zip unzip curl gnupg2 ca-certificates lsb-release ubuntu-keyring

安装 Nginx

安装 Ubuntu 发行的 Nginx
sudo apt install -y nginx

个人不喜欢 Ubuntu 发行的 Nginx 的目录结构,另外使用 Nginx 官方提供的安装方式,可以保持 Ubuntu 和 CentOS 下 Nginx 的一致性。

使用官网提供的方式安装 Nginx

官方文档:http://nginx.org/en/linux_packages.html#Ubuntu

导入官方 Nginx 签名密钥
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
验证下载的文件是否包含正确的密钥
gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
设置 apt 仓库默认安装稳定版本的 Nginx
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list
设置 apt 存储库优先使用官方的包而不是 Ubuntu 提供的包
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx
执行安装
sudo apt update
sudo apt install nginx

安装 PHP

全文以 8.1 为例,若要安装其它版本,只需将 8.1 换为相应版本即可,若要安装多个 PHP 版本,只需重复执行安装即可。需要注意的是 PHP cli 会默认使用最新安装的 PHP 版本。

# 添加 PHP 的 PPA 源
sudo add-apt-repository ppa:ondrej/php

# PPA 源改为中国科技大学的镜像
sudo sed -i "s/http:\/\/ppa.launchpad.net/https:\/\/launchpad.proxy.ustclug.org/g" /etc/apt/sources.list.d/*.list

# 更新 apt 存储库
sudo apt update

# 安装 PHP 8.1 扩展
sudo apt install -y php8.1-fpm php8.1-cli php8.1-bcmath php8.1-curl php8.1-gd php8.1-mbstring php8.1-mysql php8.1-xml php8.1-zip php8.1-dev

安装 MySQL

执行安装
sudo apt install -y mysql-server-8.0
MySQL 启动报错
sudo usermod -d /var/lib/mysql/ mysql
启动 MySQL
sudo service mysql start
查看 MySQL 初始密码
sudo cat /etc/mysql/debian.cnf
登录 MySQL
mysql -u debian-sys-maint -p
修改密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '你的密码';

FLUSH PRIVILEGES;

使用 Navicat 连接 MySQL 直接用 127.0.0.1 连接,不要使用 localhost 连接

安装 Redis

官方文档:https://redis.io/download

# 添加 Redis 的 PPA 源
sudo add-apt-repository ppa:redislabs/redis

# PPA 源改为中国科技大学的镜像
sudo sed -i "s/http:\/\/ppa.launchpad.net/https:\/\/launchpad.proxy.ustclug.org/g" /etc/apt/sources.list.d/*.list

# 更新 apt 存储库
sudo apt update

# 安装 Redis
sudo apt install redis
安装 phpredis 扩展

安装多版本 PHP 扩展,如果使用 sudo pecl -d install redis 直接安装,新安装的扩展会覆盖前面安装的扩展,导致在使用前面安装的 PHP 版本时会报错。

sudo pecl -d php_suffix=8.1 install redis
安装 swoole 扩展
sudo pecl -d php_suffix=8.1 install swoole

启用扩展

此处以 PHP8.1 为例,启用 redis 扩展。

sudo su
printf "; priority=20\nextension=redis.so\n" > /etc/php/8.1/mods-available/redis.ini
printf "; priority=20\nextension=swoole.so\n" > /etc/php/8.1/mods-available/swoole.ini
exit
sudo phpenmod -v 8.1 redis swoole

安装composer

下载安装文件
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
下载 composer.phar 文件
php composer-setup.php
删除安装文件
php -r "unlink('composer-setup.php');"
全局安装(推荐)
sudo mv composer.phar /usr/local/bin/composer
更换中国镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer

升级 Git 到最新版

# 添加 Git 的 PPA 源
sudo add-apt-repository ppa:git-core/ppa

# PPA 源改为中国科技大学的镜像
sudo sed -i "s/http:\/\/ppa.launchpad.net/https:\/\/launchpad.proxy.ustclug.org/g" /etc/apt/sources.list.d/*.list

# 更新 apt 存储库
sudo apt update

# 更新 Git
sudo apt upgrade -y

配置 Nginx 和 PHP

php-fpmNginx 和网站根目录都属于同一个用户(你的用户),避免各种读取、编辑、运行的权限问题。

创建 /var/www/html 目录(个人喜好)
sudo mkdir -p /var/www/html
修改所有者
sudo chown -R 你的用户名:你的用户名 /var/www/html
修改 Nginx 配置
sudo vim /etc/nginx/nginx.conf
user 你的用户名

修改 php-fpm 配置

sudo vim /etc/php/8.1/fpm/pool.d/www.conf
user = 你的用户名
group = 你的用户名

listen.owner = 你的用户名
listen.group = 你的用户名

Nginx 站点配置文件示例

fastcgi_buffering 设置为 off 是为了防止 WSL 死机。

fastcgi_pass 设置为该站点需要的 PHP 版本。

server {
    listen 80;
    server_name localhost;
    root /var/www/html;

    fastcgi_buffering off;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_buffering off;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

设置开机启动 Nginx、php-fpm、MySQL、Redis

vim ~/.zshrc

添加以下内容,如果同时安装了 PHP8.1PHP7.4 则将 php8.1-fpmphp7.4-fpm 都放到 services 中。

# 设置服务自启
services=(nginx php8.1-fpm php7.4-fpm mysql redis-server)
for service in "${services[@]}"
do
    if (( $(ps -ef | grep -v grep | grep $service | wc -l) == 0 ))
        then
        # Uncomment to get messages.
        # echo "Starting service ${service}"
        (sudo service $service start > /dev/null &)
    fi
done

重启终端,再次进入 Ubuntu 服务就会自动开启。PHP 开发环境到这就算基本完成了,当然这只是在 Windows 下搭建 PHP 开发环境的一种方案,也是我个人的喜好,你也可以在 WSL2 中安装宝塔面板一类的软件,或者是使用 docker 容器技术来搭建。总之,在 Windows 下搭建 PHP 开发环境有很多方案,没有最好的,只有最适合的。

顺便吐槽一句, PHP 要是和 Golang 开发和部署都一样方便就好了!😅

版权声明
作者:不二
来源:不二博客
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论
赶快发表评论吧~
发表评论