部署第一个网络服务
前面介绍了不少基础知识,今天介绍如何部署一个网站,demo在这里。
下面是一些前面介绍过的预备知识:
– Caddy介绍
– 域名介绍
静态网页和动态网页
静态网页
前面介绍过一个网址,无论你什么时候访问,它的内容都是不变的,这就是静态网页。
我们访问这个网址,Caddy就会把Web根目录下面的hello.txt发给你,你打开看始终是同一个内容。
动态网站
现在介绍一个网址,这个网页会显示当前时间、你的IP和浏览器,不同的时间、不同的电脑访问,看到的内容是不一样的。
这里我们在Web文件夹下放了个hello.php,它实际是个程序文件,当用户访问hello.php时,Caddy会调用php解释器执行这个文件,并把输出结果返回给用户。
这里用的动态网页技术是PHP,还有Java、Python、Node.js等。
客户端的动态网页
再介绍一个网址,它会显示实时的时间,你将这个网页保存在本地电脑,用浏览器打开,它一样显示实时的时间。
不过你用记事本打开这个文件,发现它的内容不会变化。
因为这个网页包含js代码,浏览器打开网页的时候会执行js代码,产生动态效果。
曾经有网站把挖矿的js代码嵌入到网页中,用户访问的时候,浏览器就会挖矿,把用户的电脑搞的很慢很慢。
部署测速站
安装PHP
php-fpm是一个服务,需要启用。
dnf install -y php-fpm
下载
测速网页上的源码下载地址已经失效了,这里提供了一个下载地址。
aria2c -x 16 -s 16 https://www.vpsdiy.tech/storage/speedtest.tar.bz2
我比较喜欢用aria2c,它支持多线程下载,-x 16 -s 16
表示把文件分为16块同时下载。
这个文件的md5值是a59445115c7b0d3ed4ac817a07491904
,你可以用md5sum speedtest.tar.bz2
命令验证一下。确保下载文件的完整性。
解压
# 将文件解压到/var/www/html/目录下。
tar -xvf speedtest.tar.bz2 -C /var/www/html/
# 设置权限
chown -R caddy:caddy /var/www/html/speedtest
配置Caddy
在/etc/caddy/Caddyfile中添加以下内容:
test.vpsdiy.tech {
root * /var/www/html/speedtest
php_fastcgi unix//run/php/php-fpm.sock
file_server
}
配置PHP
修改/etc/php-fpm.d/www.conf
文件,将user和group改为caddy。
# 原始配置是
# user = apache
# group = apache
user = caddy
group = caddy
# 这个路径就是前面Caddyfile中配置的php_fastcgi
listen = /run/php-fpm/www.sock
重启caddy和php-fpm服务。
在/var/www/html/speedtest下面创建一个test.php文件,内容如下:
<?php
phpinfo();
?>
DEBUG
访问https://test.vpsdiy.tech/test.php
,发现网页打不开。
访问https://test.vpsdiy.tech/hello.txt
,发现网页正常,说明Caddy解析静态文件正常,调用php-fpm解析php文件出现问题。
运行journalctl -u caddy -f
,发现错误信息:
Jan 17 16:03:55 rs caddy[414974]: {"level":"error","ts":1737101035.0598924,"logger":"http.log.error","msg":"dialing backend: dial unix /run/php-fpm/www.sock: connect: permission denied","request":{"remote_ip":"83.229.121.247","remote_port":"35272","client_ip":"83.229.121.247","proto":"HTTP/2.0","method":"GET","host":"test.vpsdiy.tech","uri":"/test.php","headers":{"If-None-Match":["\"d746swgcfiwwk\""],"If-Modified-Since":["Fri, 17 Jan 2025 07:58:10 GMT"],"Sec-Ch-Ua":["\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\""],"Dnt":["1"],"Upgrade-Insecure-Requests":["1"],"User-Agent":["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"],"Sec-Fetch-Dest":["document"],"Sec-Ch-Ua-Platform":["\"Windows\""],"Accept":["text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"],"Sec-Fetch-Site":["none"],"Sec-Fetch-Mode":["navigate"],"Accept-Encoding":["gzip, deflate, br, zstd"],"Sec-Ch-Ua-Mobile":["?0"],"Sec-Fetch-User":["?1"],"Accept-Language":["zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6"],"Priority":["u=0, i"]},"tls":{"resumed":false,"version":772,"cipher_suite":4865,"proto":"h2","server_name":"test.vpsdiy.tech"}},"duration":0.00104267,"status":502,"err_id":"hth491cmj","err_trace":"reverseproxy.statusError (reverseproxy.go:1269)"}
就是这条信息dialing backend: dial unix /run/php-fpm/www.sock: connect: permission denied
,又是权限问题,Caddy无法连接到php-fpm的Unix Domain Socket。
继续修改/etc/php-fpm.d/www.conf
,修改这条配置
# 原始配置是listen.acl_users = apache,nginx,加上caddy
listen.acl_users = apache,nginx,caddy
重启php-fpm服务,https://test.vpsdiy.tech/test.php
就可以正常访问了。然后把test.php
文件删除,这个网页会暴露你服务器的信息。
再打开https://test.vpsdiy.tech/
就可以看到测速网站了。
注意
如果测试访问VPS的速度,要在Cloudflare的DNS中把代理关掉,否则测试的就是你访问CDN节点的速度(如果测试文件已经在CDN节点上有了缓存)。
进程间通讯
有的Caddy配置写的是php_fastcgi localhost:9000
,这样也能工作,这里就涉及到进程间通讯的概念。
大而化之的说,我们通过浏览器访问网站就是一种进程间通讯,我们的浏览器进程和VPS的Caddy进程通讯。互联网上茫茫多的Caddy的进程,我们的浏览器怎么找到那个独一无二的Caddy的呢,就是通过IP加端口号,也就是Socket连接。
如果两个进程在同一台机器上,就像这里的Caddy和php-fpm,它们也可以通过IP(localhost)加端口号(9000)通讯,只是这里角色变了,Caddy是客户端,php-fpm是服务端了。
不过既然在同一台机器上,还有一些更方便的通讯方式,比如指定一个文件路径,这里是/run/php-fpm/www.sock
,这种方式叫做Unix Domain Socket(UDS)。
注意我们本地进程间通讯,监听IP地址都是设为localhost或者127.0.0.1,这样只有本地运行的进程才能访问这个IP地址,像Caddy设置的监听IP地址是0.0.0.0,就表示可以接受来自外部网络的访问。
比较一下Socket和UDS,UDS有不少优势,毕竟端口号比较难记,一个IP最多开65536个端口,而文件路径可以有含义方便记忆,也可以定义无限多个,只要硬盘够大。
另外使用UDS性能也好了不少,这里盗两张图,原文见https://zhuanlan.zhihu.com/p/448373622
。
当然涉及到文件,就会有权限的问题,有时候访问UDS出现问题大概率就是权限问题。