2021-02-16 分類: 網(wǎng)站建設(shè)
最近使用Django開發(fā)一個小程序和后臺管理系統(tǒng) ,需要將這兩個不同的項目部署到同一個服務(wù)里面,然后使用不同的域名來訪問不同的項目。Django默認的只支持單服務(wù)訪問,要想實現(xiàn)不同域名,需要安裝django的第三方擴展包:django-hosts。
本文通過一個簡單的demo來給演示, 看本文的前提是需要對django有一定的認識,對項目環(huán)境的搭建以及Nginx有一定的了解。
一.搭建環(huán)境與項目:
平時習(xí)慣使用Anconda來管理Python包,所以本文也使用anconda管理環(huán)境,當(dāng)然大家要是習(xí)慣使用virtuallen管理環(huán)境也沒有問題。本文主要是演示怎么完整搭建一個單服務(wù)實現(xiàn)多域名訪問的流程,不涉及具體的業(yè)務(wù)流程。
由于生成django項目需要先下載django包,所以我們先創(chuàng)建一個基本的虛擬環(huán)境,然后在虛擬環(huán)境中通過具體命令來生成項目文件。
1、環(huán)境搭建:applite_web
conda create --name applite_web
創(chuàng)建完虛擬環(huán)境applite_web了,現(xiàn)在需要下載一些依賴包。這里只需要單獨安裝django與django-hosts即可。
pip install django
pip install django-hosts
pip install uwsgi
2、創(chuàng)建項目:applite_web
django-admin.py startproject applite_web
3、創(chuàng)建app
# 這里創(chuàng)建4個app.
# app_1、app_2: 是用來匹配applite_web文件下,hosts.py文件分發(fā)的url
相當(dāng)django原有的一級url.
# app_1_demo、app_2_demo: 是用來定義自己的API
創(chuàng)建app_1: django manage.py startapp app_1
創(chuàng)建app_2: django manage.py startapp app_2
創(chuàng)建app_1_demo: django manage.py startapp app_1_demo
創(chuàng)建app_2_demo: django manage.py startapp app_2_demo
說明2點:
1)、根據(jù)項目的需要,將原來Django項目結(jié)構(gòu)做了調(diào)整
2)、至于創(chuàng)建4個app的用法后邊會具體涉及到
下面截圖是創(chuàng)建本文Demo項目結(jié)構(gòu),當(dāng)然這也是比較簡單的一個項目結(jié)構(gòu),實際項目開發(fā)中,還需要配置別的參數(shù)與文件。
2. 在applite_web中配置django-hosts
創(chuàng)建好虛擬環(huán)境和項目之后,接下來重點就是在django中配置多域名。為了方便起見,本文只演示2個域名,多個域名按照2個域名的方式增加就行。
1、首先在settins.py同級增加一個hosts.py文件,配置如下:
from django_hosts import patterns, host
host_patterns = patterns(
host(r'app1', 'app_1.urls', name='app1'),
host(r'app2', 'app_2.urls', name='app2'),
)
2、然后在django的settings配置文件增加3處配置:
INSTALLED_APPS = [
"django_hosts",
'app_1',
'app_2',
"app_1_demo",
"app_2_demo",
]
MIDDLEWARE = [
'django_hosts.middleware.HostsRequestMiddleware',
......
'django_hosts.middleware.HostsRequestMiddleware',
]
# 客戶端的請求通過這個配置被轉(zhuǎn)發(fā)到hoss.py文件的host_patterns中匹配
ROOT_HOSTCONF = 'applite_web.hosts'
# 設(shè)置一個默認域名,在沒有匹配所有請求的域名時,默認請求這個域名
DEFAULT_HOST = 'app1'
3. 配置url和view
上邊兩步操作完成,接下來就需要去app文件夾下,編寫對應(yīng)的url和view。本文是演示2個域名,同時考慮到一般單個項目會有多個模塊,所以還需要分別配置兩個url。具體的配置如下:
1、分別在app_1、app_2文件夾下創(chuàng)建urls.py文件,并且增加對應(yīng)的url,代碼如下:
from django.urls import path, include
urlpatterns = [
path("app1/", include("app_1_demo.urls"))
]
from django.urls import path, include
urlpatterns = [
path("app2/", include("app_2_demo.urls")),
]
2、然后在app_1_demo、app_2_demo中分別增加對應(yīng)的url和views函數(shù)
1)、首先匹配app_1_demo的urls的路由:
from django.urls import path
from .views import app_1_view
urlpatterns = [
path("", app_1_view),
]
2)、urls匹配成功之后,跳轉(zhuǎn)這里的視圖函數(shù),并返回響應(yīng)
from django.http.response import HttpResponse
# Create your views here.
def app_1_view(request):
return HttpResponse("hello i'm app_1")
1)、首先匹配app_2_demo的urls的路由,匹配如下:
from django.urls import path, include
from .views import app_2_view
urlpatterns = [
path("", app_2_view)
]
2)、urls匹配成功之后,跳轉(zhuǎn)這里的視圖函數(shù),并返回響應(yīng)
from django.http.response import HttpResponse
# Create your views here.
def app_2_view(request):
return HttpResponse("hello i'm app_2")
4.域名綁定與測試
經(jīng)過上邊三步的操作,已經(jīng)完成了一個基本的演示功能。本文目的是通過Nginx負載單服務(wù)后,在一個服務(wù)里面來實現(xiàn)不同域名的訪問,所以在配置uwgi和Nginx參數(shù),還需要綁定域名。
1、這里是在同一個局域網(wǎng)下通過兩臺機器實現(xiàn)用戶的訪問:
訪問機器IP: 192.168.2.17, 部署服務(wù)的IP: 192.168.2.200。在實際生產(chǎn)需要購買真實的域名,這里作為演示,可以通過在本機綁定服務(wù)器的ip的方式來實現(xiàn)對另一臺機器服務(wù)的訪問,具體修改如下:
# 需要進入到此文件中編輯增加下面兩行:sudo vim /etc/hosts
# 這里我們分別給192.168.2.200綁定app1.cc與app2.cc兩個域名
192.168.2.200 app1.cc
192.168.2.200 app2.cc
2、綁定完之后,然后將本項目放到192.168.2.200機器上,測試當(dāng)前的服務(wù)配置沒有問題。
項目放置路徑為: /home/yxy/payneli/applite_web/
python manage.py runserver 192.168.2.200:8000
5.uwsgi參數(shù)配置與測試
前邊幾步成功之后,接下來就是配置uwsgi的參數(shù)。熟悉Python后臺開發(fā)的都應(yīng)該清楚,開發(fā)的時候使用的 python manage.py runserver 來運行服務(wù)器,這只適用開發(fā)時的代碼調(diào)試,而實際項目部署的話,django內(nèi)置的服務(wù)根本無法滿足需求。而Uwsgi作為Python服務(wù)器不僅可以提供穩(wěn)定的服務(wù),同時還可以提供大的并發(fā)量,所以在后臺開發(fā)中,用的比較多。
1、在項目文件夾下,創(chuàng)建一個uwsgi文件夾。進入該文件夾,創(chuàng)建uwsgi.ini文件,里面的配置參數(shù)如下:
[uwsgi]
# 項目目錄
chdir=/home/yxy/payneli/applite_web/app/
# 指定項目的application
wsgi-file=applite_web/wsgi.py
# 指定sock的文件路徑
socket=/home/yxy/payneli/applite_web/uwsgi/uwsgi.sock
# 進程個數(shù)
workers=1
pidfile=/home/yxy/payneli/applite_web/uwsgi/uwsgi.pid
# 指定IP端口
# nginx負載均衡使用socket,uwsgi啟動服務(wù)使用http
#socket=192.168.2.200:8000
http=192.168.2.200:8000
# 啟用主進程
master=true
# 自動移除unix Socket和pid文件當(dāng)服務(wù)停止的時候
vacuum=true
# 序列化接受的內(nèi)容,如果可能的話
thunder-lock=true
# 啟用線程
enable-threads=true
# 設(shè)置自中斷時間
harakiri=30
# 設(shè)置緩沖
post-buffering=4096
# 設(shè)置日志目錄
daemonize=/home/yxy/payneli/applite_web/logs/uwsgi.log
2、配置完成后,運行下面的命令,啟動服務(wù)。
# 在項目路徑下,啟動服務(wù)命令如下:
uwsgi --ini ./uwsgi/uwsgi.ini
啟動完成后,uwsgi文件夾里面就會多出兩個文件:uwsgi.pid uwsgi.sock
然后查看當(dāng)前服務(wù)是否啟動成功:
# 命令如下
ps -ef|grep uwsgi
當(dāng)顯示如下圖所示的時候,說明uwsgi已經(jīng)將項目啟動成功
3、瀏覽器測試服務(wù)是否正常:
在瀏覽為直接輸入:app1.cc:8000/app1/,如果顯示如下,說明uwsgi配置成功
6. Nginx配置與測試
如果前邊5步?jīng)]有問題的話,那么恭喜你,就差最后一步就可以完成本demo的演示了?,F(xiàn)在就開始最后一步,配置Nginx參數(shù)。
1、首先安裝Nginx,本文對nginx安裝不做講解,畢竟網(wǎng)上教程那么多,可以找一個好的教程照著操作就可以。小編將Nginx安裝為默認路徑,在:/usr/local/nginx,進入此文件下,直接命令行啟動。
/usr/local/nginx/sbin/nginx
查看Nginx是否啟動成功,命令如下:
ps -ef|grep nginx
顯示如下圖,說明Nginx啟動成功
瀏覽器輸入:app1.cc,顯示如下所示,說明Nginx安裝成功
2、檢查Nginx配置沒有問題之后,就是配置多域名了。
server{
listen 80; # 默認監(jiān)聽80端口
server_name app1.cc; # 訪問的域名
#index index.html inex.htm index.php;
#root /data/www/applite_web/;
access_log /usr/local/nginx/logs/app1.log logmain;
rewrite_log on;
#error_page 404 /404.html;
location / { # 通用匹配,任何未匹配到其它location的請求都會匹配到
include uwsgi_params; # uwsgi參數(shù)
uwsgi_pass 192.168.2.200:8000; # 負載后臺服務(wù)
uwsgi_param UWSGI_CHDIR /home/yxy/payneli/applite_web/app/;
uwsgi_param UWSGI_SCRIPT applite_web.wsgi;
client_max_body_size 35m;
uwsgi_send_timeout 1060;
uwsgi_connect_timeout 1060;
uwsgi_read_timeout 1060;
}
server{
listen 80;
server_name app2.cc;
#index index.html inex.htm index.php;
#root /home/yxy/www/applite_web/;
access_log /usr/local/nginx/logs/app2.log logmain;
rewrite_log on;
#error_page 404 /404.html;
location / {
include uwsgi_params;
uwsgi_pass 192.168.2.200:8000;
uwsgi_param UWSGI_CHDIR /home/yxy/payneli/applite_web/app/;
uwsgi_param UWSGI_SCRIPT applite_web.wsgi;
client_max_body_size 35m;
uwsgi_send_timeout 1060;
uwsgi_connect_timeout 1060;
uwsgi_read_timeout 1060;
}
}
3、多域名的參數(shù)配置完成,但是此刻不要忘了,當(dāng)使用Nginx作為負載均衡時候,需要將uwsgi.ini里面的參數(shù)http改為socket具體如下:
# nginx負載均衡使用socket,uwsgi啟動服務(wù)使用http
socket=192.168.2.200:8000
# http=192.168.2.200:8000
4、到這里本文的參數(shù)已經(jīng)配置完成,然后我們需要重新自動Nginx,查看顯示如上邊啟動效果,說明啟動成功,接下來就是瀏覽器檢測多域名配置是否正確:
分別輸入:app1.cc、app2.cc顯示結(jié)果如下,說明多域名已經(jīng)配置成功
到此為止,單服務(wù)實現(xiàn)多域名訪問已經(jīng)演示完成。當(dāng)然,本文只是做了一個簡單的demo版本,而實際項目開發(fā)的過程中,還需要根據(jù)實際需要評估,決定到底是nginx后臺負載多服務(wù),還是nginx負載單服務(wù)映射多域名。
分享文章:利用Linux + Nginx + Uwsgi + Django實現(xiàn)多域名訪問
當(dāng)前網(wǎng)址:http://www.rwnh.cn/news47/101347.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、全網(wǎng)營銷推廣、面包屑導(dǎo)航、網(wǎng)站設(shè)計、虛擬主機、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容