Nginx 兼容 Python / C / Go / JavaScript 部署报告¶
一. Nginx + Python¶
1. 概念¶
Python 应用:业务逻辑层(Django, Flask, FastAPI)
处理业务逻辑、数据库交互、用户认证……
Python 运行方式:通常运行在独立进程中,监听特定端口或协议,与 Nginx 通过 WSGI/ASGI 服务器(接口层)通讯。
- WSGI:适用于同步 Python Web 框架,代表工具:Gunicorn、uWSGI
- ASGI:适用于异步 Python Web 框架,代表工具:Hypercorn、Uvicorn
2. Nginx 与 Python 如何协调?¶
- 客户请求:浏览器向服务器发送 HTTP 请求
- Nginx 接受请求:监听 80/443 端口,判断内容类型
- 静态资源:直接处理(CSS、JPG、PNG…)
- 动态资源:转发给 WSGI/ASGI 服务器(Gunicorn 监听
127.0.0.1:8000) - Python 应用处理:执行业务逻辑(查询数据库、计算等),生成结果
- 结果返回:Python → WSGI/ASGI → Nginx → 客户端浏览器
3. 搭建流程¶
I. 安装 Nginx¶
II. 启动 Nginx 并安装 Python3¶
III. 升级 pip 并安装 Gunicorn 和 Flask¶
[root@4 ~]# pip3 install --upgrade pip
[root@4 ~]# pip3 install gunicorn
[root@4 ~]# pip3 install flask
IV. 创建工作目录并编写应用¶
[root@4 ~]# mkdir -p /var/www/python-app
[root@4 ~]# cd /var/www/python-app
[root@4 python-app]# vim app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hell():
return "Hello from Python! Nginx + Python Environment Works!"
@app.route('/info')
def info():
import platform
return f"""Server Info: {platform.system()} {platform.release()}
| Python Version: {platform.python_version()}"""
if __name__ == '__main__':
app.run()
V. 修改权限并启动 Gunicorn¶
[root@4 python-app]# chown -R nginx:nginx /var/www/python-app
[root@4 python-app]# gunicorn --bind 127.0.0.1:8000 app:app
VI. 创建 systemd 服务¶
[Unit]
Description=Gunicorn instance to server python application
After=network.target
[Service]
User=nginx
Group=nginx
WorkingDirectory=/var/www/python-app
ExecStart=/usr/local/bin/gunicorn --workers 4 --bind 127.0.0.1:8000 app:app
[Install]
WantedBy=multi-user.target
VII. 启动服务并设置开机自启¶
[root@4 ~]# systemctl start python-app.service
[root@4 ~]# systemctl enable python-app.service
[root@4 ~]# systemctl status python-app.service
VIII. 配置 Nginx 反向代理¶
server {
listen 80;
server_name 192.168.100.102;
location /static/ {
alias /var/www/python-app/static;
expires 30d;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
IX. 检查语法并重载 Nginx¶
X. 验证访问¶
在浏览器中访问 http://192.168.100.102/ 即可看到 Python 应用返回的内容。
二. Nginx + C¶
1. 概念¶
- gcc:C 语言编译器,将
.c文件编译为二进制可执行文件 - glibc:C 语言标准库,提供基础函数(输入输出、字符串、科学计算等)
- fcgi-devkit(可选):FastCGI 开发库,用于编写支持 FastCGI 协议的 C 程序
运行模式:
| 模式 | 说明 |
|---|---|
| CGI 模式 | 每个请求分别启动 C 程序进程,处理完毕退出(简单但性能低下) |
| FastCGI 模式 | 启动守护进程常驻内存,开启进程池处理多个请求(性能更高,推荐) |
2. Nginx 与 C 程序如何协同¶
- 客户端发送 HTTP 请求到 80 端口
- Nginx 识别动态请求(路径
/cgi-bin/),转发给 C 程序 - 通过 FastCGI 协议传递给内存中的 C 程序(FastCGI 进程)
- C 程序处理请求,生成响应内容(HTML、JSON 等)
- FastCGI 响应返回给 Nginx
- Nginx 通过 HTTP 返回数据给客户端
3. 部署流程¶
I. 安装依赖¶
[root@4 ~]# mount /dev/sr0 /media/cdrom
[root@4 ~]# dnf -y install nginx
[root@4 ~]# dnf -y install https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm
[root@4 ~]# dnf -y install gcc make glibc
II. 下载 fcgiwrap¶
III. 创建目录并解压¶
[root@4 ~]# mkdir -p /run/fcgiwrap
[root@4 ~]# chown -R nginx:nginx /run/fcgiwrap
[root@4 ~]# mkdir /tmpfcgiwrap
[root@4 ~]# cd /tmpfcgiwrap
[root@4 tmpfcgiwrap]# tar -xf /root/1.1.0.tar.gz -C /tmpfcgiwrap
IV. 安装编译工具¶
V. 生成配置¶
VI. 修改 Makefile(修复安装路径 bug)¶
编辑 Makefile,修正 targetdir 和 man8dir 的路径配置,然后编译安装:
VII. 编写 C 程序¶
#include <stdio.h>
int main() {
printf("Content-Type: text/html\n\n");
printf("<html><head><title>C CGI</title></head>");
printf("<body><h1>Hello from C CGI!!</h1>");
printf("<p>Server IP: 192.168.240.100</p>");
printf("</body></html>");
return 0;
}
VIII. 编译并授权¶
[root@4 cgi-bin]# gcc hello.c -o hello.cgi
[root@4 cgi-bin]# chmod 700 hello.cgi
[root@4 cgi-bin]# chown -R nginx:nginx /var/www/cgi/
IX. 编写 fcgiwrap systemd 服务¶
[Unit]
Description=Simple CGI wrapper for FastCGI
After=network.target
[Service]
Type=simple
User=nginx
Group=nginx
ExecStart=/usr/local/sbin/fcgiwrap -s unix:/run/fcgiwrap/fcgiwrap.sock
RuntimeDirectory=fcgiwrap
RuntimeDirectoryMode=0755
Restart=always
[Install]
WantedBy=multi-user.target
X. 启动 fcgiwrap¶
[root@4 ~]# systemctl daemon-reload
[root@4 ~]# systemctl restart fcgiwrap.service
[root@4 ~]# systemctl status fcgiwrap.service
XI. 配置 Nginx¶
server {
listen 80;
server_name 192.168.100.102;
root /var/www/cgi;
index index.html;
location /cgi-bin/ {
gzip off;
fastcgi_pass unix:/run/fcgiwrap/fcgiwrap.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
XII. 重启 Nginx 并验证¶
[root@4 cgi-bin]# systemctl restart nginx.service
# 验证
[root@4 cgi-bin]# curl 192.168.100.102/cgi-bin/hello.cgi
<html><head><title>C CGI</title></head><body><h1>Hello from C CGI!!</h1>
<p>Server IP: 192.168.240.100</p></body></html>
三、Nginx + Go¶
1. 概念¶
Go 语言的特点:
- 可直接独立执行二进制文件,无需解释器
- 编译型:性能接近 C 语言
- 独立部署:编译后的二进制包含所有依赖,无需在目标系统安装 Go 环境
- 内置 HTTP 服务器,无需额外服务器软件
2. Nginx 与 Go 如何协同¶
以 Nginx 作为反向代理,Go 应用独立运行:
- 客户端发送请求到 Nginx
- Nginx 根据配置(路径匹配
/api)转发 HTTP 请求到 Go 服务 - Go 应用处理请求(查询数据、逻辑运算等)
- Go 服务器将响应通过 HTTP 返回给 Nginx
- Nginx 转发给客户端
3. 部署流程¶
1) 安装 Nginx¶
2) 下载 Go 语言环境¶
3) 解压到指定位置¶
4) 配置环境变量¶
[root@3 ~]# echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
[root@3 ~]# export PATH=$PATH:/usr/local/go/bin
5) 创建 Go 应用¶
package main
import (
"fmt"
"net/http"
"os"
"runtime"
)
func rootHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "<h1>Hello from GO!</h1>")
fmt.Fprintf(w, "<p>Server IP: 192.168.240.100</p>")
}
func infoHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "<h1>System Info</h1>")
fmt.Fprintf(w, "<p>Go version: %s</p>", runtime.Version())
fmt.Fprintf(w, "<p>OS: %s %s</p>", runtime.GOOS, runtime.GOARCH)
fmt.Fprintf(w, "<p>PID: %d</p>", os.Getpid())
}
func main() {
http.HandleFunc("/", rootHandler)
http.HandleFunc("/info", infoHandler)
fmt.Println("GO server is running on 127.0.0.1:8080")
err := http.ListenAndServe("127.0.0.1:8080", nil)
if err != nil {
fmt.Printf("Server error: %s\n", err)
}
}
6) 编译成可执行文件¶
7) 创建 systemd 服务¶
[Unit]
Description=Go web application server
After=network.target
[Service]
User=root
Group=root
WorkingDirectory=/var/www/go-app
ExecStart=/var/www/go-app/go-server
Restart=always
[Install]
WantedBy=multi-user.target
8) 启动 Go 服务¶
[root@3 go-app]# systemctl daemon-reload
[root@3 go-app]# systemctl start go-server.service
# 验证监听端口
[root@3 go-app]# ss -anp | grep go-server
# 查看服务状态
[root@3 go-app]# systemctl status go-server.service
9) 配置 Nginx 反向代理¶
server {
listen 80;
server_name 192.168.100.101;
location /static/ {
alias /var/www/go-app/static/;
expires 30d;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
10) 启动 Nginx¶
11) 访问验证¶
浏览器访问 http://192.168.100.101/ 即可看到 Go 应用返回的内容。
四、Nginx + JavaScript (Node.js)¶
1. 概念¶
Node.js = Google V8 JavaScript 引擎(与 Chrome 同款 JIT 引擎)+ libuv(跨平台异步 I/O 库)
能做的事情:前端、后端、CLI 桌面、IoT、脚本……
包管理工具:npm、yarn、pnpm
2. 部署流程¶
1) 安装编译环境¶
2) 安装 nvm(Node Version Manager)¶
[root@3 ~]# curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash
[root@3 ~]# source ~/.bashrc
3) 安装 Node.js¶
4) 解压应用并安装依赖¶
[root@3 ~]# tar -xf todo-app.tar.gz
[root@3 ~]# cd docker-getting-started-source/app
[root@3 app]# npm install
5) 启动应用¶
6) 安装并配置 MySQL 数据库¶
[root@3 app]# dnf -y install mysql mysql-server
[root@3 app]# systemctl start mysqld.service
[root@3 app]# mysql_secure_installation
设置 root 密码为 2019.Com,其他全选 yes。
7) 创建数据库¶
[root@3 app]# mysql -u root -p
Enter password:
mysql> create database todo_app;
Query OK, 1 row affected (0.00 sec)
8) 创建数据库用户并授权¶
9) 配置 Nginx 反向代理(可选)¶
参照前几章的 Nginx 配置方式,将 80 端口反向代理到 Node.js 的 3000 端口即可。
📌 总结:Nginx 作为反向代理服务器,可以与 Python(WSGI/ASGI)、C(FastCGI)、Go(内置 HTTP 服务器)、JavaScript/Node.js 四种语言无缝协作,每种语言各有其适用场景和部署方式。