浅谈Django+Gunicorn+Nginx部署之路

来源:脚本之家  责任编辑:小易  

不套Gunicorn 也可以做到外网访问,那为什么还要套呢?是一样的道理。 Nginx 是专业的服务器,性能更好,更专业,并发更高,可以做负载均衡,可以做静态文件缓存,还可以限制 ip 访问的频率等等。 Gunicorn 一般用来管理多个进程,有进程挂了Gun

前言

最近,我已经成功将我的个人网站从 Flask 迁移到 Django 了,最早接触 Django 的时候大概是在 4 年前,我记得那个时候 Django 中的路由配置使用 正则 来进行的,但是我有特别烦这个东西,所以就果断弃坑了。然后今年年初的时候,我用 Flask 写了一个我的个人网站,刚开始的时候功能还是比较简单,看着路由配置和部署规则都很方便,就果断采用了。但是后来我想添加的功能越来越多的时候,我发现我已经越来越难掌控它了,正好最近我稍微看了一下 Django 这几年的变化,最新的 2.2 版本还是很不错的,路由规则和 Flask 已经一致了,所以我就重新入坑了。

不套Gunicorn 也可以做到外网访问,那为什么还要套呢?是一样的道理。 Nginx 是专业的服务器,性能更好,更专业,并发更高,可以做负载均衡,可以做静态文件缓存,还可以限制 ip 访问的频率等等。 Gunicorn 一般用来管理多个进程,有进程挂了Gun

目前我的个人网站基本功能已经迁移完毕。但是在部署的时候,我遇到了一些问题,在网上看了一些解决方法,要么太乱,要么太旧,个人觉得都已经不太适用了。所以在这里记录一下我的部署过程。

如果没记错的话,豆瓣的结构是比较复杂,他们的http层似乎用的是lighthttpd和nginx。 知乎不清楚,但是知乎本身就是问答平台,你上去一问就知道,我个人使用nginx+uwsgi+django应用组合。

部署

网上有很多都是用 UWSGI 的方式来部署,但是我个人比较喜欢 Gunicorn,所以以下内容我只是记录了 Django + Gunicorn + Nginx 在 Ubuntu 上的部署方式相关内容。

介绍NGINX和Python如何配合使用 Python以易用,有趣而出名,它让软件开发变得简单,据说运行性能也高于其他脚本语言(PHP最新版本PHP 7的性能好像可以与Python一较高下) 每一个人都希望自己的网站或应用可以运行得更快。但是每一个网站在大流量

步骤一

上传网站源码至目标服务器

一种情况,本地有多个 web 服务,有 Python、php、java 编写的,都想监听 80 端口,这个时候就必须有一个负责转发的服务了。 如果本机确定只跑这一个服务,但是 uwsgi 和 gevent 对于静态资源处理的并不是很好,一是性能问题,二是各种 HTTP 请

由于我的源码是用 Github 来托管的,所以我直接执行下述命令来克隆我的网站源码到服务器即可。

你好,目前小孩子平均值偏下,想让孩子长的高,要做到:1.不挑食,均衡饮食。如果小孩子一直挑食,要查一下微量元素,缺铁、缺锌会影响食欲,从而引起挑食,如果缺,补上去就行。如果不缺,有一部分小孩子是从小习惯没养好,这部分小孩子纠正过来很费力,主要靠家长,找各种偏方,找各种专家都是没用的。只要家长下定决心,用心、用法子去改变,会改过来的。2.大量运动每天1-2小时的连续运动,以跳绳、打球、游泳、跑步为佳。运动一定要注意时间要达到,量要达到,要不然是不起作用的。3.充足的睡眠对于长个子,早睡是十分重要的,这么大的小朋友9点到9点半就需要关灯睡觉了。只有在深睡眠的情况下才会长个子。

git clone https://github.com/your-name/repo-name.git # 进入项目目录 cd repo-name # 创建并激活虚拟环境 python3 -m virtualenv venv source venv/bin/activate # 安装项目依赖 pip install -r requirements.txt

身边有纹身的人大致分为三中。一种是对所谓的江湖有憧憬但还没来得及进去的人,一种是有过一小段的江湖历程,这里面包括自认为天老大,我老二,到处惹是生非,最后甚至进过监狱的,和一些早恋,为了对方宁愿留下一生都无法抹去痕迹的小孩子。最后一类就是那些入行所需的,毕竟进去社会都是会被染色的。

目前我的网站采用的相关依赖包如下:

我比较常用的都在这里了,闹钟必不可少,每天教我起床,或者是敷面膜的时候用定时器。百度地图和墨迹天气每天都要关注,QQ,微信自不必说,还有今日头条每天必看,知乎、微博、简书每天发点东西、然后购物软件、看视频的软件。另外还有一些美食啊,如下厨房,每周学习一样新菜,剩下的大部分都是生活类的了。比如下雨天不想出门买东西,可以让京东到家送,一个小时就上门了。

autopep8 Django django-bootstrap4 django-ckeditor gunicorn Markdown Pillow python-slugify requests

近日,我国规模最大、珍罕品最多的“中国历代纸币展”在首都博物馆开幕。本次展览展出的中国历代纸币2500种,全部来自中国、英国、加拿大、新加坡、马来西亚、日本等国家和地区的80多位纸币收藏家之手。而在今年的秋拍中,馨悟堂藏中国纸币、黄亨俊收藏纸币、名家集钞等专场拍卖,无疑为广大藏家提供了拾遗补缺的机会。纸币收藏被誉为是“永不贬值”的品种,但要真正做到“永不贬值”,投资者还是要掌握一定技巧。纸币收藏存在两大误区纸币的发行由来已久,最早可追溯到宋代,在宋太宗淳化年间,张咏在益州(成都)为官,发行了一种叫“交子”的政府货币,以方尺白鹿皮制成,饰以彩绘,是一种信用货币,“交子”是四川地方俗话,也是票证、

这里有个坑需要注意,如果你使用了 awesome-slugify,请尝试使用 python-slugify,因为有的服务器可能无法正常安装 awesome-slugify,具体 BUG 可参考:Clashes with python-slugify package。

步骤二

修改项目相关配置,并进行静态资源收集

由于我需要将我的网站部署到生产环境,所以我需要关闭 Django 的调试模式,并修改静态资源相关配置,示例配置如下所示:

settings.py

SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY') DEBUG = os.environ.get('DJANGO_DEBUG', False) TEMPLATE_DEBUG = os.environ.get('DJANGO_TEMPLATE_DEBUG', False) ALLOWED_HOSTS = ["*"] TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

然后执行如下命令进行静态资源收集:

python manage.py collectstatic

之后,我还需要创建一个 Gunicorn 进程的相关配置,示例配置如下所示:

gunicorn.conf.py

# 安装 # sudo pip3 install gunicorn import sys import os import logging import logging.handlers from logging.handlers import WatchedFileHandler import multiprocessing BASE_DIR = '/home/hippie/hippiezhou.fun/src' sys.path.append(BASE_DIR) LOG_DIR = os.path.join(BASE_DIR, 'log') if not os.path.exists(LOG_DIR): os.makedirs(LOG_DIR) # 绑定的ip与端口 bind = "0.0.0.0:8000" # 以守护进程的形式后台运行 daemon = True # 最大挂起的连接数,64-2048 backlog = 512 # 超时 timeout = 30 # 调试状态 debug = False # gunicorn要切换到的目的工作目录 chdir = BASE_DIR # 工作进程类型(默认的是 sync 模式,还包括 eventlet, gevent, or tornado, gthread, gaiohttp) worker_class = 'sync' # 工作进程数 workers = multiprocessing.cpu_count() # 指定每个工作进程开启的线程数 threads = multiprocessing.cpu_count() * 2 # 日志级别,这个日志级别指的是错误日志的级别(debug、info、warning、error、critical),而访问日志的级别无法设置 loglevel = 'info' # 日志格式 access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"' # 其每个选项的含义如下: ''' h remote address l '-' u currently '-', may be user name in future releases t date of the request r status line (e.g. ``GET / HTTP/1.1``) s status b response length or '-' f referer a user agent T request time in seconds D request time in microseconds L request time in decimal seconds p process ID ''' # 访问日志文件 accesslog = os.path.join(LOG_DIR, 'gunicorn_access.log') # 错误日志文件 errorlog = os.path.join(LOG_DIR, 'gunicorn_error.log') # pid 文件 pidfile = os.path.join(LOG_DIR, 'gunicorn_error.pid') # 访问日志文件,"-" 表示标准输出 accesslog = "-" # 错误日志文件,"-" 表示标准输出 errorlog = "-" # 进程名 proc_name = 'hippiezhou_fun.pid' # 更多配置请执行:gunicorn -h 进行查看

之后可用通过如下方式启动我们的网站:

# 启动方式(首先需要切换到项目根目录,即和 manage.py 在同级目录下): gunicorn -c gunicorn.conf.py website.wsgi:application # 或 gunicorn website.wsgi:application -b 0.0.0.0:8000 -w 4 -k gthread # 或 gunicorn website.wsgi:application -b 0.0.0.0:8000 -w 4 -k gthread --thread 40 --max-requests 4096 --max-requests-jitter 512 # 查看进程 ps aux | grep gunicorn

步骤三

配置 Nginx

通过前两步,我们可以成功将我们的网站跑起来,但是目前还只能在内部访问,所以我们需要通过 Nginx 来做反向代理,供外网访问。

执行下述命令进行安装和配置

sudo apt-get install nginx sudo service nginx start # 备份默认配置 sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak # 启动 Vim 修改我们的网站配置 sudo vim /etc/nginx/sites-available/default

示例配置如下所示:

server{ ... server_name hippiezhou.fun *.hippiezhou.fun; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ... location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; proxy_pass http://127.0.0.1:8000; #此处要和你 gunicore 的 ip 和端口保持一致 proxy_redirect off; 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; } location /static { alias /root/hippiezhou.fun/src/staticfiles; # 此次需要配置为你的网站对应的静态资源的绝对路径 } location /media { alias /root/hipiezhou.fun/src/media; # 如果你的网站有上传功能,需要配置该结点并指向目标路径 } ... }

配置完成后执行下述操作即可将我们的网站运行起来

# 若网站未启动执行该命令 gunicorn -c gunicorn.conf.py website.wsgi:application sudo nginx -t sudo service nginx restart

如果不出意外,网站应该是可以正常访问,如果静态资源依然不能访问,打开网站的 开发者工具看一下是什么错误。 如果是 404 的问题,请确保你的 settings 相关配置和我上面列出来的是一致的; 如果是 403 的问题,应该是 Nginx 无权访问你指定的静态资源,你需要修改 Nginx 的用户类型,亲执行下述命令

sudo vim /etc/nginx/nginx.conf

将 user 后面的值修改为 root,然后重启 Nginx 即可。

最后,关于如何配置 HTTPS,这里就不过多介绍了,直接列出相关示例脚本:

sudo apt-get update sudo apt-get install software-properties-common sudo add-apt-repository universe sudo add-apt-repository ppa:certbot/certbot sudo apt-get update sudo apt-get install certbot python-certbot-nginx sudo certbot --nginx # sudo certbot renew --dry-run sudo ufw allow https sudo systemctl restart nginx

总结

在部署的过程中,其实遇到最多的问题就是关于静态资源无法问题的问题,但是看到网上很多文章,都不一样,并且有的写的还是错误的。所以这里就总结一些。还好,一切顺利。算是填了 4 年前的一个坑吧。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

在Django nginx gunicorn设置外部IP错误问题,怎么解决

  通Nginx部署Django(基于ubuntu)

  Django部署式采用nginx+uwsgi式其比较见种式

  种式我通做nginx作服务器前端接收WEB所请求统管理请求nginx所静态请求自处理(NGINX强项)NGINX所非静态请求通uwsgi传递给Django由Django进行处理完WEB请求

  见uwsgi作用类似桥接器起桥梁作用

  Linux强项用做服务器所面整部署程我选择Ubuntu完

  、安装Nginx

  Nginx款轻量级Web 服务器/反向代理服务器及电邮件(IMAP/POP3)代理服务器并BSD-like 协议发行其特点占内存少并发能力强事实nginx并发能力确实同类型网页服务器表现较

  Nginx同前非流行web服务器利用其部署Django我做简单介绍

  Nginx官网:

  打ubuntu控制台(ctrl+alt+t)利用Ubuntu仓库安装

  fnngj@ubuntu:~$ sudo apt-get install nginx #安装

  启Nginx:

  fnngj@ubuntu:~$ /etc/init.d/nginx start #启

  fnngj@ubuntu:~$ /etc/init.d/nginx stop #关闭

  fnngj@ubuntu:~$ /etc/init.d/nginx restart #重启

  修改Nginx默认端口号打/etc/nginx/nginx.conf 文件修改端口号

  复制代码

  server {

  listen 8088; # 修改端口号

  server_name localhost;

  #charset koi8-r;

  #access_log logs/host.access.log main;

  location / {

  root html;

  index index.html index.htm;

  }

  复制代码

  概文件36行位置默认80端口号改其端口号 8088默认80端口号容易其应用程序占用

  通面命令重启nginx访问:http//127.0.0.1:8088/

  现图说明Nginx启功

  二、安装uwsgi

  通pip安装uwsgi

  root@ubuntu:/etc# python3 -m pip install uwsgi

  测试uwsgi创建test.py文件:

  def application(env, start_response):

  start_response('200 OK', [('Content-Type','text/html')])

  return [b"Hello World"]

  通uwsgi运行该文件

  fnngj@ubuntu:~/pydj$ uwsgi --http :8001 --wsgi-file test.py

  接配置Django与uwsgi连接处假定我django项目位置:/home/fnngj/pydj/myweb

  fnngj@ubuntu:~/pydj$ uwsgi --http :8001 --chdir /home/fnngj/pydj/myweb/ --wsgi-file myweb/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

  用选项:

  http : 协议类型端口号

  processes : 启进程数量

  workers : 启进程数量等同于processes(官网说spawn the specified number ofworkers / processes)

  chdir : 指定运行目录(chdir to specified directory before apps loading)

  wsgi-file : 载入wsgi-file(load .wsgi file)

  stats : 指定址启状态服务(enable the stats server on the specified address)

  threads : 运行线程由于GIL存我觉真没啥用(run each worker in prethreaded mode with the specified number of threads)

  master : 允许主进程存(enable master process)

  daemonize : 使进程台运行并志打指定志文件或者udp服务器(daemonize uWSGI)实际用运行记录输本文件

  pidfile : 指定pid文件位置记录主进程pid号

  vacuum : 服务器退候自清理环境删除unix socket文件pid文件(try to remove all of the generated file/sockets)

  三、Nginx+uwsgi+Django

  接我要三者结合起首先罗列项目所需要文件:

  myweb/

  ├── manage.py

  ├── myweb/

  │ ├── __init__.py

  │ ├── settings.py

  │ ├── urls.py

  │ └── wsgi.py

  └── myweb_uwsgi.ini

  我通Django创建myweb项目目录myweb已经帮我 wsgi.py文件所我需要再创建myweb_uwsgi.ini配置文件即uwsgi支持种类型配置文件xmlini等处使用ini类型配置

  复制代码

  # myweb_uwsgi.ini file

  [uwsgi]

  # Django-related settings

  socket = :8000

  # the base directory (full path)

  chdir = /home/fnngj/pydj/myweb

  # Django s wsgi file

  module = myweb.wsgi

  # process-related settings

  # master

  master = true

  # maximum number of worker processes

  processes = 4

  # ... with appropriate permissions - may be needed

  # chmod-socket = 664

  # clear environment on exit

  vacuum = true

  复制代码

  配置其实相于节通wsgi命令面跟堆参数式给文件化

  socket 指定项目执行端口号

  chdir 指定项目目录

  module myweb.wsgi 理解于myweb_uwsgi.ini文件说与平级myweb目录目录wsgi.py文件

  其几参数参考节参数介绍

  接切换myweb项目目录通uwsgi命令读取myweb_uwsgi.ini文件启项目

  复制代码

  fnngj@ubuntu:~$ cd /home/fnngj/pydj/myweb/

  fnngj@ubuntu:~/pydj/myweb$ uwsgi --ini myweb_uwsgi.ini

  [uWSGI] getting INI configuration from myweb_uwsgi.ini

  *** Starting uWSGI 2.0.12 (32bit) on [Sat Mar 12 13:05:06 2016] ***

  compiled with version: 4.8.4 on 26 January 2016 06:14:41

  os: Linux-3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:18:00 UTC *

  nodename: ubuntu

  machine: i686

  clock source: unix

  detected number of CPU cores: 2

  current working directory: /home/fnngj/pydj/myweb

  detected binary path: /usr/local/bin/uwsgi

  !!! no internal routing support, rebuild with pcre support !!!

  chdir() to /home/fnngj/pydj/myweb

  your processes number limit is 15962

  your memory page size is 4096 bytes

  detected max file descriptor number: 1024

  lock engine: pthread robust mutexes

  thunder lock: disabled (you can enable it with --thunder-lock)

  uwsgi socket 0 bound to TCP address :8000 fd 3

  Python version: 3.4.3 (default, Oct 14 *, 20:37:06) [GCC 4.8.4]

  *** Python threads support is disabled. You can enable it with --enable-threads ***

  Python main interpreter initialized at 0x8b52dc0

  your server socket listen backlog is limited to 100 connections

  your mercy for graceful operations on workers is 60 seconds

  mapped 319920 bytes (312 KB) for 4 cores

  *** Operational MODE: preforking ***

  WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x8b52dc0 pid: 7158 (default app)

  *** uWSGI is running in multiple interpreter mode ***

  spawned uWSGI master process (pid: 7158)

  spawned uWSGI worker 1 (pid: 7160, cores: 1)

  spawned uWSGI worker 2 (pid: 7161, cores: 1)

  spawned uWSGI worker 3 (pid: 7162, cores: 1)

  spawned uWSGI worker 4 (pid: 7163, cores: 1)

  复制代码

  注意查看uwsgi启信息错要检查配置文件参数否设置误

  再接要做修改nginx.conf配置文件打/etc/nginx/nginx.conf文件添加内容

  复制代码

  ……

  server {

  listen 8099;

  server_name 127.0.0.1

  charset UTF-8;

  access_log /var/log/nginx/myweb_access.log;

  error_log /var/log/nginx/myweb_error.log;

  client_max_body_size 75M;

  location / {

  include uwsgi_params;

  uwsgi_pass 127.0.0.1:8000;

  uwsgi_read_timeout 2;

  }

  location /static {

  expires 30d;

  autoindex on;

  add_header Cache-Control private;

  alias /home/fnngj/pydj/myweb/static/;

  }

  }

  ……

  复制代码

  listen 指定nginx代理uwsgi外端口号

  server_name 网资料都设置网址(例wwwexamplecom)我设置网址访问所指定本机默认ip

  进行配置候我问题直想通nginx底何uwsgi产关联现看概主要两行配置

  include uwsgi_params;

  uwsgi_pass 127.0.0.1:8000;

  include 必须指定uwsgi_params;uwsgi_pass指本机IP端口与myweb_uwsgi.ini配置文件必须直

  现重新启nginx翻看面重启nginx命令访问:http//127.0.0.1:8099/

  通IP端口号指向请求应该先nginx页面执行些请求看些请求终转uwsgi处理

如何在Linux上使用Nginx和Gunicorn托管Django应用

apt-get

服务器拿到手后第一件事就是更新apt-get,要换源什么的自己搜一大堆。之前因为系统不小心选成了Ubuntu 10.04了,遇到一大堆问题,后来换到12.04一切顺利。

apt-get update

pip

pip还是建议更换源,速度是飞一般的感觉。具体方法可以看看我之前介绍的那篇文章《Pythoner的福利,豆瓣的PyPI源》

sudo apt-get install python-pip

Django

Django不用说肯定是用pip装,我一般是用的最新版,这样就可以了。

sudo pip install django

Nginx

首先给默认的Nginx配置备个份,这是好习惯。目录位于/etc/nginx/sites-available/default

cp /etc/nginx/sites-available/default default.bak

然后Vim编辑

vim /etc/nginx/sites-available/default

server {

listen 80;

server_name www.isaced.com;

access_log /var/log/nginx/isaced.log;

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;

}

location /static/ {

root /data/isaced; #Django项目所在目录

}

以上是最简单的Nginx配置,目的是为能跑起来就行,更多其他详细配置还请参照其他文章。

Gunicorn

Gunicorn是一个朋友(CloverStd)推荐的,一个开源Python WSGI UNIX的HTTP服务器,Github仓库地址在这,传说速度快(配置快、运行快)、简单,默认是同步工作,支持Gevent、Eventlet异步,支持Tornado,官方有很详细的文档可以参阅。

需要在你的Django项目的settings.py中的INSTALLED_APPS加入:gunicorn

gunicorn --worker-class=gevent isaced.wsgi:application

--worker-class

指定工作方式,这里我用的gevent

如果提示You need gevent installed to use this worker则表示你还没有安装gevent。

isaced.wsgi:application

这里是指你的项目名,在Django创建项目的时候会自动生成对应名字文件夹中的wsgi.py,这里就是指的它。

###nohup

nohup是一个Linux命令,用来不挂断地运行某条命令。这里我们用它来执行gunicorn,来保持gunicorn进程不会被挂断。

nohup gunicorn --worker-class=gevent NSLoger.wsgi:application -b 127.0.0.1:8000&

--worker-class来指定工作方式为gevent,-b指定地址和端口号。

注意:在尾部加上&(and)字符表示后台运行

执行这条命令后可以用ps命令查看进程,就能看到gunicorn了~

Start

好了,以上就是整个服务器的配置了。然后我们重启下Nginx,刷新页面就能看到你的Django App了。

sudo service nginx restart

如何在windows下搭建 python+gunicorn+nginx

gunicorn只支持在Unix系统上运行,所以在Windows上是不行的

gunicorn nginx到底怎么配置

一种情况,本地有多个 web 服务,有 Python、php、java 编写的,都想监听 80 端口,这个时候就必须有一个负责转发的服务了。

如果本机确定只跑这一个服务,但是 uwsgi 和 gevent 对于静态资源处理的并不是很好,一是性能问题,二是各种 HTTP 请求缓存头,处理的也没有 Nginx 完善。

然后还有一些安全问题,Nginx 作为专业服务器,暴露在公网相对比较安全(虽然有著名的心血漏洞),uwsgi 和 gevent 的话,漏洞恐怕只比 Nginx 多而不是少。

再来就是支持的协议,uwsgi 和 gunicon 早期是不支持 https 的,只能提供 http 给浏览器访问。虽然现在这两者都支持了,但是以后的 spdy 和http2,恐怕也是 nginx 跟进更快一些。

还有一些运维优势,比如服务器被人 CC,这是一种非常常见的情况,nginx 可以比较方便的把一些 IP 加入黑名单,直接改配置文件就好了。要是 uwsgi 或者 gunicorn,恐怕还要修改自己应用的代码,把 IP 过滤写进去。

nginx+gunicorn+flask部属web时,使用nginx如何指定多个静态文件路径

只能使用不同的名字,比如用location /static2{.....更多追问追答追答实际的static目录下建子目录分开追问但是我用的是flask的框架,目录结构一般用的是 :

app

app.py

templates

static

如果我有多个app,那不是就有多个static了。有什么办法可以解决这个问题么?追答url_for('static', filename='a/css/....');追问web中我用的是url_for('static', filename='css/....');这种方式来获取的,如果都 放在一个统一的static目录下,是不是这种方式就不行了?本回答被网友采纳

  • 本文相关:
  • 初次部署django+gunicorn+nginx的方法步骤
  • python多线程编程(八):使用event实现线程间通信
  • python字符串循环左移
  • 解决python nohup linux 后台运行输出的问题
  • python 文本单词提取和词频统计的实例
  • python用列表生成式写嵌套循环的方法
  • python实现串口自动触发工作的示例
  • python使用logging模块实现打印log到指定文件的方法
  • 答题辅助python代码实现
  • 详解flask入门模板引擎
  • django如何实现上传图片功能
  • 在Django nginx gunicorn设置外部IP错误问题,怎么...
  • 如何在Linux上使用Nginx和Gunicorn托管Django应用
  • 如何在windows下搭建 python+gunicorn+nginx
  • gunicorn nginx到底怎么配置
  • nginx+gunicorn+flask部属web时,使用nginx如何指...
  • Nginx,Gunicorn在服务器中分别起什么作用
  • Nginx,Gunicorn在服务器中分别起什么作用
  • 豆瓣和知乎用的apache还是nginx,哪个和python和dj...
  • Nginx+Python 怎么搞才好
  • 使用了Gunicorn或者uWSGI,为什么还需要Nginx
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved