实际使用中遇到一个使用场景是这样的, 两个域名, 如: www.aaa.com
和www.bbb.com
, nginx配置一个upstream服务器(假设为: ** http://127.0.0.1:9001
**)来接受这个两个域名转发过来的请求.要求实现:
- 访问
www.aaa.com
, 请求转至http://127.0.0.1:9001/
, 访问www.aaa.com/demo
, 请求转至http://127.0.0.1:9001/demo/
.以此类推. - 访问
www.bbb.com
, 请求转至http://127.0.0.1:9001/bbb/
, 访问www.bbb.com/bbb/demo/
, 请求转至http://127.0.0.1:9001/bbb/demo/
.以此类推.
方法一: 通过配置nginx来实现
分析:
www.aaa.com
的请求转发规则很好配置, 关键在于www.bbb.com
的配置. 也就是说, 需要将请求的地址进行rewrite.
唯一需要做的就是, 将www.bbb.com
请求转发至http://127.0.0.1:9001/bbb/
其他的都可以不用改动.
因此, 再来配置就简单多了.
server {
listen 80;
server_name www.bbb.com;
rewrite ^/$ /bbb/ break; # 添加一个rewrite规则即可
location /static {
alias /var/www/mysite/static;
access_log off;
expires 7d;
add_header Pragma public;
add_header Cache-Control "public";
}
location /media {
alias /var/www/mysite/media;
access_log off;
}
location / {
proxy_set_header Host $host:$server_port;
proxy_pass http://127.0.0.1:9090/;
include /etc/nginx/uwsgi_params;
}
}
server {
listen 80;
server_name www.aaa.com;
location /static {
alias /var/www/mysite/static;
access_log off;
expires 7d;
add_header Pragma public;
add_header Cache-Control "public";
}
location /media {
alias /var/www/mysite/media;
access_log off;
}
location / {
proxy_set_header Host $host:$server_port;
proxy_pass http://127.0.0.1:9090/;
include /etc/nginx/uwsgi_params;
}
}
在nginx中使用rewrite时需要注意:
** server区块中如果有包含rewrite规则, 则会最先执行, 而且只会执行一次, 然后再判断命中哪个location区块, 再去执行该location中的rewrite.**
通过nginx来实现固然可以, 但不是最好的, 修改起来也麻烦. 推荐使用第二种.
方法二: 通过配置django中间件来完成.
首先得说一下实验的环境:
client <-> nginx <-> uwsgi <-> django_project
上面的流程就是我当前部署的django项目的环境.
要想通过django中间件来完成多域名使用同一个django项目, 首先, 需要确保nginx配置当中有添加此项:
proxy_set_header Host $host:$server_port;
余下的就是开始编写中间件了.
编写MultipleDomainMiddleware中间件
在settings.py所在目录下, 新建一个文件middlewares.py
, 并添加以下内容:
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings
class MultipleDomainMiddleware(MiddlewareMixin):
def process_request(self, request):
host = request.get_host()
url_config = getattr(settings, 'MULTIPLE_UFL_CONFIG', None)
if url_config:
for key in url_config.keys():
if key in host:
request.urlconf = url_config[key]
settings.py中修改一些配置
MIDDLEWARE = [
'mysite.middlewares.MultipleDomainMiddleware',
...
]
ALLOW_HOSTS = ['127.0.0.1', 'www.aaa.com', 'aaa.com', 'www.bbb.com', 'bbb.com']
MULTIPLE_UFL_CONFIG = {
'aaa.com': 'mysite.urls',
'bbb.com': 'mysite.urls_bbbb',
}
ROOT_URLCONF = 'mysite.urls'
添加相应的urls.py文件
同时在根urls.py文件所在目录新增一个文件urls_bbb.py.两个文件的内容可能如下:
** urls.py **
from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.views.static import serve
import aaa.views
urlpatterns = [
url(r'^', include("aaa.urls", namespace="aaa")),
url(r'^admin/', admin.site.urls),
]
** urls_bbb.py **
from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.views.static import serve
import bbb.views
urlpatterns = [
url(r'^', include("bbb.urls", namespace="bbb")),
url(r'^admin/', admin.site.urls),
]
至此, 即可实现同一个django项目, 使用多个域名访问不同路径了.
结束语
行文匆匆, 文中要是有什么不正确的地方, 欢迎指正!
网友评论