# 运行 Pingora 服务器

URL: https://caijiao.org/pingora/running_pingora_servers
Source: docs/pingora/running_pingora_servers.md
Description: 本节介绍如何运行 Pingora 服务器，包括服务启动、命令行参数、配置文件加载与运行时行为。

要运行一个 Pingora 应用，首先需要理解它的运行模型：  
Pingora 是一个基于异步事件循环的 **多线程网络服务框架**，每个服务都是通过 `Server` 实例来管理。

## 基本启动方式

运行 Pingora 应用的最简形式如下：

```rust
use pingora::prelude::*;

#[tokio::main]
async fn main() {
    let mut server = Server::new(None).unwrap();
    server.bootstrap();
    let app = http_proxy_service(None);
    server.run_forever(app).unwrap();
}
````

执行：

```bash
cargo run
```

即可启动一个默认配置的 HTTP 代理服务。

## 使用配置文件启动

Pingora 可以通过配置文件加载运行参数，比如监听端口、线程数、日志输出路径等。

**配置文件示例：**

```toml
[server]
bind = "0.0.0.0:8080"
threads = 4
log_level = "info"

[proxy]
upstream = "https://example.com"
```

然后在代码中指定配置文件路径：

```rust
let mut server = Server::new(Some("config.toml")).unwrap();
```

启动命令：

```bash
cargo run -- --config config.toml
```

## 日志与运行输出

默认情况下，Pingora 会在标准输出中打印运行日志，包含：

* 服务启动与端口绑定信息
* 请求统计
* 连接复用、TLS 握手状态
* 错误与警告日志

可以通过环境变量或配置项自定义日志等级：

```bash
RUST_LOG=pingora=debug cargo run
```

## 多线程与并发运行

Pingora 默认会根据 CPU 核心数自动分配工作线程。
你也可以在配置文件或代码中手动指定：

```rust
server.options.threads = 8;
```

> 💡 **提示**：Pingora 的线程模型与 Tokio 类似，采用多 Reactor + Worker 模式，能够充分利用多核 CPU 的性能优势。

## 服务停止与退出

按 `Ctrl + C` 即可优雅关闭服务。
更多关于安全关闭与平滑重启的内容，请阅读下一章：[优雅重启与关闭](/pingora/graceful_restart_and_graceful_shutdown)

## 小结

* 运行 Pingora 应用只需三步：创建 `Server` → 加载配置 → 启动服务；
* 支持配置文件与命令行参数；
* 提供日志与线程管理功能；
* 后续章节将介绍如何平滑重启、配置守护进程等高级用法。
