今早醒来,我像往常一样点开自己的博客,翻来翻去总觉得内容有点单薄。除了几篇文章之外,功能寥寥无几,所以就想着能不能给博客加个实用的在线工具箱?放一些编码转换、计算器之类的小工具,让来访的朋友有点新东西可以玩玩。于是开始搜索相关的教程,结果无外乎都是用宝塔面板部署的,但我的服务器没装宝塔,又不想特意去安装那么重的东西。于是我来来回回折腾了一上午,摸索出了一套不依赖宝塔面板的方案,并在此分享细节,希望能帮助到和我有相同需求的朋友们。
🧠 使用的工具:
- Nginx Proxy Manager (NPM):我只用它来管反向代理和 SSL 证书。它的界面很清晰,专心负责把外部请求安全地转发到内部服务,并且自动搞定 HTTPS 加密,这点非常省心。
- Nginx + PHP-FPM:它们俩在后台搭好运行环境,让我的 PHP 工具箱网站在服务器内部的一个特定端口上安静运行,不直接对外暴露。
这样分工,结构清晰,资源占用也少。
⚙️ 操作步骤:
1.📁 创建目录 /www/wwwroot/,上传源码
1.使用 mkdir -p
创建目录
sudo mkdir -p /www/wwwroot/
2.上传源码到 /www/wwwroot/
1.使用scp将源码从本地电脑上传至服务器用户home目录:
scp -r tool puber:~/
2.将源码移动到 /www/wwwroot/目录:
sudo mv ~/tool /www/wwwroot/
3. 准备环境:安装 Nginx 和 PHP
请依次执行以下命令来准备环境:
更新软件包列表:确保获取最新的软件版本信息。
sudo apt update
安装 Nginx:
sudo apt install nginx -y
添加 PHP 仓库:Ubuntu 官方库中的 PHP 版本可能不全,添加 Ondřej Surý 的 PPA 仓库来获取 PHP 7.4。
sudo add-apt-repository ppa:ondrej/php -y sudo apt update # 更新源后再次更新软件列表
安装 PHP 7.4 及其常用扩展:安装 PHP 核心、进程管理器(FPM)和一些Web开发中常用的扩展。
sudo apt install php7.4 php7.4-fpm php7.4-mysql php7.4-xml php7.4-mbstring -y
- php7.4-fpm: 用于 Nginx 通过 FastCGI 方式处理 PHP 脚本。
- php7.4-mysql: 提供 MySQL 数据库支持。
- php7.4-xml: 处理 XML 文件所必需。
- php7.4-mbstring: 提供多字节字符串支持(对中文等非英文字符很重要)。
4. 基本配置与设置
安装完成后,需要进行一些基本配置和权限设置。
启动并设置开机自启:
sudo systemctl start nginx php7.4-fpm # 启动服务 sudo systemctl enable nginx php7.4-fpm # 设置开机自动启动
检查服务状态:确认 Nginx 和 PHP-FPM 都已正常运行。
sudo systemctl status nginx # 检查Nginx状态 sudo systemctl status php7.4-fpm # 检查PHP-FPM状态
如果状态显示
active (running)
,说明服务已成功启动。权限设置:确保 Nginx 和 PHP-FPM 进程(通常以
www-data
用户和组运行)对你的网站根目录(例如/www/wwwroot/tool
)有读取和执行权限。sudo chown -R www-data:www-data /www/wwwroot/tool # 更改目录所有者和组 sudo chmod -R 755 /www/wwwroot/tool # 设置目录权限
注意:权限设置非常重要,不正确的权限可能导致 403 Forbidden 或 500 Internal Server Error。
5. 写 Nginx 配置:告诉服务器怎么运行网站
创建一个配置文件 /etc/nginx/sites-available/webtool.conf
,让 Nginx 监听 8000 端口来运行我们的网站(这样就不会和 NPM 抢 80 端口了):
server {
listen 8000;
server_name localhost;
root /www/wwwroot/tool/public;
index index.html index.htm index.php;
# ThinkPHP 伪静态规则
location ~* (runtime|application)/{
return 403;
}
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}
# 将所有 .php 文件请求转发给 PHP-FPM
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
写完配置,启用它并测试一下:
sudo ln -s /etc/nginx/sites-available/webtool.conf /etc/nginx/sites-enabled/
sudo unlink /etc/nginx/sites-enabled/default # 把默认配置禁用掉,防止端口冲突
sudo nginx -t # 测试一下配置文件有没有语法错误
sudo systemctl restart nginx php7.4-fpm
6. 让 NPM 接管对外访问
现在内部服务已经准备好了,最后一步就是让 NPM 来接管对外访问:
- 打开浏览器,访问 NPM 的后台管理界面。
- 点击 Proxy Hosts -> Add Proxy Host。
- Domain Names 里填你打算用来访问工具箱的域名(事先准备好域名,比如
tool.yourdomain.com
)。 Scheme 选http
。 Forward Hostname / IP 填172.17.0.1
(因为我的NPM是dokcer部署的,172.17.0.1
是 Docker 创建的默认网络桥接接口(docker0)在宿主机(Host Machine)上的IP地址。对于运行在容器内的 Nginx Proxy Manager 来说,这个地址就是它的“网关”,通过这个地址它可以访问到宿主机上运行的服务)。 Forward Port 填8000
(就是我们刚才配的端口)。 - 在 SSL 标签页里,选择
Request a new SSL Certificate
,勾上Force SSL
,然后点Save
。NPM 会自动帮你申请并配置好 Let's Encrypt 的免费 SSL 证书。
一个小提示:如果你的网站根目录下有个默认的 index.html
,它可能会“挡道”,导致直接访问时看不到 PHP 应用。为了确保访问的是 PHP 应用,可以把它删掉:
sudo rm /www/wwwroot/tool/public/index.html
至此,大功告成!
🐞 遇到问题了?别慌,试试这么解决
- Nginx 启动失败,说 80 端口被占了: 这通常是因为 Nginx 默认的配置文件还占着 80 端口,和 NPM 冲突了。解决方法是:确保你已经禁用了那个默认配置:
sudo unlink /etc/nginx/sites-enabled/default
,然后重启 Nginx:sudo systemctl restart nginx
。 - 访问域名出现 502 Bad Gateway: 这是最常见的坑,多半是 Nginx 和 PHP-FPM “握手”失败了。
- 首先,检查一下 Nginx 配置里的
fastcgi_pass
(比如unix:/var/run/php/php7.4-fpm.sock
)和 PHP-FPM 配置文件(一般在/etc/php/7.4/fpm/pool.d/www.conf
)里的listen
值是不是一模一样,一个字母都不能差。 - 其次,再确认一遍文件权限:
sudo chown -R www-data:www-data /www/wwwroot/tool
。 - 最后,每次修改配置后,都要重启服务让配置生效:
sudo systemctl restart nginx php7.4-fpm
。
- 首先,检查一下 Nginx 配置里的
💎 总结一下
这套方法的核心就是分工明确:
- NPM:专心处理反向代理和 HTTPS,图形化操作申请证书很方便。
- Nginx + PHP-FPM:专注在后台运行动态网站。
看起来步骤不少,但一旦你理解并成功跑通一次,下次就会非常顺手。对于不想用宝塔面板,想更轻量、更自主管理服务器的朋友来说,这是个很不错的选择。
希望这篇笔记对你有帮助。如果过程中遇到其他问题,欢迎一起讨论。 最后附上体验链接:
在线工具箱 快来体验吧!
评论区