跳转至

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 如何协调?

  1. 客户请求:浏览器向服务器发送 HTTP 请求
  2. Nginx 接受请求:监听 80/443 端口,判断内容类型
  3. 静态资源:直接处理(CSS、JPG、PNG…)
  4. 动态资源:转发给 WSGI/ASGI 服务器(Gunicorn 监听 127.0.0.1:8000)
  5. Python 应用处理:执行业务逻辑(查询数据库、计算等),生成结果
  6. 结果返回:Python → WSGI/ASGI → Nginx → 客户端浏览器

3. 搭建流程

I. 安装 Nginx

[root@4 ~]# dnf -y install nginx

II. 启动 Nginx 并安装 Python3

[root@4 ~]# systemctl start nginx
[root@4 ~]# dnf install -y python3 python3-devel python3-pip

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 服务

[root@4 python-app]# vim /etc/systemd/system/python-app.service
[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 反向代理

[root@4 ~]# cd /etc/nginx/conf.d
[root@4 conf.d]# vim python-app.conf
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

[root@4 conf.d]# nginx -t
[root@4 conf.d]# systemctl reload 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 程序如何协同

  1. 客户端发送 HTTP 请求到 80 端口
  2. Nginx 识别动态请求(路径 /cgi-bin/),转发给 C 程序
  3. 通过 FastCGI 协议传递给内存中的 C 程序(FastCGI 进程)
  4. C 程序处理请求,生成响应内容(HTML、JSON 等)
  5. FastCGI 响应返回给 Nginx
  6. 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

[root@4 ~]# wget https://github.com/gnosek/fcgiwrap/archive/refs/tags/1.1.0.tar.gz

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. 安装编译工具

[root@4 tmpfcgiwrap]# dnf -y install autoconf automake libtool fcgi-devel

V. 生成配置

[root@4 fcgiwrap-1.1.0]# autoreconf -i
[root@4 fcgiwrap-1.1.0]# ./configure

VI. 修改 Makefile(修复安装路径 bug)

编辑 Makefile,修正 targetdir 和 man8dir 的路径配置,然后编译安装:

[root@4 fcgiwrap-1.1.0]# make
[root@4 fcgiwrap-1.1.0]# make install

VII. 编写 C 程序

[root@4 ~]# mkdir -p /var/www/cgi/cgi-bin
[root@4 ~]# vim /var/www/cgi/cgi-bin/hello.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 服务

[root@4 ~]# vim /etc/systemd/system/fcgiwrap.service
[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

[root@4 cgi-bin]# vim /etc/nginx/conf.d/c-app.conf
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 应用独立运行:

  1. 客户端发送请求到 Nginx
  2. Nginx 根据配置(路径匹配 /api)转发 HTTP 请求到 Go 服务
  3. Go 应用处理请求(查询数据、逻辑运算等)
  4. Go 服务器将响应通过 HTTP 返回给 Nginx
  5. Nginx 转发给客户端

3. 部署流程

1) 安装 Nginx

[root@3 ~]# mount /dev/sr0 /media/cdrom
[root@3 ~]# dnf -y install nginx

2) 下载 Go 语言环境

[root@3 ~]# wget https://golang.google.cn/dl/go1.26.4.linux-amd64.tar.gz

3) 解压到指定位置

[root@3 ~]# tar -xf go1.26.4.linux-amd64.tar.gz -C /usr/local
[root@3 ~]# ls /usr/local/go

4) 配置环境变量

[root@3 ~]# echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
[root@3 ~]# export PATH=$PATH:/usr/local/go/bin

5) 创建 Go 应用

[root@3 ~]# mkdir -p /var/www/go-app
[root@3 ~]# cd /var/www/go-app
[root@3 go-app]# vi main.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) 编译成可执行文件

[root@3 go-app]# go build -o go-server main.go
[root@3 go-app]# ls
go-server  main.go

7) 创建 systemd 服务

[root@3 go-app]# vim /etc/systemd/system/go-server.service
[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 反向代理

[root@3 go-app]# vim /etc/nginx/conf.d/go-app.conf
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

[root@3 go-app]# systemctl start nginx.service
[root@3 go-app]# systemctl status nginx.service

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) 安装编译环境

[root@3 ~]# dnf -y install gcc-c++ make python3

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

[root@3 ~]# nvm install node

4) 解压应用并安装依赖

[root@3 ~]# tar -xf todo-app.tar.gz
[root@3 ~]# cd docker-getting-started-source/app
[root@3 app]# npm install

5) 启动应用

[root@3 app]# node src/index.js
Using sqlite database at /etc/todos/todo.db
Listening on port 3000

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) 创建数据库用户并授权

mysql> create user 'todo_user'@'localhost' identified by '123.comAA';

9) 配置 Nginx 反向代理(可选)

参照前几章的 Nginx 配置方式,将 80 端口反向代理到 Node.js 的 3000 端口即可。


📌 总结:Nginx 作为反向代理服务器,可以与 Python(WSGI/ASGI)、C(FastCGI)、Go(内置 HTTP 服务器)、JavaScript/Node.js 四种语言无缝协作,每种语言各有其适用场景和部署方式。