如何将 Django 应用程序部署到 (AWS) 域名?

Posted

技术标签:

【中文标题】如何将 Django 应用程序部署到 (AWS) 域名?【英文标题】:How do I deploy Django app to (AWS) domain name? 【发布时间】:2018-03-26 06:51:54 【问题描述】:

我只使用 Django 几个星期,刚刚学习了部署。我有一个 AWS EC2 实例,我可以将我的 Django 网站/应用程序部署到该实例(即,如果我在浏览器中访问 IP 地址,我就可以访问我的网站)。但是,我不知道如何将同一个网站部署到我在 AWS 上注册的域名。

我遵循 AWS 的文档 (http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html),https://cachecheck.opendns.com/ 显示我的域名路由到我的 EC2 实例。但是,当我在浏览器中访问我的域名时,它会显示 400 Bad Request。当我设置 nginx 或 gunicorn 时,我还需要做些什么吗?我尝试将 nginx 代码中的 yourEC2.public.ip 替换为我的域名而不是 IP 地址。

我无法在网上找到任何其他关于域名部署的资源,尤其是 AWS。

这是我用于部署到 EC2 实例的内容:

settings.py:

DEBUG = False
ALLOWED_HOSTS = ['yourEC2.public.ip']
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
(venv) ubuntu@54.162.31.253:~myRepoName$ python manage.py collectstatic

独角兽

[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/repoName
ExecStart=/home/ubuntu/repoName/venv/bin/gunicorn --workers 3 --bind 
unix:/home/ubuntu/repoName/projectName.sock 
projectName.wsgi:application
[Install]
WantedBy=multi-user.target

nginx:

server 
    listen 80;
    server_name yourEC2.public.ip;
    location = /favicon.ico  access_log off; log_not_found off; 
    location /static/ 
        root /home/ubuntu/myRepoName;
    
    location / 
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/myRepoName/projectName.sock;
    

【问题讨论】:

你在Route53中创建了一个记录集,A记录到IP地址还是CName到EC2实例的公共域名? @Ashan:是的,我创建了一个记录集并将值设置为我的 EC2 实例/IP 地址。 @Selcuk:是的,如果我输入我的 IP 地址,我的 Django 应用程序/网站就会出现。只是在输入域名时不起作用。我会尝试设置ALLOWED_HOSTS 【参考方案1】:

您应该将ALLOWED_HOSTS 设置为您的主机名,例如['example.com', 'www.example.com']

表示此 Django 站点可以提供的主机/域名的字符串列表。这是一种防止 HTTP Host 标头攻击的安全措施,即使在许多看似安全的 Web 服务器配置下也可能发生这种攻击。

【讨论】:

【参考方案2】:

我遇到了同样的问题,实际上发现您的各种帖子也在寻求解决方案。有趣的是,我们俩在如此相似的时间窗口中遇到了完全相同的问题。

我做了三件事:

首先,正如 Selcuk 所说,我更新了我的 ALLOWED_HOSTS

ALLOWED_HOSTS = ['12.345.67.890', 'sub.domain.com', 'www.sub.domain.com']

然后,我还在我的 nginx 配置中编辑了server_name 设置:

server_name 12.345.67.890 sub.domain.com www.sub.domain.com;

最后,我重新启动了 nginx 并重新启动机器以确保一切正常:

sudo service nginx restart sudo reboot

在此之后,我能够加载我的域并且应用程序将加载。我知道你已经找到了你的解决方案,但我想把它正式化,因为我在 *** 上找到了你的问题,希望其他人也能这样,这样他们就可以幸免于难!

【讨论】:

以上是关于如何将 Django 应用程序部署到 (AWS) 域名?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Django Fixtures 部署到 Amazon AWS

将 Django 部署到 AWS Fargate 时,如何将本地 ip 添加到 ALLOWED_HOSTS

ModuleNotFoundError:没有名为“应用程序”的模块 [将 Django 部署到 AWS]

将 Django 应用程序部署到 AWS 时出现“ValueError:要解压的值太多”

Django 部署到 AWS EB 显示 500 内部服务器错误

如何在 AWS 上部署 Django Rest Framework 和 React