Apache 服务于 Django 和 Angular
Posted
技术标签:
【中文标题】Apache 服务于 Django 和 Angular【英文标题】:Apache serving Django and Angular 【发布时间】:2017-12-15 12:02:43 【问题描述】:我有一个由 Django Rest API 提供的 Angular 前端项目。我的项目结构如下。
example.com
|- client (holds angular files)
|- server (holds Django Rest Framework files)
Angular 应用通过 http 调用 drf:
example.com/api/<params>
我使用 Apache 和 uWSGI 托管在 Linode Ubunutu 17.04 上。 我似乎无法找出同时为 Angular 和 Django 提供服务的最佳方式?我可以使用 WSGI 配置轻松托管 Django Rest API,但无法弄清楚 Apache 是如何知道指向 Angular 的正常请求的。
以下解决方案有什么问题或有更好的方法吗?
在 /etc/apache2/sites-available/example.com.conf 中
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/client/
</VirtualHost>
<VirtualHost *:80>
ServerName example.com/api
ServerAlias www.example.com/api
WSGIScriptAlias / var/www/example.com/index.wsgi
DocumentRoot /var/www/example.com/server/
</VirtualHost>
任何帮助将不胜感激!
【问题讨论】:
嗨。你有没有找到解决这个问题的方法?我需要在使用 Apache 服务器和 uwsgi 的 aws elasticbeanstalk 上为 Django 和 Angular 提供服务,所以我在同一条船上。 @krTG 我最终切换到了 nginx。 nginx conf 允许您指定“位置”,因此将不同的 url 指向服务器上的不同资源位置很简单。所以解决这个问题的方法是在 apache 中找到等效的“位置” 【参考方案1】:我不知道这是否是最好的方法,但它对我有用:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ProxyPass /api/ http://localhost:8000/api/
ProxyPassReverse /api/ http://localhost:8000/api/
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>
# Server
<VirtualHost *:8000>
<Directory var/www/example.com/server>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
# mod_wsgi configuration for django app
# python-home represents a location of venv, in this case same as application path, but it's not neccessarily the same
# python-path represents a location of application
WSGIDaemonProcess my_app python-home=var/www/example.com/server python-path=var/www/example.com/server
WSGIProcessGroup my_app
WSGIScriptAlias / var/www/example.com/server/wsgi.py
</VirtualHost>
# Client
<VirtualHost *:8080>
DocumentRoot /var/www/example.com/client
<Directory /var/www/example.com>
Require all granted
</Directory>
</VirtualHost>
通过在/etc/apache2/ports.conf
中添加此行来监听端口8000和8080:
# Internal: server
Listen 8000
# Internal: client
Listen 8080
解释:
侦听端口 80 的 VirtualHost 充当代理,根据请求的 URL 将请求进一步重定向到不同的端口。如果 URL 以 /api/
开头,则请求将被重定向到端口 8000(内部),而该端口又由另一个 VirtualHost 处理。如果 URL 不以/api/
开头,请求将被重定向到代表客户端的 8080 端口。
在这个解决方案中,我使用的是 mod_wsgi 而不是 uWSGI,但方法相同(只是服务器 VirtualHost 的配置会有所不同)。
【讨论】:
以上是关于Apache 服务于 Django 和 Angular的主要内容,如果未能解决你的问题,请参考以下文章
使用 Nginx 和 Apache 服务于 Web 应用程序
Linux下配置Django_Apache_Mysql环境(CentOS 7.5)