在前面的文章中介紹了 WSL(Win-dows Sub-sys-tem for Linux) 、在 Win10 中的安裝與配置 WSL2。
WSL2——Windows10 V2004版安裝配置第二代Linux的Windows子系統(tǒng)
如文中所示,首先安裝配置完成 WSL2,然后 Ubuntu20 等 Linux 發(fā)行版在 Windows 應(yīng)用商店(store)中直接點(diǎn)擊安裝即可。本人為了和線上服務(wù)器環(huán)境保持一致,想安裝 CentOS8,但是 Windows 應(yīng)用商店中卻沒(méi)有包含 CentOS。那么在安裝好 WSL 之后,如何不通過(guò) store 而手動(dòng)安裝適配 WSL 的 Linux 發(fā)行版呢?
1、安裝 Chocolatey
NuGet(讀作New Get)是用于微軟.NET開發(fā)平臺(tái)的軟件包管理器,是一個(gè)Visual Studio的擴(kuò)展。Chocolatey 是基于 NuGet 的一個(gè)軟件包管理器,就像 Linux 中的 yum 或 apt 一樣,在 Windows10 中也可以用命令行安裝程序了。
右鍵單擊開始菜單,選擇 Windows PowerShell(管理員),打開一個(gè)具有管理員權(quán)限的 PowerShell 窗口,輸入命令并回車:
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
完成后,輸入命令:choco ,如果能正確顯示版本號(hào),說(shuō)明安裝成功。
官網(wǎng)文檔:https://chocolatey.org/docs/installation
2、安裝 LxRunOffline
LxRunOffline 是非常實(shí)用的 WSL 管理軟件,可以備份、創(chuàng)建、恢復(fù)、導(dǎo)出WSL子系統(tǒng),也可以安裝適配 WSL 的任何 Linux 發(fā)行版,可以將 WSL 子系統(tǒng)安裝到任意目錄中。
在 PowerShell 窗口中輸入命令安裝LxRunOffline,安裝完成后重啟 PowerShell。
choco install lxrunoffline -y
3、下載 CentOS 鏡像
GitHub 上有開源的適用于 WSL 的 CentOS 系統(tǒng)安裝鏡像,打開項(xiàng)目頁(yè)面,選擇 CentOS8 分支,進(jìn)入 docker 目錄,下載文件 centos-8-x86_64.tar.xz ,假如下載后保存在 D 盤下。
https://github.com/CentOS/sig-cloud-instance-images/tree/CentOS-8-x86_64/dockergithub.com
4、安裝 CentOS 鏡像
安裝WSL子系統(tǒng)的命令行格式為:
LxRunOffline install -n 自定義系統(tǒng)名稱 -d 安裝目錄路徑 -f 安裝包路徑.tar.xz
重新啟動(dòng) PowerShell,輸入命令安裝 CentOS 鏡像:
LxRunOffline install -n centos -d C:/centos -f D:\centos-8-x86_64.tar.xz
表示將 CentOS 系統(tǒng)安裝到 C 盤的 centos 文件夾下,并且命名為 centos。注意:Windows 系統(tǒng)命令行中的文件路徑和 Linux 系統(tǒng)不同,這里安裝目錄 C:/ 要用 Linux 方式的反斜線表示,是為了 WSL 使用;而安裝包路徑 D:\ 是為了 LxRunOffline 使用,是 Windows 下的路徑。
查看所有已安裝鏡像,能夠顯示已安裝的 centos ,表示安裝成功。
LxRunOffline.exe list
如果安裝失敗也會(huì)出現(xiàn) centos 目錄,安裝失敗重新安裝時(shí)需要卸載鏡像,另外安裝目錄在 C 盤在卸載時(shí)可能存在權(quán)限問(wèn)題,卸載后如果目錄沒(méi)有刪除可以手動(dòng)刪除目錄。
卸載 WSL 系統(tǒng)鏡像命令:
LxRunOffline.exe uninstall -n centos
5、升級(jí)為 WSL2
輸入命令并回車,列出已經(jīng)安裝的 WSL 的信息
wsl -l -v
將對(duì)應(yīng)的 WSL 發(fā)行版設(shè)為 WSL2,命令格式:
wsl --set-version <Distro> 2
其中<Distro>要和上面查詢到的信息一致,本例中為 centos,輸入以下命令并回車:
wsl --set-version centos 2
輸入以下命令并回車,設(shè)置默認(rèn)使用的發(fā)行版:
wsl -d centos
此時(shí),再次使用命令 wsl -l -v 查看,可以看到 centos 的 VERSION 已經(jīng)變?yōu)?2,并且名稱前加了*號(hào)(即默認(rèn)的WSL系統(tǒng))。
6、WSL 子系統(tǒng)的啟動(dòng)與關(guān)閉
此時(shí),輸入命令 wsl -d centos 即可啟動(dòng)。
停止WSL子系統(tǒng)命令:wsl --shutdown -n 系統(tǒng)名稱,如果直接輸入 wsl --shutdown ,會(huì)停止所有已啟動(dòng)的 WSL 子系統(tǒng)。
在管理員權(quán)限的 PoweShell 中輸入命令:net stop LxssManager ,也可以停止 WSL 子系統(tǒng)。
7、使用 Windows Terminal
當(dāng)然,為了更好的配合 WSL ,一定要安裝 Windows Terminal。
Windows10 安裝最新版 PowerShell 及 Windows Terminal 并美化
有了 Terminal ,可以直接打開所有已安裝的 WSL 發(fā)行版:
Terminal 的配色方案,可以參考:https://iterm2colorschemes.com/
8、目錄設(shè)置
在 WSL2 系統(tǒng)中可以直接訪問(wèn) windows 磁盤文件,因此為了不增加 WSL系統(tǒng) VHD 虛擬磁盤空間,我個(gè)人打算將一些安裝軟件包放在 F:\wsl 目錄下,將網(wǎng)站web程序放在 E:\wwwroot 目錄中。而在 wsl 系統(tǒng)中的訪問(wèn)路徑分別是 /mnt/f/wsl 和 /mnt/e/wwwroot ,當(dāng)然 WSL 這樣直接訪問(wèn) windows 磁盤會(huì)有很大的性能問(wèn)題。后續(xù)使用中如果性能的降低超過(guò)了可忍受的程度,再考慮將這兩個(gè)目錄移動(dòng)到 wsl 的虛擬磁盤。
打開 Windows 安全中心,病毒和威脅防護(hù)設(shè)置,管理設(shè)置,添加或刪除排除項(xiàng),添加排除項(xiàng),將上述兩個(gè)目錄排除,這樣會(huì)減少 windows 的系統(tǒng)性能占用。
1、查看 centos 版本
uname -a
cat /proc/version
cat /etc/redhat-release
2、安裝 wget vim 等工具
cd ~ #轉(zhuǎn)到用戶目錄
dnf -y install vim wget
dnf -y install net-tools #啟用 ifconfig,netstat 等網(wǎng)絡(luò) 命令
3、更換國(guó)內(nèi)源
(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) 下載對(duì)應(yīng)版本的repo文件
# wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
vim CentOS-Base.repo
可以看到 aliyun 的源包含的以下各項(xiàng):[base] [extras] [centosplus] [PowerTools] [AppStream] ,因此前面對(duì)這些源都做了備份。
(3) 清除舊的緩存并生成新的緩存
# dnf clean all
# dnf makecache
1、安裝編譯工具及庫(kù)文件:
如果缺少某個(gè)庫(kù)文件,在編譯時(shí)會(huì)給出錯(cuò)誤提示,可按提示安裝缺失的庫(kù)文件,然后重新進(jìn)行編譯。
dnf -y install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
gcc 是是GNU開發(fā)的C,C++和Java等多種語(yǔ)言的編譯器。
pcre pcre-devel 是一個(gè) perl 庫(kù),包括 perl 兼容的正則表達(dá)式庫(kù),Nginx 的 Rewrite 模塊和HTTP 核心模塊會(huì)使用到 PCRE 來(lái)解析正則表達(dá)式語(yǔ)法。
zlib zlib-devel 庫(kù)提供了很多種壓縮和解壓縮方式,Nginx 啟用壓縮功能后,將使用 zlib 對(duì) http 包的內(nèi)容進(jìn)行 gzip 壓縮。
openssl openssl-devel 是實(shí)現(xiàn)了SSL協(xié)議的開源項(xiàng)目,可以實(shí)現(xiàn)秘鑰證書管理、對(duì)稱加密和非對(duì)稱加密 。用 SSL 加密的安全數(shù)據(jù)傳輸通道,保證客戶端和服務(wù)器之間數(shù)據(jù)的安全。簡(jiǎn)單的說(shuō)就是瀏覽器以 https 開頭的網(wǎng)址訪問(wèn)網(wǎng)站,瀏覽器和服務(wù)器之間數(shù)據(jù)加密傳輸。當(dāng) Nginx 開啟SSL功能后需要此模塊的支持。
2、下載并解壓:
打開官網(wǎng) nginx: download,可以看到當(dāng)前最新版本是 nginx-1.19.1 ,下載 nginx-1.19.1.tar.gz 文件并解壓。
cd /mnt/f/wsl #此目錄是我個(gè)人存放各種安裝包的目錄,也就是 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
檢查系統(tǒng)環(huán)境是否符合編譯安裝的要求,比如是否有g(shù)cc編譯工具,是否支持編譯參數(shù)當(dāng)中的模塊,并根據(jù)開啟的參數(shù)等生成Makefile文件為下一步做準(zhǔn)備。
make && make install
生成腳本及配置文件,根據(jù)Makefile文件生成相應(yīng)的模塊,安裝,創(chuàng)建目錄,并將生成的模塊和文件復(fù)制到相應(yīng)的目錄。
4、等待安裝完成
如果沒(méi)有錯(cuò)誤提示,默認(rèn)安裝目錄是:/usr/local/nginx,現(xiàn)在可以查看版本,能正確顯示版本,說(shuō)明安裝完成。
/usr/local/nginx/sbin/nginx -V
5、添加軟鏈接
由于 WSL 不能使用 systemd ,使用 service 時(shí)會(huì)出現(xiàn)錯(cuò)誤提示,這里不注冊(cè)為 service ,而是使用軟鏈接的方式省略執(zhí)行 nginx 命令的路徑前綴。
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
nginx #啟動(dòng)服務(wù)
nginx -s reload #不停止服務(wù)重新載入配置文件
nginx -s stop #停止服務(wù)
6、配置
創(chuàng)建 Nginx 運(yùn)行用戶及用戶組 www ,先停止服務(wù)再編輯 nginx.conf 文件
groupadd www
useradd -g www www
mkdir -p /data/wwwlogs
chown -R www:www /data/wwwlogs
nginx -s stop #停止服務(wù)
vim /usr/local/nginx/conf/nginx.conf
參考了集成環(huán)境 OneinStack 中的配置。默認(rèn) user 為 nobody ,修改為 www 。將網(wǎng)站放在 /mnt/e/wwwroot 路徑中,即 Win10 本地 E 盤 wwwroot 目錄。
fastcgi_pass unix:/dev/shm/php-cgi.sock; 表示 Nginx 和 PHP-FPM 的進(jìn)程間采用UNIX Domain Socket 方式通信,因此在 PHP-FPM 的配置文件中也要做相應(yīng)的配置。
最后自動(dòng)加載 vhost 目錄中的配置文件,完整內(nèi)容如下:
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;
}
錯(cuò)誤提示:
unknown directive "stub_status" in /usr/local/nginx/conf/nginx.conf:64
stub_status模塊主要用于查看Nginx的一些狀態(tài)信息,默認(rèn)不會(huì)編譯進(jìn)Nginx,在配置文件中就不能有stub_status 相關(guān)配置信息。
7、測(cè)試
啟動(dòng)命令:nginx ,沒(méi)有出現(xiàn)任何提示。
查看端口服務(wù)是否開啟
netstat -lnt|grep 80
打開瀏覽器
輸入 http://localhost 或者 http://127.0.0.1,然后回車
如果出現(xiàn) Welcome to nginx! 頁(yè)面,說(shuō)明 WSL 及 Nginx 服務(wù)器運(yùn)行正常。
1、下載 MySql8.0
打開mysql官網(wǎng),社區(qū)版下載頁(yè),當(dāng)前最新版本是 8.0.21,操作系統(tǒng)選擇 Linux-Generic ,這里根據(jù)自己的系統(tǒng)選擇下載文件:mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz,即 x86 架構(gòu) 64位版本。
https://dev.mysql.com/downloads/mysql/dev.mysql.com
點(diǎn)擊 Download 后,轉(zhuǎn)到文件鏈接頁(yè),在 No thanks,just start my download. 上右鍵,選擇復(fù)制鏈接,在 Centos 中下載鏈接文件:
cd /mnt/f/wsl #此目錄是我個(gè)人存放各種安裝包的目錄,也就是 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、解壓并配置相關(guān)目錄與權(quán)限
解壓之后,將解壓出的目錄移動(dòng)到 /usr/local/ 下并改名為 mysql,切換到 /usr/local/mysql 目錄,創(chuàng)建 data 目錄,再在根目錄下創(chuàng)建 /data/mysql 目錄。目錄路徑可以按自己的需要?jiǎng)?chuàng)建。
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
創(chuàng)建用戶組 mysql ,給用戶組添加用戶 mysql,并給相應(yīng)的目錄權(quán)限。
groupadd mysql
useradd -g mysql mysql
chown -R mysql:mysql /usr/local/mysql/
chown -R mysql:mysql /data/mysql
3、初始化 MySql
添加需要的庫(kù)文件
dnf install libaio numactl initscripts -y
初始化,參數(shù)要和前面創(chuàng)建的用戶及目錄對(duì)應(yīng)。
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
執(zhí)行結(jié)束會(huì)生成數(shù)據(jù)庫(kù)root用戶密碼,做好記錄。( A temporary password is generated for root@localhost: Zlg+oqdhy9i=)
如果執(zhí)行失敗,需要?jiǎng)h除 data 和 tmp 目錄下所有內(nèi)容,根據(jù)錯(cuò)誤提示,檢查配置后重新執(zhí)行初始化。
4、創(chuàng)建并配置 my.cnf 文件
touch /etc/my.cnf
vim /etc/my.cnf
my.cnf 參考了集成環(huán)境 OneinStack 中的配置,內(nèi)容如下。同樣,my.cnf 配置文件中的目錄路徑也要和前面mysql初始化時(shí)的一致。
[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、啟動(dòng) MySql
/usr/local/mysql/support-files/mysql.server start
只創(chuàng)建軟鏈接,不配置環(huán)境變量。因?yàn)槭褂?mysql 命令登錄數(shù)據(jù)庫(kù),或使用 mysqldump 命令備份數(shù)據(jù)庫(kù),都不常用,要用的時(shí)候直接使用絕對(duì)路徑。
ln -s /usr/local/mysql/support-files/mysql.server /usr/bin/mysqld
mysqld start #啟動(dòng)mysql
mysqld stop #停止mysql
netstat -lnt #查看已開放的端口
查看所有可用的命令參數(shù)
mysqld --help
Usage: mysqld {start|stop|restart|reload|force-reload|status} [ MySQL server options ]
6、修改密碼
/usr/local/mysql/bin/mysql -uroot -p
#輸入初始化時(shí)記錄的密碼
#登錄后在命令提示符 MySQL [(none)]> 后,輸入如下語(yǔ)句并回車
#(MySql語(yǔ)句要以;結(jié)束,password 修改成自己的新密碼)
alter user 'root'@'localhost' identified by 'password';
exit #退出
7、安裝過(guò)程中的報(bào)錯(cuò)及處理方法
/etc/redhat-lsb/lsb_log_message: line 3: /etc/init.d/functions: No such file or directory
解決方法是安裝initscripts:dnf -y install initscripts
報(bào)錯(cuò):
mysqld_safe error: log-error set to '/data/mysql/mysql-error.log', however file don't exists. Create writable for user 'mysql'.
解決方法是:創(chuàng)建此文件并給予 mysql 組和用戶權(quán)限
echo "" > /data/mysql/mysql-error.log
chown -R mysql:mysql /data/mysql/mysql-error.log
如下報(bào)錯(cuò)也可以嘗試用此方法解決
The server quit without updating PID file (/data/mysql/mysql.pid)
1、下載
打開PHP官網(wǎng),看到當(dāng)前最新版本是 7.4.9,由于官網(wǎng)國(guó)內(nèi)下載很慢,找到一個(gè)souhu 的庫(kù),下載源碼文件。Index of /php/
cd /mnt/f/wsl #此目錄是我個(gè)人存放各種安裝包的目錄,也就是 win10 的 F 盤 wsl 目錄。
wget http://mirrors.sohu.com/php/php-7.4.9.tar.xz
2、安裝編譯工具和庫(kù)
dnf -y install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
在安裝 Nginx 時(shí)就已經(jīng)安裝過(guò)編譯工具和庫(kù),在檢查配置編譯參數(shù)時(shí),提示缺少哪個(gè)就安裝哪個(gè)庫(kù)。
3、創(chuàng)建用戶組和用戶
如果在安裝 Nginx 時(shí)已經(jīng)創(chuàng)建過(guò),就不用再重復(fù)創(chuàng)建了。
groupadd www
useradd -g www www
4、配置編譯
解壓縮,移動(dòng)到 /usr/local/ 目錄并重命名為 php,切換到 /usr/local/php 目錄。
tar -xvf php-7.4.9.tar.xz
mv php-7.4.9 /usr/local/php
查看已安裝的 php 編譯參數(shù)命令是:
php -i|grep configure
以下編譯參數(shù)來(lái)源于 oneinstack 集成包,復(fù)制以下所有內(nèi)容到 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/:
一遍遍執(zhí)行上述檢查配置,根據(jù)報(bào)錯(cuò) error 或類似 not found 類,解決錯(cuò)誤。直到出現(xiàn)如下所示:Thank you for using PHP
5、安裝完成
make && make install
6、報(bào)錯(cuò)及解決
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是一個(gè)處理正則表達(dá)式的庫(kù)
解決方法:
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
報(bào)錯(cuò)
Generating autotools files.
./autogen.sh: line 6: autoreconf: command not found
解決方法:
dnf -y install autoconf automake libtool
再次檢查配置,沒(méi)有問(wèn)題了,再生成腳本及配置文件,安裝。
./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 是一個(gè)全新而且易用的加密庫(kù),用于加密、解密、簽名和生成密碼哈希等等。
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
解決方法:
打開 https://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本地?cái)?shù)據(jù)庫(kù)損壞導(dǎo)致的。
cd /var/lib/rpm # rpm db所在目錄
ls | grep 'db.' # 列出相關(guān)rpm db文件
rm -f __db.* # 清除原rpmdb文件
rpm --rebuilddb # 重建rpm數(shù)據(jù)庫(kù)
yum clean all
dnf makecache
Package 'libzip', required by 'virtual:world', not found
解決方法:
打開 https://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
在編譯時(shí)啟用了參數(shù):--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 文件,在末尾添加如下內(nèi)容,開啟 OPcache 擴(kuò)展
[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 集成環(huán)境包中的配置,清空 php-fpm.conf 內(nèi)容,修改如下:
;;;;;;;;;;;;;;;;;;;;;
; 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 進(jìn)程通信方式:listen = /dev/shm/php-cgi.sock,和 Nginx 的配置保持了一致。
生成 php-fpm 服務(wù)啟動(dòng)文件:(新的文件名不能有 - 字符)
cp /usr/local/php/sapi/fpm/init.d.php-fpm /usr/bin/phpfpm
chmod 740 /usr/bin/phpfpm
測(cè)試啟動(dòng)php-fpm
phpfpm start
phpfpm restart
phpfpm stop
查看 php 已啟用的模塊:
php -m
查看 php 版本
/usr/local/php/bin/php -v
php -v
8、安裝配置 Xdebug
OPcache 擴(kuò)展是 PHP7.X 自帶的,只要在編譯時(shí)開啟,就可以配置使用。而 Xdebug 需要另外安裝。參考官網(wǎng):https://xdebug.org/docs/install
yum install -y git
git clone git://github.com/xdebug/xdebug.git
cd xdebug
phpize
./configure --enable-xdebug
make && make install
Xdebug編譯完成后顯示擴(kuò)展文件目錄、提示將擴(kuò)展添加到 php.ini文件
編輯 php.ini ,在末尾增加 xdebug.so擴(kuò)展。
vim /usr/local/php/etc/php.ini
####增加xdebug.so擴(kuò)展###
zend_extension="/usr/local/php/lib/php/extensions/debug-non-zts-20190902/xdebug.so"
重啟 php-fpm ,檢查 php 擴(kuò)展
/usr/bin/php-fpm restart
php -m
1、Nginx 和 PHP-FPM 的配合
Nginx 和 PHP-FPM 的進(jìn)程間通信有兩種方式,一種是TCP,另一種是 UNIX Domain Socket。
其中 TCP 方式是 IP 加端口,可以跨服務(wù)器。而 UNIX Domain Socket 不經(jīng)過(guò)網(wǎng)絡(luò),只能用于Nginx 跟 PHP-FPM 都在同一服務(wù)器的場(chǎng)景。不管用哪種方式在 Nginx 和 PHP-FPM 配置時(shí)要統(tǒng)一。
方式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 是一個(gè)文件,由 php-fpm 生成,如果在 php-fpm.conf 配置文件中指定的用戶和組是 www ,確保 /tmp/php-fpm.sock 的權(quán)限是 www:www。
2、測(cè)試 phpinfo 文件
在瀏覽器中打開內(nèi)容為 phpinfo() 函數(shù)的 PHP 文件,如果 nginx 出現(xiàn)錯(cuò)誤,則說(shuō)明 php 無(wú)法配合 Nginx 運(yùn)行, 請(qǐng)查看 nginx 錯(cuò)誤日志。
vim /data/wwwlogs/error_nginx.log
phpinfo 顯示了編譯參數(shù)、 php.ini 的文件位置、已開啟OPcache 及 Xdebug 擴(kuò)展等信息
3、phpMyAdmin
下載 phpMyAdmin 并解壓到 /mnt/e/wwwroot/default 目錄,即 Nginx 配置文件中指定的默認(rèn)網(wǎng)站目錄。在瀏覽器中打開 http://localhost/phpMyAdmin/ ,如果能順利登錄數(shù)據(jù)庫(kù),則說(shuō)明不但 Nginx 和 php 沒(méi)有問(wèn)題,而且 Mysql 也沒(méi)有問(wèn)題。至此,Nginx php Mysql 已經(jīng)完全能配合運(yùn)行了。
4、關(guān)于開機(jī)自動(dòng)啟動(dòng)服務(wù)
通常在 Linux 中開機(jī)啟動(dòng)可以通過(guò)編輯/etc/rc.loacl 文件、在/etc/init.d/ 下添加啟動(dòng)腳本或者配置systemd 實(shí)現(xiàn),但是關(guān)于由于 WSL 架構(gòu)的特殊性,并且不支持 systemd ,這幾種方式在 WSL 子系統(tǒng)中無(wú)法使用。而在 Windows 中用 VBS 腳本結(jié)合 WSL 命令的實(shí)現(xiàn)開機(jī)啟動(dòng)的方式似乎存在不能使用 LocalHost 地址訪問(wèn)子系統(tǒng)的問(wèn)題。總之,暫時(shí)還是手動(dòng)啟動(dòng)吧。
如前述,已安裝的 Nginx、PHP、MySql 啟動(dòng)及停止命令總結(jié)如下:
nginx #啟動(dòng)nginx服務(wù)
phpfpm start #啟動(dòng)php-fpm服務(wù)
mysqld start #啟動(dòng)mysql
nginx -s reload #不停止服務(wù)重新載入配置文件
nginx -s stop #停止服務(wù)
phpfpm restart
phpfpm stop
mysqld restart #重啟mysql
mysqld stop #停止mysql
Windows Terminal + WSL2 + CENTOS 配置Windows命令終端https://www.tinychen.com/200512-windowsterminal-wsl2-centos/https://github.com/CentOS/sig-cloud-instance-images
LxRunOffline 使用教程 - WSL 自定義安裝、備份 https://p3terx.com/archives/manage-wsl-with-lxrunoffline.html
https://chocolatey.org/docs/installationhttps://blog.csdn.net/hiqiming/article/details/105244147
http://nginx.org/https://www.cnblogs.com/zhang-shijie/p/5294162.html
https://www.cnblogs.com/pp-yang/p/12595387.html
https://www.jianshu.com/p/64e12bea3d49
Linux安裝mysql8.0(踩坑實(shí)況) https://blog.csdn.net/LittleSeedling/article/details/105851113
https://www.cnblogs.com/cxyyh/p/12431424.htmlIndex of /php/
centos8安裝php7.4 https://www.cnblogs.com/architectforest/p/12433541.html
https://www.cnblogs.com/alliancehacker/p/12255445.html
CGI
CGI全稱是“公共網(wǎng)關(guān)接口”(Common Gateway Interface),HTTP服務(wù)器與你的或其它機(jī)器上的程序進(jìn)行“交談”的一種工具,其程序須運(yùn)行在網(wǎng)絡(luò)服務(wù)器上。
CGI可以用任何一種語(yǔ)言編寫,只要這種語(yǔ)言具有標(biāo)準(zhǔn)輸入、輸出和環(huán)境變量。如php,perl,tcl等。
FastCGI
FastCGI像是一個(gè)常駐(long-live)型的CGI,它可以一直執(zhí)行著,只要激活后,不會(huì)每次都要花費(fèi)時(shí)間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。它還支持分布式的運(yùn)算,即 FastCGI 程序可以在網(wǎng)站服務(wù)器以外的主機(jī)上執(zhí)行并且接受來(lái)自其它網(wǎng)站服務(wù)器來(lái)的請(qǐng)求。
FastCGI是語(yǔ)言無(wú)關(guān)的、可伸縮架構(gòu)的CGI開放擴(kuò)展,其主要行為是將CGI解釋器進(jìn)程保持在內(nèi)存中并因此獲得較高的性能。眾所周知,CGI解釋器的反復(fù)加載是CGI性能低下的主要原因,如果CGI解釋器保持在內(nèi)存中并接受FastCGI進(jìn)程管理器調(diào)度,則可以提供良好的性能、伸縮性、Fail- Over特性等等。
FastCGI特點(diǎn)
FastCGI的工作原理
在上述情況中,你可以想象CGI通常有多慢。每一個(gè)Web請(qǐng)求PHP都必須重新解析php.ini、重新載入全部擴(kuò)展并重初始化全部數(shù)據(jù)結(jié)構(gòu)。使用FastCGI,所有這些都只在進(jìn)程啟動(dòng)時(shí)發(fā)生一次。一個(gè)額外的好處是,持續(xù)數(shù)據(jù)庫(kù)連接(Persistent database connection)可以工作。
FastCGI的不足
因?yàn)槭嵌噙M(jìn)程,所以比CGI多線程消耗更多的服務(wù)器內(nèi)存,PHP-CGI解釋器每進(jìn)程消耗7至25兆內(nèi)存,將這個(gè)數(shù)字乘以50或100就是很大的內(nèi)存數(shù)。
Nginx 0.8.46+PHP 5.2.14(FastCGI)服務(wù)器在3萬(wàn)并發(fā)連接下,開啟的10個(gè)Nginx進(jìn)程消耗150M內(nèi)存(15M*10=150M),開啟的64個(gè)php-cgi進(jìn)程消耗1280M內(nèi)存(20M*64=1280M),加上系統(tǒng)自身消耗的內(nèi)存,總共消耗不到2GB內(nèi)存。如果服務(wù)器內(nèi)存較小,完全可以只開啟25個(gè)php-cgi進(jìn)程,這樣php-cgi消耗的總內(nèi)存數(shù)才500M。
上面的數(shù)據(jù)摘自Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建勝過(guò)Apache十倍的Web服務(wù)器(第6版)
PHP-CGI
PHP-CGI是PHP自帶的FastCGI管理器。
PHP-CGI的不足:
PHP-FPM
PHP-FPM是一個(gè)PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下載得到。
PHP-FPM其實(shí)是PHP源代碼的一個(gè)補(bǔ)丁,旨在將FastCGI進(jìn)程管理整合進(jìn)PHP包中。必須將它patch到你的PHP源代碼中,在編譯安裝PHP后才可以使用。
現(xiàn)在我們可以在最新的PHP 5.3.2的源碼樹里下載得到直接整合了PHP-FPM的分支,據(jù)說(shuō)下個(gè)版本會(huì)融合進(jìn)PHP的主分支去。相對(duì)Spawn-FCGI,PHP-FPM在CPU和內(nèi)存方面的控制都更勝一籌,而且前者很容易崩潰,必須用crontab進(jìn)行監(jiān)控,而PHP-FPM則沒(méi)有這種煩惱。
PHP5.3.3已經(jīng)集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP進(jìn)程管理方式,可以有效控制內(nèi)存和進(jìn)程、可以平滑重載PHP配置,比spawn-fcgi具有更多有點(diǎn),所以被PHP官方收錄了。在./configure的時(shí)候帶 –enable-fpm參數(shù)即可開啟PHP-FPM。
Spawn-FCGI
Spawn-FCGI是一個(gè)通用的FastCGI管理服務(wù)器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI進(jìn)行FastCGI模式下的管理工作,不過(guò)有不少缺點(diǎn)。而PHP-FPM的出現(xiàn)多少緩解了一些問(wèn)題,但PHP-FPM有個(gè)缺點(diǎn)就是要重新編譯,這對(duì)于一些已經(jīng)運(yùn)行的環(huán)境可能有不小的風(fēng)險(xiǎn)(refer),在php 5.3.3中可以直接使用PHP-FPM了。
Spawn-FCGI目前已經(jīng)獨(dú)成為一個(gè)項(xiàng)目,更加穩(wěn)定一些,也給很多Web 站點(diǎn)的配置帶來(lái)便利。已經(jīng)有不少站點(diǎn)將它與nginx搭配來(lái)解決動(dòng)態(tài)網(wǎng)頁(yè)。
注:最新的Spawn-FCGI可以到lighttpd.net網(wǎng)站搜索“Spawn-FCGI”找到它的最新版本發(fā)布地址。
PHP-FPM與spawn-CGI對(duì)比
PHP-FPM的使用非常方便,配置都是在PHP-FPM.ini的文件內(nèi),而啟動(dòng)、重啟都可以從php/sbin/PHP-FPM中進(jìn)行。更方便的是修改php.ini后可以直接使用PHP-FPM reload進(jìn)行加載,無(wú)需殺掉進(jìn)程就可以完成php.ini的修改加載
結(jié)果顯示使用PHP-FPM可以使php有不小的性能提升。PHP-FPM控制的進(jìn)程cpu回收的速度比較慢,內(nèi)存分配的很均勻。
Spawn-FCGI控制的進(jìn)程CPU下降的很快,而內(nèi)存分配的比較不均勻。有很多進(jìn)程似乎未分配到,而另外一些卻占用很高??赡苁怯捎谶M(jìn)程任務(wù)分配的不均勻?qū)е碌?。而這也導(dǎo)致了總體響應(yīng)速度的下降。而PHP-FPM合理的分配,導(dǎo)致總體響應(yīng)的提到以及任務(wù)的平均。