惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
IT之家
IT之家
博客园_首页
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
美团技术团队
小众软件
小众软件
博客园 - 叶小钗
WordPress大学
WordPress大学
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
罗磊的独立博客
博客园 - Franky
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
月光博客
月光博客
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理

竹林里有冰的博客

Nuxt SSG 博客的尾斜杠到底怎么加? | 竹林里有冰的博客 小米 Xiaomi Book Pro 14 (Ultra X7) Linux 兼容性实测 | 竹林里有冰的博客 国内(大陆)版小米 FCM 熄屏断连:Rootless 环境下的尝试与可能的解决方案 | 竹林里有冰的博客 我没法访问 dl.google.com —— 记一次 TUN 下的网络 debug | 竹林里有冰的博客 Vercel 的缓存控制,你注意过吗? | 竹林里有冰的博客 小记 —— Caddy 在 Layer 4 上的流量代理实践 | 竹林里有冰的博客 你的域名后缀拖慢你的网站速度了嘛?——再谈 DNS 冷启动 | 竹林里有冰的博客 DNS 冷启动:小型站点的“西西弗斯之石” | 竹林里有冰的博客 HTTP/2 Server Push 已事实性“死亡”,我很怀念它 | 竹林里有冰的博客 Nuxt Content v3 中数组字段的筛选困境与性能优化 | 竹林里有冰的博客 后 OCSP 时代,浏览器如何应对证书吊销新挑战 | 竹林里有冰的博客 初试 Github Action Self-hosted Runner,想说爱你不容易 | 竹林里有冰的博客 DNS 解析延迟毁了我的图床优化 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(下):告别 DOM 操作,拥抱 AST 与函数式渲染 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(上):从暴力刷新、分块更新到 Morphdom 的华丽变身 | 竹林里有冰的博客 node-sass 迁移至 dart-sass 踩坑实录 | 竹林里有冰的博客 前端中的量子力学——一打开 F12 就消失的 Bug | 竹林里有冰的博客 2025 年,如何为 web 页面上展示的视频选择合适的压缩算法? | 竹林里有冰的博客 el-image 和 el-table 怎么就打架了?Stacking Context 是什么? | 竹林里有冰的博客 2025年,前端如何使用 JS 将文本复制到剪切板? | 竹林里有冰的博客 ssh 拯救世界——通过 ssh 隧道在内网服务器执行 APT 更新 | 竹林里有冰的博客 Cudy TR3000 吃鹅(daed)记 | 竹林里有冰的博客 使用 Cloudflare Workers 监控 Fedora Copr 构建状态 | 竹林里有冰的博客 基于 Cloudflare Workers 实现的在线服务状态检测告警系统 | 竹林里有冰的博客 构建部署在 Cloudflare Workers 上的 TG Bot | 竹林里有冰的博客 2024年,Firefox 是唯一还在坚持执行在线的 SSL 证书吊销状态检查的主流浏览器 | 竹林里有冰的博客 小爱课程表适配不完全指北——以 ZJUT 本科正方教务系统为例 | 竹林里有冰的博客 将博客从 waline v2 更新到 waline v3 | 竹林里有冰的博客 给家里云装上 Fedora 41 KDE 后,我是如何配置的 | 竹林里有冰的博客 为 Hexo 添加 follow 认证 | 竹林里有冰的博客
PicUploader使用系列(一)——在Archlinux上使用Caddy部署PicU...
竹林里有冰 · 2021-10-21 · via 竹林里有冰的博客

之前找对大陆网络友好的图床时,找到了cloudinary,但是全英文界面对操作增加了不少难度,其页面也不是很简洁,让我一下打消了使用网页版的念头。通过搜索,找到了 PicUploader 这一方案,使用php编写,支持cloudinary的api。

作者在其博客中仅提供了nginx的部署方案,我参考其配置文件成功实现了在caddy下的部署,并且花费了数个小时排坑,故写下本文帮助后来者节省时间。

安装caddyphp-fpm以及所需的拓展#

sudo pacman -S caddy php-fpm php-gd php-sqlite --needed

配置php-fpm#

/etc/php/php.ini启用PicUploader所需拓展#

PicUploaer依赖于fileinfogdcurlexifpdo_sqlite拓展,可以使用php -m命令来查看目前加载成功了的插件。

;extension=bcmath
;extension=bz2
;extension=calendar
- extension=curl
+ extension=curl
;extension=dba
;extension=enchant
- extension=exif
+ extension=exif
;extension=ffi
;extension=ftp
- extension=gd
+ extension=gd
;extension=gettext
;extension=gmp
;extension=iconv
;extension=imap
;extension=intl
;extension=ldap
;extension=mysqli
;extension=odbc
;zend_extension=opcache
;extension=pdo_dblib
;extension=pdo_mysql
;extension=pdo_odbc
;extension=pdo_pgsql
- extension=pdo_sqlite
+ extension=pdo_sqlite
;extension=pgsql
;extension=pspell
;extension=shmop
;extension=snmp
;extension=soap
;extension=sockets
;extension=sodium
;extension=sqlite3
;extension=sysvmsg
;extension=sysvsem
;extension=sysvshm
;extension=tidy
;extension=xmlrpc
;extension=xsl
extension=zip

编辑/etc/php/php.ini以增加单文件上传大小限制#

查出这个问题浪费了我整整4小时时间。

- upload_max_filesize = 2M
+ upload_max_filesize = 100M

编辑/etc/php/php-fpm.d/www.conf使其在运行时使用caddy用户。#

---
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
- user = http
+ user = caddy
- group = http
+ group = caddy
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
---
---
; Note: This value is mandatory.
listen = /run/php-fpm/php-fpm.sock
; and group can be specified either by name or by their numeric IDs.
; Default Values: user and group are set as the running user
;                 mode is set to 0660
- listen.owner = http
+ listen.owner = caddy
- listen.group = http
+ listen.group = caddy
;listen.mode = 0660
; When POSIX Access Control Lists are supported you can set them using
; these options, value is a comma separated list of user/group names.
; When set, listen.owner and listen.group are ignored
;listen.acl_users =
;listen.acl_groups =
---

2022年1月14日更新:在 Fedora 尝试部署的时候遇到了新的坑,Fedora 的相应配置文件为 /etc/php-fpm.d/www.conf,相应修改如下

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
-user = apache
+user = caddy
; RPM: Keep a group allowed to write in log dir.
-user = apache
+group = caddy

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;             a specific port;
---
---
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
;                 mode is set to 0660
-;listen.owner = nobody
+listen.owner = caddy
-;listen.owner = nobody
+listen.group = caddy
;listen.mode = 0660

; When POSIX Access Control Lists are supported you can set them using
; these options, value is a comma separated list of user/group names.
; When set, listen.owner and listen.group are ignored
-listen.acl_users = apache,nginx
+;listen.acl_users = apache,nginx
;listen.acl_groups =

; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect.
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
; must be separated by a comma. If this value is left blank, connections will be
; accepted from any ip address.
; Default Value: any
listen.allowed_clients = 127.0.0.1

首先创建一个用于存放代码的目录

sudo mkdir -p /var/www/

clone 最新源码

sudo git clone https://github.com/xiebruce/PicUploader.git /var/www/picuploader

将代码所有权转交给caddy用户

sudo chown -R caddy:caddy /var/www/picuploader

编辑Caddyfile#

caddy默认使用/etc/caddy/Caddyfile,因此如果你就部署这一个站点,直接修改这个就好了。

caddy的语法非常简洁易懂,因此我随手写了几行就能跑起来了。

下面是我用的Caddyfile,如果你在服务器上部署,请把http://api.picuploader.com更换为你服务器所需要绑定的域名(不带http协议头),caddy将自动为你申请ssl证书。

http://api.picuploader.com {
        root * /var/www/picuploader

        php_fastcgi * unix//run/php-fpm/php-fpm.sock {
                index dashboard.php
        }

        file_server {
                index index.php
        }

        handle_errors {
        root * /etc/caddy/error
                rewrite * /error.html
                templates
                file_server
        }
}

# Import additional caddy config files in /etc/caddy/conf.d/
import /etc/caddy/conf.d/*

php我选择了监听本地unix//run/php-fpm/php-fpm.sock的方案,这个路径在上文的/etc/php/php-fpm.d/www.conf可以设置,如需查询,直接使用 grep listen\ = /etc/php/php-fpm.d/www.conf应该就能看见。

设置访问密码(可选)#

caddy2开始不允许在caddyfile中直接指定明文密码,因此我们需要用hash-password获取加密后的密码密文

caddy hash-password  --plaintext <YourPassword>

再在Caddyfile中,加上

basicauth /* {
        <username> <hashed_password>
}

修改hosts/设置DNS解析#

由于 api.picuploader.com 这个域名不在我手里,而我只是想在本地使用,并不打算部署到服务器,因此修改hosts将这个域名解析到本地是个不错的选择。

sudo sh -c "echo '127.0.0.1     api.picuploader.com'  /etc/hosts"

而你若是在服务器上部署,应当去设置DNS解析,这个应该不需要我多说。

开启服务#

在Archlinux下,我习惯直接用systemd运行caddyphp-fpm以开机自启动。

sudo systemctl enable --now caddy php-fpm

最终测试#

在浏览器内访问 api.picuploader.com ,如果能看到页面,就算是成功啦。

设置上传参数#

见作者博客:PicUploader: 各图床获取上传图片参数的方法