WSL2子系统安装CentOS8及源码编译Nginx1.18+PHP7.4+MySql8.0开发环境
一、WSL2 安装 CentOS8
在前文中介绍了 WSL(Windows Subsystem for Linux) 、在 Win10 中的安装与配置 WSL2。
首先安装配置完成 WSL2,然后 Ubuntu20 等 Linux 发行版在 Windows 应用商店(store)中直接点击安装即可。本人为了和线上服务器环境保持一致,想安装 CentOS8,但是 Windows 应用商店中却没有包含 CentOS。那么在安装好 WSL2 之后,如何不通过 store 而手动安装适配 WSL 的 Linux 发行版呢?
1、安装 Chocolatey
NuGet(读作New Get)是用于微软.NET开发平台的软件包管理器,是一个Visual Studio的扩展。Chocolatey 是基于 NuGet 的一个软件包管理器,就像 Linux 中的 yum 或 apt 一样,在 Windows10 中也可以用命令行安装程序了。
右键单击开始菜单,选择 Windows PowerShell(管理员),打开一个具有管理员权限的 PowerShell 窗口,输入命令并回车:
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
完成后,输入命令:choco ,如果能正确显示版本号,说明安装成功。
详情请查看官网文档安装说明
2、安装 LxRunOffline
LxRunOffline 是非常实用的 WSL 管理软件,可以备份、创建、恢复、导出WSL子系统,也可以安装适配 WSL 的任何 Linux 发行版,可以将 WSL 子系统安装到任意目录中。
在 PowerShell 窗口中输入命令安装LxRunOffline,安装完成后重启 PowerShell。
choco install lxrunoffline -y
3、下载 CentOS 镜像
GitHub 上有开源的适用于 WSL 的 CentOS 系统安装镜像,打开项目页面,选择 CentOS8 分支,进入 docker 目录,下载文件 centos-8-x86_64.tar.xz ,假如下载后保存在 D 盘下。
https:// github.com/CentOS/sig-c loud-instance-images/tree/CentOS-8-x86_64/
4、安装 CentOS 镜像
安装WSL子系统的命令行格式为:
LxRunOffline install -n 自定义系统名称 -d 安装目录路径 -f 安装包路径.tar.xz
重新启动 PowerShell,输入命令安装 CentOS 镜像:
LxRunOffline install -n centos -d C:/centos -f D:\centos-8-x86_64.tar.xz
表示将 CentOS 系统安装到 C 盘的 centos 文件夹下,并且命名为 centos。 注意: Windows 系统命令行中的文件路径和 Linux 系统不同,这里安装目录 C:/ 要用 Linux 方式的反斜线表示,是为了 WSL 使用;而安装包路径 D:\ 是为了 LxRunOffline 使用,是 Windows 下的路径。
查看所有已安装镜像,能够显示已安装的 centos ,表示安装成功。
LxRunOffline.exe list
如果安装失败也会出现 centos 目录,安装失败重新安装时需要卸载镜像,另外安装目录在 C 盘在卸载时可能存在权限问题,卸载后如果目录没有删除可以手动删除目录。
卸载 WSL 系统镜像命令:
LxRunOffline.exe uninstall -n centos
5、升级为 WSL2
输入命令并回车,列出已经安装的 WSL 的信息
wsl -l -v
将对应的 WSL 发行版设为 WSL2,命令格式:
wsl --set-version <Distro> 2
其中<Distro>要和上面查询到的信息一致,本例中为 centos,输入以下命令并回车:
wsl --set-version centos 2
输入以下命令并回车,设置默认使用的发行版:
wsl -d centos
此时,再次使用命令 wsl -l -v 查看,可以看到 centos 的 VERSION 已经变为 2,并且名称前加了*号(即默认的WSL系统)。
6、WSL 子系统的启动与关闭
此时,输入命令 wsl -d centos 即可启动。
停止WSL子系统命令:wsl --shutdown -n 系统名称,如果直接输入 wsl --shutdown ,会停止所有已启动的 WSL 子系统。
在管理员权限的 PoweShell 中输入命令: net stop LxssManager ,也可以停止 WSL 子系统。
7、使用 Windows Terminal
当然,为了更好的配合 WSL ,一定要安装 Windows Terminal。
有了 Terminal ,可以直接打开所有已安装的 WSL 发行版:
Terminal 的配色方案,可以参考: http:// iterm2colorschemes.com
8、目录设置
在 WSL2 系统中可以直接访问 windows 磁盘文件,因此为了不增加 WSL系统 VHD 虚拟磁盘空间,我个人打算将一些安装软件包放在 F:\wsl 目录下,将网站web程序放在 E:\wwwroot 目录中。而在 wsl 系统中的访问路径分别是 /mnt/f/wsl 和 /mnt/e/wwwroot ,当然 WSL 这样直接访问 windows 磁盘会有很大的性能问题。后续使用中如果性能的降低超过了可忍受的程度,再考虑将这两个目录移动到 wsl 的虚拟磁盘。
打开 Windows 安全中心,病毒和威胁防护设置,管理设置,添加或删除排除项,添加排除项,将上述两个目录排除,这样会减少 windows 的系统性能占用。
二、centos8 基本配置
1、查看 centos 版本
uname -a
cat /proc/version
cat /etc/redhat-release
2、安装 wget vim 等工具
cd ~ #转到用户目录
dnf -y install vim wget
dnf -y install net-tools #启用 ifconfig,netstat 等网络 命令
3、更换国内源
(1) 备份原始的yum源
cd /etc/yum.repos.d
mv CentOS-Base.repo CentOS-Base.repo.bak
mv CentOS-extras.repo CentOS-extras.repo.bak
mv CentOS-centosplus.repo CentOS-centosplus.repo.bak
mv CentOS-PowerTools.repo CentOS-PowerTools.repo.bak
mv CentOS-AppStream.repo CentOS-AppStream.repo.bak
(2) 下载对应版本的repo文件
# wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
vim CentOS-Base.repo
可以看到 aliyun 的源包含的以下各项:[base] [extras] [centosplus] [PowerTools] [AppStream] ,因此前面对这些源都做了备份。
(3) 清除旧的缓存并生成新的缓存
# dnf clean all
# dnf makecache
三、源码编译安装 Nginx
1、安装编译工具及库文件:
如果缺少某个库文件,在编译时会给出错误提示,可按提示安装缺失的库文件,然后重新进行编译。
dnf -y install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
gcc 是是GNU开发的C,C++和Java等多种语言的编译器。
pcre pcre-devel 是一个 perl 库,包括 perl 兼容的正则表达式库,Nginx 的 Rewrite 模块和HTTP 核心模块会使用到 PCRE 来解析正则表达式语法。
zlib zlib-devel 库提供了很多种压缩和解压缩方式,Nginx 启用压缩功能后,将使用 zlib 对 http 包的内容进行 gzip 压缩。
openssl openssl-devel 是实现了SSL协议的开源项目,可以实现秘钥证书管理、对称加密和非对称加密 。用 SSL 加密的安全数据传输通道,保证客户端和服务器之间数据的安全。简单的说就是浏览器以 https 开头的网址访问网站,浏览器和服务器之间数据加密传输。当 Nginx 开启SSL功能后需要此模块的支持。
2、下载并解压:
打开 nginx 官网 ,可以看到当前最新版本是 nginx-1.19.1 ,下载 nginx-1.19.1.tar.gz 文件并解压。
cd /mnt/f/wsl #此目录是我个人存放各种安装包的目录,也就是 win10 的 F 盘 wsl 目录。
wget http://nginx.org/download/nginx-1.19.1.tar.gz
tar -zxvf nginx-1.19.1.tar.gz
3、开始编译
cd nginx-1.19.1
./configure
检查系统环境是否符合编译安装的要求,比如是否有gcc编译工具,是否支持编译参数当中的模块,并根据开启的参数等生成Makefile文件为下一步做准备。
make && make install
生成脚本及配置文件,根据Makefile文件生成相应的模块,安装,创建目录,并将生成的模块和文件复制到相应的目录。
4、等待安装完成
如果没有错误提示,默认安装目录是:/usr/local/nginx,现在可以查看版本,能正确显示版本,说明安装完成。
/usr/local/nginx/sbin/nginx -V
5、添加软链接
由于 WSL 不能使用 systemd ,使用 service 时会出现错误提示,这里不注册为 service ,而是使用软链接的方式省略执行 nginx 命令的路径前缀。
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
nginx #启动服务
nginx -s reload #不停止服务重新载入配置文件
nginx -s stop #停止服务
6、配置
创建 Nginx 运行用户及用户组 www ,先停止服务再编辑 nginx.conf 文件
groupadd www
useradd -g www www
mkdir -p /data/wwwlogs
chown -R www:www /data/wwwlogs
nginx -s stop #停止服务
vim /usr/local/nginx/conf/nginx.conf
参考了集成环境 OneinStack 中的配置。默认 user 为 nobody ,修改为 www 。将网站放在 /mnt/e/wwwroot 路径中,即 Win10 本地 E 盘 wwwroot 目录。
fastcgi_pass unix:/dev/shm/php-cgi.sock; 表示 Nginx 和 PHP-FPM 的进程间采用UNIX Domain Socket 方式通信,因此在 PHP-FPM 的配置文件中也要做相应的配置。
最后自动加载 vhost 目录中的配置文件,完整内容如下:
user www www;
worker_processes auto;
error_log /data/wwwlogs/error_nginx.log crit;
pid /var/run/nginx.pid;
worker_rlimit_nofile 51200;
events {
use epoll;
worker_connections 51200;
multi_accept on;
http {
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 1024m;
client_body_buffer_size 10m;
sendfile on;
tcp_nopush on;
keepalive_timeout 120;
server_tokens off;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_intercept_errors on;
#Gzip Compression
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
text/javascript application/javascript application/x-javascript
text/x-json application/json application/x-web-app-manifest+json
text/css text/plain text/x-component
font/opentype application/x-font-ttf application/vnd.ms-fontobject
image/x-icon;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
######################## default ############################
server {
listen 80;
server_name _;
access_log /data/wwwlogs/access_nginx.log combined;
root /mnt/e/wwwroot/default;
index index.html index.htm index.php;
#error_page 404 /404.html;
#error_page 502 /502.html;
#location /nginx_status {
# stub_status on;
# access_log off;
# allow 127.0.0.1;
# deny all;
location ~ [^/]\.php(/|$) {
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
expires 30d;
access_log off;
location ~ .*\.(js|css)?$ {
expires 7d;
access_log off;
location ~ ^/(\.user.ini|\.ht|\.git|\.svn|\.project|LICENSE|README.md) {
deny all;
########################## vhost #############################
include vhost/*.conf;
}
错误提示:
unknown directive "stub_status" in /usr/local/nginx/conf/nginx.conf:64
stub_status模块主要用于查看Nginx的一些状态信息,默认不会编译进Nginx,在配置文件中就不能有stub_status 相关配置信息。
7、测试
启动命令:nginx ,没有出现任何提示。
查看端口服务是否开启
netstat -lnt|grep 80
打开浏览器
输入 http://localhost 或者 http://127.0.0.1,然后回车
如果出现 Welcome to nginx! 页面,说明 WSL 及 Nginx 服务器运行正常。
四、源码安装 MySql8.0
1、下载 MySql8.0
打开mysql官网,社区版下载页,当前最新版本是 8.0.21,操作系统选择 Linux-Generic ,这里根据自己的系统选择下载文件:mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz,即 x86 架构 64位版本。
http:// dev.mysql.com/downloads /mysql
点击 Download 后,转到文件链接页,在 No thanks,just start my download. 上右键,选择复制链接,在 Centos 中下载链接文件:
cd /mnt/f/wsl #此目录是我个人存放各种安装包的目录,也就是 win10 的 F 盘 wsl 目录。
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz
2、解压并配置相关目录与权限
解压之后,将解压出的目录移动到 /usr/local/ 下并改名为 mysql,切换到 /usr/local/mysql 目录,创建 data 目录,再在根目录下创建 /data/mysql 目录。目录路径可以按自己的需要创建。
tar -xvf mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz
mv mysql-8.0.21-linux-glibc2.12-x86_64 /usr/local/mysql
cd /usr/local/mysql
mkdir data
mkdir -p /data/mysql
创建用户组 mysql ,给用户组添加用户 mysql,并给相应的目录权限。
groupadd mysql
useradd -g mysql mysql
chown -R mysql:mysql /usr/local/mysql/
chown -R mysql:mysql /data/mysql
3、初始化 MySql
添加需要的库文件
dnf install libaio numactl initscripts -y
初始化,参数要和前面创建的用户及目录对应。
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
执行结束会生成数据库root用户密码,做好记录。( A temporary password is generated for root@localhost: Zlg+oqdhy9i=)
如果执行失败,需要删除 data 和 tmp 目录下所有内容,根据错误提示,检查配置后重新执行初始化。
4、创建并配置 my.cnf 文件
touch /etc/my.cnf
vim /etc/my.cnf
my.cnf 参考了集成环境 OneinStack 中的配置,内容如下。同样,my.cnf 配置文件中的目录路径也要和前面mysql初始化时的一致。
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4
[mysql]
prompt="MySQL [\d]> "
no-auto-rehash
[mysqld]
port = 3306
socket = /tmp/mysql.sock
default_authentication_plugin = mysql_native_password
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
pid-file = /data/mysql/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
init-connect = 'SET NAMES utf8mb4'
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-name-resolve
#skip-networking
back_log = 300
max_connections = 1259
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 1024
max_allowed_packet = 500M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 128M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 8M
key_buffer_size = 256M
thread_cache_size = 64
ft_min_word_len = 4
log_bin = mysql-bin
binlog_format = mixed
binlog_expire_logs_seconds = 604800
log_error = /data/mysql/mysql-error.log
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/mysql-slow.log
performance_schema = 0
explicit_defaults_for_timestamp
#lower_case_table_names = 1
skip-external-locking
default_storage_engine = InnoDB
#default-storage-engine = MyISAM
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 1024M
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 64M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
interactive_timeout = 28800
wait_timeout = 28800
[mysqldump]
quick
max_allowed_packet = 500M
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
5、启动 MySql
/usr/local/mysql/support-files/mysql.server start
只创建软链接,不配置环境变量。因为使用 mysql 命令登录数据库,或使用 mysqldump 命令备份数据库,都不常用,要用的时候直接使用绝对路径。
ln -s /usr/local/mysql/support-files/mysql.server /usr/bin/mysqld
mysqld start #启动mysql
mysqld stop #停止mysql
netstat -lnt #查看已开放的端口
查看所有可用的命令参数
mysqld --help
Usage: mysqld {start|stop|restart|reload|force-reload|status} [ MySQL server options ]
6、修改密码
/usr/local/mysql/bin/mysql -uroot -p
#输入初始化时记录的密码
#登录后在命令提示符 MySQL [(none)]> 后,输入如下语句并回车
#(MySql语句要以;结束,password 修改成自己的新密码)
alter user 'root'@'localhost' identified by 'password';
exit #退出
7、安装过程中的报错及处理方法
/etc/redhat-lsb/lsb_log_message: line 3: /etc/init.d/functions: No such file or directory
解决方法是安装initscripts: dnf -y install initscripts
报错:
mysqld_safe error: log-error set to '/data/mysql/mysql-error.log', however file don't exists. Create writable for user 'mysql'.
解决方法是:创建此文件并给予 mysql 组和用户权限
echo "" > /data/mysql/mysql-error.log
chown -R mysql:mysql /data/mysql/mysql-error.log
如下报错也可以尝试用此方法解决
The server quit without updating PID file (/data/mysql/mysql.pid)
五、源码编译安装 php7.4
1、下载
打开PHP官网,看到当前最新版本是 7.4.9,由于官网国内下载很慢,找到一个国内的库,下载源码文件。
cd /mnt/f/wsl #此目录是我个人存放各种安装包的目录,也就是 win10 的 F 盘 wsl 目录。
wget http://mirrors.sohu.com/php/php-7.4.9.tar.xz
2、安装编译工具和库
dnf -y install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
在安装 Nginx 时就已经安装过编译工具和库,在检查配置编译参数时,提示缺少哪个就安装哪个库。
3、创建用户组和用户
如果在安装 Nginx 时已经创建过,就不用再重复创建了。
groupadd www
useradd -g www www
4、配置编译
解压缩,移动到 /usr/local/ 目录并重命名为 php,切换到 /usr/local/php 目录。
tar -xvf php-7.4.9.tar.xz
mv php-7.4.9 /usr/local/php
查看已安装的 php 编译参数命令是:
php -i|grep configure
以下编译参数来源于 oneinstack 集成包,复制以下所有内容到 CentOS 命令行窗口,回车,开始检查配置。
./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-config-file-scan-dir=/usr/local/php/etc/php.d \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-fpm \
--enable-opcache \
--disable-fileinfo \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-iconv-dir=/usr/local/libiconv \
--with-freetype \
--with-jpeg \
--with-zlib \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-exif \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl=/usr/local/curl \
--enable-mbregex \
--enable-mbstring \
--with-password-argon2 \
--with-sodium=/usr/local \
--enable-gd \
--with-openssl=/usr/local/openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-ftp \
--enable-intl \
--with-xsl \
--with-gettext \
--with-zip=/usr/local \
--enable-soap \
--disable-debug \
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/:
一遍遍执行上述检查配置,根据报错 error 或类似 not found 类,解决错误。直到出现如下所示:Thank you for using PHP
5、安装完成
make && make install
6、报错及解决
- 报错
configure: error: C++ preprocessor "/lib/cpp" fails sanity check
解决方法:
dnf -y install glibc-headers gcc-c++
- 报错:
Package 'libxml-2.0', required by 'virtual:world', not found
Package 'sqlite3', required by 'virtual:world', not found
Package 'libcurl', required by 'virtual:world', not found
Package 'libpng', required by 'virtual:world', not found
Package 'libjpeg', required by 'virtual:world', not found
Package 'freetype', required by 'virtual:world', not found
Package 'icu-uc', required by 'virtual:world', not found
Package 'libsodium', required by 'virtual:world', not found
解决方法:
dnf -y install libxml2-devel sqlite-devel libcurl-devel libpng-devel libjpeg-devel freetype-devel libicu-devel
- 报错:
Package 'oniguruma', required by 'virtual:world', not found
oniguruma是一个处理正则表达式的库
解决方法:
wget https://github.com/kkos/oniguruma/archive/v6.9.4.tar.gz -O oniguruma-6.9.4.tar.gz
tar -zxvf oniguruma-6.9.4.tar.gz
cd oniguruma-6.9.4/
./autogen.sh && ./configure --prefix=/usr
报错
Generating autotools files.
./autogen.sh: line 6: autoreconf: command not found
解决方法:
dnf -y install autoconf automake libtool
再次检查配置,没有问题了,再生成脚本及配置文件,安装。
./autogen.sh && ./configure --prefix=/usr
make && make install
- 报错:
configure: error: Package requirements (libsodium >= 1.0.8) were not met:
Package 'libsodium', required by 'virtual:world', not found
解决方法:
Sodium 是一个全新而且易用的加密库,用于加密、解密、签名和生成密码哈希等等。
wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.18-stable.tar.gz
tar -zxf libsodium-1.0.18-stable.tar.gz
cd libsodium-stable
./configure --prefix=/usr
make && make install
ldconfig
- 报错:
checking for Argon2 library... not found
configure: error: Please ensure the argon2 header and library are installed
解决方法:
打开 http:// pkgs.org ,查找 libargon2 ,找到 centos8 的rpm包,下载安装。
wget https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/l/libargon2-20171227-3.el8.x86_64.rpm
wget https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/l/libargon2-devel-20171227-3.el8.x86_64.rpm
rpm -Uvh libargon2-20171227-3.el8.x86_64.rpm
rpm -Uvh libargon2-devel-20171227-3.el8.x86_64.rpm
dnf -y install libargon2 libargon2-devel
- 报错:
configure: error: Package requirements (libxslt >= 1.1.0) were not met:
Package 'libxslt', required by 'virtual:world', not found
解决方法:
dnf -y install libxslt libxslt-devel
- 报错:
Failed to set locale, defaulting to C.UTF-8
error: rpmdb: BDB2034 unable to allocate memory for mutex; resize mutex region
error: cannot open Packages index using db5 - Cannot allocate memory (12)
error: cannot open Packages database in /var/lib/rpm
Error: Error: rpmdb open failed
解决方法:
一般是由于rpm本地数据库损坏导致的。
cd /var/lib/rpm # rpm db所在目录
ls | grep 'db.' # 列出相关rpm db文件
rm -f __db.* # 清除原rpmdb文件
rpm --rebuilddb # 重建rpm数据库
yum clean all
dnf makecache
- 报错:
Package 'libzip', required by 'virtual:world', not found
解决方法:
打开 http:// pkgs.org ,查找 libzip 及 libzip-devel,找到 centos8 的rpm包,下载安装。
wget http://mirror.centos.org/centos/8/AppStream/x86_64/os/Packages/libzip-1.5.2-1.module_el8.2.0+314+53b99e08.x86_64.rpm
wget http://mirror.centos.org/centos/8/AppStream/x86_64/os/Packages/libzip-devel-1.5.2-1.module_el8.2.0+314+53b99e08.x86_64.rpm
rpm -Uvh libzip-1.5.2-1.module_el8.2.0+314+53b99e08.x86_64.rpm
rpm -Uvh libzip-devel-1.5.2-1.module_el8.2.0+314+53b99e08.x86_64.rpm
dnf -y install libzip libzip-devel
7、配置
生成 php 配置文件
cp php.ini-production /usr/local/php/etc/php.ini
在编译时启用了参数:--enable-opcache ,查找 opcache.so模块文件所在路径。
find /usr -name opcache.so
###输出###
/usr/local/php/ext/opcache/.libs/opcache.so
/usr/local/php/lib/php/extensions/debug-non-zts-20190902/opcache.so
/usr/local/php/modules/opcache.so
编辑 php.ini 文件,在末尾添加如下内容,开启 OPcache 扩展
[opcache]
zend_extension=/usr/local/php/modules/opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.file_cache=/tmp/opcache
生成 php-fpm 配置文件并编辑。
cd /usr/local/php/etc
cp php-fpm.conf.default php-fpm.conf
vim php-fpm.conf
这里还是参考 OneInStack 集成环境包中的配置,清空 php-fpm.conf 内容,修改如下:
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;
[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = warning
emergency_restart_threshold = 30
emergency_restart_interval = 60s
process_control_timeout = 5s
daemonize = yes
;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;
[www]
listen = /dev/shm/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 50
pm.start_servers = 30
pm.min_spare_servers = 20
pm.max_spare_servers = 50
pm.max_requests = 2048
pm.process_idle_timeout = 10s
request_terminate_timeout = 120
request_slowlog_timeout = 0
pm.status_path = /php-fpm_status
slowlog = var/log/slow.log
rlimit_files = 51200
rlimit_core = 0
catch_workers_output = yes
;env[HOSTNAME] = aliyun-wxy
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
本配置文件指定了 PHP-FPM 进程通信方式:listen = /dev/shm/php-cgi.sock,和 Nginx 的配置保持了一致。
生成 php-fpm 服务启动文件:(新的文件名不能有 - 字符)
cp /usr/local/php/sapi/fpm/init.d.php-fpm /usr/bin/phpfpm
chmod 740 /usr/bin/phpfpm
测试启动php-fpm
phpfpm start
phpfpm restart
phpfpm stop
查看 php 已启用的模块:
php -m
查看 php 版本
/usr/local/php/bin/php -v
php -v
8、安装配置 Xdebug
OPcache 扩展是 PHP7.X 自带的,只要在编译时开启,就可以配置使用。而 Xdebug 需要另外安装。参考 xdebug 官网文档。
yum install -y git
git clone git://github.com/xdebug/xdebug.git
cd xdebug
phpize
./configure --enable-xdebug
make && make install
Xdebug编译完成后显示扩展文件目录、提示将扩展添加到 php.ini文件
编辑 php.ini ,在末尾增加 xdebug.so扩展。
vim /usr/local/php/etc/php.ini
####增加xdebug.so扩展###
zend_extension="/usr/local/php/lib/php/extensions/debug-non-zts-20190902/xdebug.so"
重启 php-fpm ,检查 php 扩展
/usr/bin/php-fpm restart
php -m
六、LNMP 环境测试
1、Nginx 和 PHP-FPM 的配合
Nginx 和 PHP-FPM 的进程间通信有两种方式,一种是TCP,另一种是 UNIX Domain Socket。
其中 TCP 方式是 IP 加端口,可以跨服务器。而 UNIX Domain Socket 不经过网络,只能用于Nginx 跟 PHP-FPM 都在同一服务器的场景。不管用哪种方式在 Nginx 和 PHP-FPM 配置时要统一。
方式1: TCP
php-fpm.conf 文件配置: listen = 127.0.0.1:9000
nginx.conf 文件配置: fastcgi_pass 127.0.0.1:9000;
方式2: UNIX Domain Socket
php-fpm.conf 文件配置: listen = /tmp/php-fpm.sock
nginx.conf 文件配置: fastcgi_pass unix:/tmp/php-fpm.sock;
其中 php-fpm.sock 是一个文件,由 php-fpm 生成,如果在 php-fpm.conf 配置文件中指定的用户和组是 www ,确保 /tmp/php-fpm.sock 的权限是 www:www。
2、测试 phpinfo 文件
在浏览器中打开内容为 phpinfo() 函数的 PHP 文件,如果 nginx 出现错误,则说明 php 无法配合 Nginx 运行, 请查看 nginx 错误日志。
vim /data/wwwlogs/error_nginx.log
phpinfo 显示了编译参数、 php.ini 的文件位置、已开启OPcache 及 Xdebug 扩展等信息
3、phpMyAdmin
下载 phpMyAdmin 并解压到 /mnt/e/wwwroot/default 目录,即 Nginx 配置文件中指定的默认网站目录。在浏览器中打开 localhost/phpMyAdmin/ ,如果能顺利登录数据库,则说明不但 Nginx 和 php 没有问题,而且 Mysql 也没有问题。至此,Nginx php Mysql 已经完全能配合运行了。
4、关于开机自动启动服务
通常在 Linux 中开机启动可以通过编辑/etc/rc.loacl 文件、在/etc/init.d/ 下添加启动脚本或者配置systemd 实现,但是关于由于 WSL 架构的特殊性,并且不支持 systemd ,这几种方式在 WSL 子系统中无法使用。而在 Windows 中用 VBS 脚本结合 WSL 命令的实现开机启动的方式似乎存在不能使用 LocalHost 地址访问子系统的问题。总之,暂时还是手动启动吧。
如前述,已安装的 Nginx、PHP、MySql 启动及停止命令总结如下:
nginx #启动nginx服务
phpfpm start #启动php-fpm服务
mysqld start #启动mysql
nginx -s reload #不停止服务重新载入配置文件
nginx -s stop #停止服务