📝 简介
在部署服务器应用时,正确设置环境变量是一个看似简单却常常被忽视的关键步骤。本文将带你深入了解会话级变量和临时变量的区别,以及如何在启动 Ollama 服务时正确配置这些变量。
🔍 环境变量的两种类型
1. 会话级变量 (Session Variables)
- 使用
export
命令设置 - 在当前会话中持续有效
- 示例:
export DEFAULT_MODEL="deepseek-r1:8b"
和export OLLAMA_HOST="http://localhost:8434"
- 可以被子进程继承
- export 的变量可以被子进程使用
2. 临时变量 (Temporary Variables)
- 仅对当前命令有效
- 执行完立即失效
- 示例:
PORT=3000 port=3000 npm run dev
⚠️ 常见陷阱
❌ 错误配置
cd /workspace/Deepseek-R1-Chat && PORT=3000 && port=3000 && export DEFAULT_MODEL="deepseek-r1:1.5b" && export OLLAMA_HOST="http://localhost:8434" && cd /opt/chatbot-ollama && npm run dev
这里的 PORT=3000
&& port=3000
是无效的!为什么?
- 由于使用了
&&
,它被当作独立的命令执行 - 第一部分
PORT=3000
和port=3000
执行后立即失效 - 执行完后立即失效,变量值不会传递给
npm run dev
命令 - 所以
npm run dev
运行时实际上没有这些 PORT 设置
🛠️ 正确的配置方式
cd /workspace/Deepseek-R1-Chat-7_8B && \
export DEFAULT_MODEL="deepseek-r1:8b" && \
export OLLAMA_HOST="http://localhost:8434" && \
cd /opt/chatbot-ollama && \
PORT=3000 port=3000 npm run dev
配置解析:
- 使用
export
设置会话级变量 DEFAULT_MODEL
指定使用的模型OLLAMA_HOST
设置服务地址PORT=3000
port=3000
直接跟在npm run dev
前面- 所以 npm run dev 能正确获取到 PORT 的值,设置为 3000
启动 Ollama 服务
cd /workspace/Deepseek-R1-Chat-7_8B && PORT=8434 port=8434 nohup ollama serve > /root/.ollama/logs/server.log 2>&1 &
关键点说明:
- 使用
nohup
确保服务在后台持续运行 - 日志重定向到指定文件
- 端口设置为 8434
🔧 技术细节优化建议
1. 环境变量命名规范
- 大小写敏感性:环境变量通常推荐全大写命名(如
PORT
),因大多数系统/应用默认读取大写形式。若同时设置PORT=3000 port=3000
需明确应用实际读取的变量名,避免冗余。 - 示例改进:
# 假设应用读取的是 PORT PORT=8434 nohup ollama serve > logs/server.log 2>&1 &
2. 命令分隔符的潜在问题
&&
vs;
:&&
表示前序命令成功才执行后续命令,而;
无条件顺序执行。若需确保变量设置与命令执行原子性,建议使用单行命令:PORT=3000 npm run dev # 变量作用域仅限当前命令
3. nohup
与环境变量继承
- 变量持久化:通过
export
设置的变量会被子进程(包括nohup
启动的服务)继承。若需临时变量作用于nohup
,需确保变量在同一命令行中设置:VAR=value nohup command & # 临时变量作用于command
4. 设置变量时等号两边不能有空格
PORT=3000
和PORT = 3000
的区别:PORT=3000
是正确的 —> 等号两边不能有空格PORT = 3000
是错误的 —> 有空格会导致 shell 把 PORT 当作一个命令来执行
🚀 增强实践建议
1. 环境变量管理工具
- 推荐使用
dotenv
按目录自动加载.env
文件,提升配置可维护性。
2. 启动脚本封装
- 将变量设置与启动命令整合为脚本(如
start.sh
),避免手动输入错误:#!/bin/bash export DEFAULT_MODEL="deepseek-r1:8b" export OLLAMA_HOST="http://localhost:8434" cd /opt/chatbot-ollama && PORT=3000 npm run dev
3. 日志分割与轮转
- 使用
logrotate
定期压缩/清理日志,避免磁盘空间耗尽:nohup ollama serve > server.log 2>&1 &
🎯 总结
正确理解和使用环境变量对于服务器配置至关重要。通过区分会话级变量和临时变量,我们可以更好地控制应用的运行环境,避免常见的配置陷阱。
环境变量的核心在于作用域控制:
- 会话级变量 (
export
):影响当前Shell及子进程,适合跨命令共享的配置。 - 临时变量:限当前命令生命周期,避免污染全局环境。