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)

在 django + nginx + wsgi 中,啥是“mysite.sock”

django 1.9 wsgi + nginx

text nginx_wsgi_django.text