手写WEB服务器-01-环境准备

手写WEB服务器-01-环境准备

1.目标

最近考虑实现一个web服务器,要求如下:

  • 纯C语言实现,不使用任何第三方库
  • 支持php,可完全支撑我的博客应用运行(wordpress+apache2)

PS:您现在访问本网站时,后台提供服务的就是本例中的web服务器

2.资源

  • 开发终端:MacBook Pro,2020,M1芯片
  • 虚拟机软件:VMware-Fusion-13.0.2-21581413_universal.dmg(个人用户正版免费)
  • 虚拟机镜像:CentOS-Stream-9-latest-aarch64-dvd1.iso(M1下不闪退)
  • php安装包:php-8.2.11.tar.gz
  • mysql安装包:mysql-8.1.0-1.el9.aarch64.rpm-bundle.tar(8.0以前不提供ARM版本)
  • 参考书:《HTTP权威指南》
  • 参考代码(PHP部分):https://github.com/jaykizhou/php-server/tree/master

3.安装

3.1 虚拟机安装

内存处理器尽量选大一些:

还有硬盘:

进入安装界面后,选择最小安装、启用网络、设置root密码:

设置root密码时,下面的允许root远程登录一定要勾选上:

因为侦听80端口需要root权限,所以后续我们的开发全部使用root用户,开启远程登录会比较方便。

3.2 开发环境准备

由于是最小安装,所以需要先安装一些虚拟机必备的软件(使用默认yum源需梯子):

  • yum update
  • yum install net-tools

这时候你就可以用ifconfig查看服务器ip然后用root用户远程登录了。

然后继续安装必备软件:

  • yum install epel-release.noarch
  • yum install htop
  • yum install vim
  • yum install tar
  • yum install gcc
  • yum install gcc-c++

然后就能用配置VSCode远程开发了,配置过后,导入代码,make一下,没报错就证明环境没问题:

我们先关掉防火墙:

  • systemctl stop firewalld.service
  • systemctl disable firewalld.service

然后在合适的位置建立一个index.html文件,然后启动服务器程序:

文字版:

<!DOCTYPE html>
<body>Hello World!</body>
</html>

在浏览器中输入服务器的ip地址,看到如下画面证明环境配置成功,已经具备了开发静态页面WEB服务器的能力:

3.3 PHP运行环境准备

接着我们准备PHP的运行环境。

上传源码包,解压,在解压过的文件夹内执行如下命令:

yum install libxml2-devel 

yum install sqlite-devel

./configure --prefix=/usr/local/php-8.2.11 --with-config-file-path=/usr/local/php-8.2.11/etc --enable-fpm --enable-cgi --with-libdir=lib64 --with-mysqli --with-zlib

make -j

make install

如果编译过程中提示内存不足,可以临时开一块交换空间:

dd if=/dev/zero of=/swapfile bs=64M count=16
mkswap /swapfile
swapon /swapfile

编译完别忘了删掉:

swapoff /swapfile
rm /swapfile

检查下是否安装成功了:

下面配置并启动phpfpm:

编辑上述www.conf配置文件,确保如下几个配置项正确配置:

然后启动phpfpm,最终看到9000端口启动就证明配置成功了:

文字版命令:

  • /usr/local/php-8.2.11/sbin/php-fpm –allow-to-run-as-root

同样,我们在合适的位置建立一个index.php文件:

文字版:

<?php
 echo phpinfo();
?>

然后启动web服务器,从浏览器访问该页面:

看到上述页面即可证明环境配置成功。

3.4 生产运行环境配置

现在的博客用的是wordpress+apache2+mysql方案,我写这个web服务器的最终目的之一是替换掉apache2,所以这里我们将生产环境中的博客数据迁移到这里,以备后期测试。

首先是备份web应用(假设index.php位于/var/www/html目录下):

  • tar czvf html.tar.gz /var/www/html

然后备份数据库(执行后需输入数据库密码):

  • mysqldump -uroot -p wordpress >wp-db-backup.sql

将上述文件(html.tar.gz、wp-db-backup.sql)传到虚拟机上备用。

将mysql安装包(mysql-8.1.0-1.el9.aarch64.rpm-bundle.tar)上传到服务器,解压,执行如下命令安装:

  • yum install perl
  • yum install libtirpc
  • rpm -ivh mysql-community-common-8.1.0-1.el9.aarch64.rpm
  • rpm -ivh mysql-community-client-plugins-8.1.0-1.el9.aarch64.rpm
  • rpm -ivh mysql-community-libs-8.1.0-1.el9.aarch64.rpm
  • rpm -ivh mysql-community-client-8.1.0-1.el9.aarch64.rpm
  • rpm -ivh mysql-community-icu-data-files-8.1.0-1.el9.aarch64.rpm
  • rpm -ivh mysql-community-server-8.1.0-1.el9.aarch64.rpm

执行如下命令启动mysql:

  • service mysqld start

执行如下命令获取mysql初始root密码:

  • cat /var/log/mysqld.log | grep temporary

执行如下命令,输入初始root密码登录:

  • mysql -u root -p

执行如下命令修改root用户密码(把XXXXXXXX改成你的密码):

  • ALTER user ‘root’@’localhost’ identified with mysql_native_password by “XXXXXXXX”;
  • UPDATE mysql.user SET password_expired=’N’;
  • UPDATE mysql.user SET host=’%’ where user=’root’;
  • flush privileges;

然后使用新密码登录,导入博客数据库:

  • mysql -uroot -p
  • create database wordpress;
  • use wordpress;
  • source /root/wp-db-backup.sql;

注意:博客数据库文件中存的都是域名,不能直接导入,不然在虚拟机上访问会有问题,所以需要先用文本编辑器打开数据库文件,将域名链接统一替换为服务器ip地址链接,然后再导入虚拟机数据库。

将备份文件html.tar.gz解压后存放在合适的目录,确保index.php位于/root/www目录下。

编辑/root/www/wp-config.php:

  • 将DB_PASSWORD配置项修改为数据库的新密码
  • 将DB_HOST配置项修改为127.0.0.1

然后启动web服务器,在浏览器输入虚拟机ip地址。

可以看到,没啥问题了。

发表回复