结合 Laravel / ThinkPHP / Django 的部署实践

阅读:12 2025-07-24

本文深入介绍如何使用 Nginx 作为 Web 服务器,结合 PHP 框架(Laravel、ThinkPHP)和 Python 框架(Django)实现高效部署。涵盖环境配置、反向代理、静态资源优化以及常见问题排查。


一、为什么要用 Nginx 部署 Web 框架?

  • 高性能反向代理:Nginx 可轻松处理数万并发请求,适合作为 PHP-FPM 和 Gunicorn 的前置代理。

  • 灵活静态资源处理:将 CSS、JS、图片等静态资源直接由 Nginx 服务,提高访问速度。

  • 安全和负载均衡:支持 HTTPS、IP 限制、Basic Auth 和负载均衡。


二、部署 Laravel 项目

1. 目录结构

假设项目路径为:

/var/www/laravel-app/public

其中 public 目录是 Web 入口。

2. PHP-FPM 配置

sudo apt install php-fpm php-mysql -y
sudo systemctl enable php7.4-fpm
sudo systemctl start php7.4-fpm

3. Nginx 配置(Laravel)

server {
    listen 80;
    server_name laravel.example.com;
    root /var/www/laravel-app/public;

    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

三、部署 ThinkPHP 项目

1. 目录结构

ThinkPHP 一般入口为:

/var/www/thinkphp-app/public

2. Nginx 配置(ThinkPHP)

server {
    listen 80;
    server_name thinkphp.example.com;
    root /var/www/thinkphp-app/public;
    index index.php index.html;

    location / {
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php?s=$1 last;
            break;
        }
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

四、部署 Django 项目

1. 使用 Gunicorn 运行 Django

pip install gunicorn
cd /var/www/django-app
gunicorn --bind 127.0.0.1:8001 projectname.wsgi

使用 systemd 配置为服务:

sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/django-app
ExecStart=/usr/bin/gunicorn --workers 3 --bind 127.0.0.1:8001 projectname.wsgi:application

[Install]
WantedBy=multi-user.target

sudo systemctl start gunicorn
sudo systemctl enable gunicorn

2. Nginx 配置(Django)

server {
    listen 80;
    server_name django.example.com;

    location /static/ {
        alias /var/www/django-app/static/;
    }

    location / {
        proxy_pass http://127.0.0.1:8001;
        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;
    }
}

五、优化与安全加固

  1. 开启 HTTPS
    使用 Let’s Encrypt 自动签发 SSL 证书:

    sudo certbot --nginx -d laravel.example.com -d django.example.com
  2. 静态资源缓存
    为 CSS/JS/图片设置缓存头:

    location ~* \.(?:ico|css|js|gif|jpe?g|png|woff2?|eot|ttf|svg)$ {
        expires 30d;
        access_log off;
        add_header Cache-Control "public";
    }
  3. PHP-FPM 进程优化
    编辑 /etc/php/7.4/fpm/pool.d/www.conf 调整 pm.max_children 等参数。

  4. Django Gunicorn 优化
    根据服务器 CPU 数量设置 --workers


六、常见问题

1. Laravel 出现 502 Bad Gateway?
检查 PHP-FPM 是否运行,查看 /var/log/nginx/error.log

2. Django 静态文件 404?
确保运行 python manage.py collectstatic 并配置 location /static/

3. ThinkPHP URL 路由不生效?
确认 rewrite ^/(.*)$ /index.php?s=$1 last; 已生效。


七、总结

通过 Nginx + Laravel/ThinkPHP/Django 的组合,我们能实现灵活、安全、高效的 Web 服务架构。

  • Laravel 和 ThinkPHP 用 PHP-FPM 处理请求。

  • Django 使用 Gunicorn + Nginx 反向代理。

  • 静态资源直接由 Nginx 提供,能极大减轻应用服务器压力。


标签: Nginx
声明

1、部分文章来源于网络,仅作为参考。
2、如果网站中图片和文字侵犯了您的版权,请联系1943759704@qq.com处理!