Nginx, WSGI, Django - 设置网络服务器
Posted
技术标签:
【中文标题】Nginx, WSGI, Django - 设置网络服务器【英文标题】:Nginx, WSGI, Django - setting up web server 【发布时间】:2018-02-07 21:00:23 【问题描述】:我对设置网络服务器很陌生,并且一直在遵循这些指南:
http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html https://gist.github.com/evildmp/3094281
由于我使用的是 Mac,因此我通过 Homebrew 安装了 nginx:brew install nginx
。我一直在努力让我的 nginx 服务器为我的 Django 静态文件提供服务。
我已按照指南复制了他们的mysite_nginx.conf
并根据我的项目路径进行了更改:
# mysite_nginx.conf
# the upstream component nginx needs to connect to
upstream django
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
# configuration of the server
server
# the port your site will be served on
listen 8000;
# the domain name it will serve for
server_name .example.com; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media
alias /Users/Simon/Documents/WebServer/uwsgi-tutorial/mysite/media; # your Django project's media files - amend as required
location /static
alias /Users/Simon/Documents/WebServer/uwsgi-tutorial/mysite/static; # your Django project's static files - amend as required
# Finally, send all non-media requests to the Django server.
location /
uwsgi_pass django;
include /Users/Simon/Documents/WebServer/uwsgi-tutorial/mysite/uwsgi_params; # the uwsgi_params file you installed
由于我在本地运行服务器,因此我没有服务器名称,并且按照上面的文件将其保留为 .example.com
。我也尝试将其更改为127.0.0.1
(因为我在本地主机上运行它)但这也不起作用。
完成此文件后,我按照指南将文件符号链接到 nginx - 但是文件夹 /etc/nginx/sites-enabled/
不存在,因此我必须先自己创建它,然后发出以下命令:
sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/
我按照他们的“部署静态文件”部分中的指南进行操作,并通过以下方式在 mac 上停止并启动了我的 nginx 服务器:
sudo nginx -s stop
sudo nginx
现在,他们让我去这个地址看看我的 media.png 是否被送达:
http://example.com:8000/media/media.png
没有提供服务,因为我认为 Chrome 无法区分互联网上的 example.com
和我的本地主机上的 example.com
。我在 Chrome 上收到了 This site can’t be reached. example.com took too long to respond error
。
所以我尝试了:
http://127.0.0.1:8000/media/media.png
但我仍然收到This site can’t be reached 127.0.0.1 refused to connect
错误。
这是我的项目的文件结构:
这是 uwsgi_params 中包含的内容:
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
我不确定该指南是否已过时。谁能告诉我我做错了什么?
下面是settings.py文件:
Generated by 'django-admin startproject' using Django 1.11.4.
For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'XXX'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'mysite.urls'
TEMPLATES = [
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
,
,
]
WSGI_APPLICATION = 'mysite.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES =
'default':
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
,
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
,
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
,
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
,
]
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, javascript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
STATIC_URL = '/static/'
【问题讨论】:
您不能将 example.com 用作本地域。您仍然可以使用 localhost 本身,但是如果您需要为 2 个站点提供服务怎么办?在这种情况下,您应该创建本地第三级域(编辑您的主机文件)。虽然这些都是复杂的,对我来说没有多大意义,只需在开发中使用开发服务器并在生产中使用 nginx 和 uwsgi 是的 - 我知道我可以使用开发服务器,但我仍然需要为我的网络服务器投入生产的时间做好准备。 你真的想在你的 Mac 上部署 Django 吗?通常我们只是在 Mac 上开发。你必须执行./manage.py runserver
就可以了——不需要 nginx 和 uwsgi。为什么这还不够?
我只是想在部署到生产之前测试一下django、nginx和wsgi的组合是否可以一起工作。
【参考方案1】:
不包括我可能会让您感到厌烦的所有 DNS 内容,他们甚至指出您需要将 example.com 替换为您自己的 IP 地址/'localhost'。 所以, 将 mysite_nginx conf 文件中的“服务器名称”更改为 localhost。 如果这不起作用,请尝试检查 nginx 登录(因为您已经通过 Homebrew 安装了 nginx):
/usr/local/var/log/nginx
顺便说一句,我强烈建议您查看一些简短的网络指南,因为它似乎让您有些困惑。
【讨论】:
我已经尝试了 localhost 路由 127.0.0.1 ,但它仍然给了我一个错误。 error.log 文件显示:2017/08/30 10:11:16 [notice] 74975#0: signal process started 但未提供其他信息。 添加了 settings.py 文件 好的,接下来尝试检查您的 mysite 文件夹的权限,它们至少应该是 711。 在哪里可以找到? 执行 'ls -la' /your/mysite/root/folder/ 或直接 cd 并执行 'ls -la'【参考方案2】:对配置文件的更改: upsteam 和 server 块应该在 http 块内定义。 另外,应该提供一个事件块,它可以是空的
【讨论】:
也许您可以进一步详细说明,例如通过提供代码示例?以上是关于Nginx, WSGI, Django - 设置网络服务器的主要内容,如果未能解决你的问题,请参考以下文章
使用uWSGI和Nginx来设置Django和你的Web服务器
Django+Linux+Uwsgi+Nginx项目部署文档
Nginx / Apache / WSGI / Django - 意外引发 500 错误(Nginx 上为 499)