利用Linux + Nginx + Uwsgi + Django實(shí)現(xiàn)多域名訪問

2021-02-16    分類: 網(wǎng)站建設(shè)

最近使用Django開發(fā)一個(gè)小程序和后臺(tái)管理系統(tǒng) ,需要將這兩個(gè)不同的項(xiàng)目部署到同一個(gè)服務(wù)里面,然后使用不同的域名來(lái)訪問不同的項(xiàng)目。Django默認(rèn)的只支持單服務(wù)訪問,要想實(shí)現(xiàn)不同域名,需要安裝django的第三方擴(kuò)展包:django-hosts。

本文通過一個(gè)簡(jiǎn)單的demo來(lái)給演示, 看本文的前提是需要對(duì)django有一定的認(rèn)識(shí),對(duì)項(xiàng)目環(huán)境的搭建以及Nginx有一定的了解。

一.搭建環(huán)境與項(xiàng)目:

平時(shí)習(xí)慣使用Anconda來(lái)管理Python包,所以本文也使用anconda管理環(huán)境,當(dāng)然大家要是習(xí)慣使用virtuallen管理環(huán)境也沒有問題。本文主要是演示怎么完整搭建一個(gè)單服務(wù)實(shí)現(xiàn)多域名訪問的流程,不涉及具體的業(yè)務(wù)流程。

由于生成django項(xiàng)目需要先下載django包,所以我們先創(chuàng)建一個(gè)基本的虛擬環(huán)境,然后在虛擬環(huán)境中通過具體命令來(lái)生成項(xiàng)目文件。

1、環(huán)境搭建:applite_web

conda create --name applite_web

創(chuàng)建完虛擬環(huán)境applite_web了,現(xiàn)在需要下載一些依賴包。這里只需要單獨(dú)安裝django與django-hosts即可。

pip install django

pip install django-hosts

pip install uwsgi

2、創(chuàng)建項(xiàng)目:applite_web

django-admin.py startproject applite_web

3、創(chuàng)建app

# 這里創(chuàng)建4個(gè)app.

# app_1、app_2: 是用來(lái)匹配applite_web文件下,hosts.py文件分發(fā)的url

相當(dāng)django原有的一級(jí)url.

# app_1_demo、app_2_demo: 是用來(lái)定義自己的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

說(shuō)明2點(diǎn):

1)、根據(jù)項(xiàng)目的需要,將原來(lái)Django項(xiàng)目結(jié)構(gòu)做了調(diào)整

2)、至于創(chuàng)建4個(gè)app的用法后邊會(huì)具體涉及到

下面截圖是創(chuàng)建本文Demo項(xiàng)目結(jié)構(gòu),當(dāng)然這也是比較簡(jiǎn)單的一個(gè)項(xiàng)目結(jié)構(gòu),實(shí)際項(xiàng)目開發(fā)中,還需要配置別的參數(shù)與文件。

2. 在applite_web中配置django-hosts

創(chuàng)建好虛擬環(huán)境和項(xiàng)目之后,接下來(lái)重點(diǎn)就是在django中配置多域名。為了方便起見,本文只演示2個(gè)域名,多個(gè)域名按照2個(gè)域名的方式增加就行。

1、首先在settins.py同級(jí)增加一個(gè)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中增加下面幾個(gè)

INSTALLED_APPS = [

"django_hosts",

'app_1',

'app_2',

"app_1_demo",

"app_2_demo",

]

  • 需要在 MIDDLEWARE 的首行和末行增加2行配置

MIDDLEWARE = [

'django_hosts.middleware.HostsRequestMiddleware',

......

'django_hosts.middleware.HostsRequestMiddleware',

]

  • 在ROOT_URLCONF下行增加如下2行參數(shù)配置

# 客戶端的請(qǐng)求通過這個(gè)配置被轉(zhuǎn)發(fā)到hoss.py文件的host_patterns中匹配

ROOT_HOSTCONF = 'applite_web.hosts'

# 設(shè)置一個(gè)默認(rèn)域名,在沒有匹配所有請(qǐng)求的域名時(shí),默認(rèn)請(qǐng)求這個(gè)域名

DEFAULT_HOST = 'app1'

3. 配置url和view

上邊兩步操作完成,接下來(lái)就需要去app文件夾下,編寫對(duì)應(yīng)的url和view。本文是演示2個(gè)域名,同時(shí)考慮到一般單個(gè)項(xiàng)目會(huì)有多個(gè)模塊,所以還需要分別配置兩個(gè)url。具體的配置如下:

1、分別在app_1、app_2文件夾下創(chuàng)建urls.py文件,并且增加對(duì)應(yīng)的url,代碼如下:

  • app_1的urls.py文件如下:

from django.urls import path, include

urlpatterns = [

path("app1/", include("app_1_demo.urls"))

]

  • app_2的urls.py文件如下

from django.urls import path, include

urlpatterns = [

path("app2/", include("app_2_demo.urls")),

]

2、然后在app_1_demo、app_2_demo中分別增加對(duì)應(yīng)的url和views函數(shù)

  • 在app_1中匹配成功之后,會(huì)直接跳轉(zhuǎn)到app_1_demo的urls,再根據(jù)當(dāng)前的匹配跳轉(zhuǎn)當(dāng)前的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")

  • 同理,app_2匹配成功之后,會(huì)直接跳轉(zhuǎn)到app_2_demo的urls,再根據(jù)當(dāng)前的匹配跳轉(zhuǎn)當(dāng)前的views函數(shù)

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.域名綁定與測(cè)試

經(jīng)過上邊三步的操作,已經(jīng)完成了一個(gè)基本的演示功能。本文目的是通過Nginx負(fù)載單服務(wù)后,在一個(gè)服務(wù)里面來(lái)實(shí)現(xiàn)不同域名的訪問,所以在配置uwgi和Nginx參數(shù),還需要綁定域名

1、這里是在同一個(gè)局域網(wǎng)下通過兩臺(tái)機(jī)器實(shí)現(xiàn)用戶的訪問:

訪問機(jī)器IP: 192.168.2.17, 部署服務(wù)的IP: 192.168.2.200。在實(shí)際生產(chǎn)需要購(gòu)買真實(shí)的域名,這里作為演示,可以通過在本機(jī)綁定服務(wù)器的ip的方式來(lái)實(shí)現(xiàn)對(duì)另一臺(tái)機(jī)器服務(wù)的訪問,具體修改如下:

# 需要進(jìn)入到此文件中編輯增加下面兩行:sudo vim /etc/hosts

# 這里我們分別給192.168.2.200綁定app1.cc與app2.cc兩個(gè)域名

192.168.2.200 app1.cc

192.168.2.200 app2.cc

2、綁定完之后,然后將本項(xiàng)目放到192.168.2.200機(jī)器上,測(cè)試當(dāng)前的服務(wù)配置沒有問題。

項(xiàng)目放置路徑為: /home/yxy/payneli/applite_web/

  • 進(jìn)入app文件夾下,然后運(yùn)行項(xiàng)目,命令如下:

python manage.py runserver 192.168.2.200:8000

  • 瀏覽器輸入:app1.cc:8000/app1/,如果瀏覽器顯示如下結(jié)果,說(shuō)明項(xiàng)目配置與域名綁定成功

5.uwsgi參數(shù)配置與測(cè)試

前邊幾步成功之后,接下來(lái)就是配置uwsgi的參數(shù)。熟悉Python后臺(tái)開發(fā)的都應(yīng)該清楚,開發(fā)的時(shí)候使用的 python manage.py runserver 來(lái)運(yùn)行服務(wù)器,這只適用開發(fā)時(shí)的代碼調(diào)試,而實(shí)際項(xiàng)目部署的話,django內(nèi)置的服務(wù)根本無(wú)法滿足需求。而Uwsgi作為Python服務(wù)器不僅可以提供穩(wěn)定的服務(wù),同時(shí)還可以提供大的并發(fā)量,所以在后臺(tái)開發(fā)中,用的比較多。

1、在項(xiàng)目文件夾下,創(chuàng)建一個(gè)uwsgi文件夾。進(jìn)入該文件夾,創(chuàng)建uwsgi.ini文件,里面的配置參數(shù)如下:

[uwsgi]

# 項(xiàng)目目錄

chdir=/home/yxy/payneli/applite_web/app/

# 指定項(xiàng)目的application

wsgi-file=applite_web/wsgi.py

# 指定sock的文件路徑

socket=/home/yxy/payneli/applite_web/uwsgi/uwsgi.sock

# 進(jìn)程個(gè)數(shù)

workers=1

pidfile=/home/yxy/payneli/applite_web/uwsgi/uwsgi.pid

# 指定IP端口

# nginx負(fù)載均衡使用socket,uwsgi啟動(dòng)服務(wù)使用http

#socket=192.168.2.200:8000

http=192.168.2.200:8000

# 啟用主進(jìn)程

master=true

# 自動(dòng)移除unix Socket和pid文件當(dāng)服務(wù)停止的時(shí)候

vacuum=true

# 序列化接受的內(nèi)容,如果可能的話

thunder-lock=true

# 啟用線程

enable-threads=true

# 設(shè)置自中斷時(shí)間

harakiri=30

# 設(shè)置緩沖

post-buffering=4096

# 設(shè)置日志目錄

daemonize=/home/yxy/payneli/applite_web/logs/uwsgi.log

2、配置完成后,運(yùn)行下面的命令,啟動(dòng)服務(wù)。

# 在項(xiàng)目路徑下,啟動(dòng)服務(wù)命令如下:

uwsgi --ini ./uwsgi/uwsgi.ini

啟動(dòng)完成后,uwsgi文件夾里面就會(huì)多出兩個(gè)文件:uwsgi.pid uwsgi.sock

然后查看當(dāng)前服務(wù)是否啟動(dòng)成功:

# 命令如下

ps -ef|grep uwsgi

當(dāng)顯示如下圖所示的時(shí)候,說(shuō)明uwsgi已經(jīng)將項(xiàng)目啟動(dòng)成功

3、瀏覽器測(cè)試服務(wù)是否正常:

在瀏覽為直接輸入:app1.cc:8000/app1/,如果顯示如下,說(shuō)明uwsgi配置成功

6. Nginx配置與測(cè)試

如果前邊5步?jīng)]有問題的話,那么恭喜你,就差最后一步就可以完成本demo的演示了?,F(xiàn)在就開始最后一步,配置Nginx參數(shù)。

1、首先安裝Nginx,本文對(duì)nginx安裝不做講解,畢竟網(wǎng)上教程那么多,可以找一個(gè)好的教程照著操作就可以。小編將Nginx安裝為默認(rèn)路徑,在:/usr/local/nginx,進(jìn)入此文件下,直接命令行啟動(dòng)。

/usr/local/nginx/sbin/nginx

查看Nginx是否啟動(dòng)成功,命令如下:

ps -ef|grep nginx

顯示如下圖,說(shuō)明Nginx啟動(dòng)成功

瀏覽器輸入:app1.cc,顯示如下所示,說(shuō)明Nginx安裝成功

2、檢查Nginx配置沒有問題之后,就是配置多域名了。

  • 注釋掉Nginx原有的配置server
  • 增加如下一行參數(shù),主要是為了方便單獨(dú)增加配置app1.cc、與app2.cc兩個(gè)域名的文件
  • 分別在 /usr/nginx/conf/文件加下,創(chuàng)建一個(gè)新的multihosts文件夾,進(jìn)入該文件夾分別新建 app1.cc.conf、app2.cc.conf文件,具體的配置參數(shù)如下:
  • app1.cc.conf配置如下:

server{

listen 80; # 默認(rèn)監(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的請(qǐng)求都會(huì)匹配到

include uwsgi_params; # uwsgi參數(shù)

uwsgi_pass 192.168.2.200:8000; # 負(fù)載后臺(tái)服務(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;

}

  • app2.cc.conf配置如下:

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作為負(fù)載均衡時(shí)候,需要將uwsgi.ini里面的參數(shù)http改為socket具體如下:

# nginx負(fù)載均衡使用socket,uwsgi啟動(dòng)服務(wù)使用http

socket=192.168.2.200:8000

# http=192.168.2.200:8000

4、到這里本文的參數(shù)已經(jīng)配置完成,然后我們需要重新自動(dòng)Nginx,查看顯示如上邊啟動(dòng)效果,說(shuō)明啟動(dòng)成功,接下來(lái)就是瀏覽器檢測(cè)多域名配置是否正確:

分別輸入:app1.cc、app2.cc顯示結(jié)果如下,說(shuō)明多域名已經(jīng)配置成功

到此為止,單服務(wù)實(shí)現(xiàn)多域名訪問已經(jīng)演示完成。當(dāng)然,本文只是做了一個(gè)簡(jiǎn)單的demo版本,而實(shí)際項(xiàng)目開發(fā)的過程中,還需要根據(jù)實(shí)際需要評(píng)估,決定到底是nginx后臺(tái)負(fù)載多服務(wù),還是nginx負(fù)載單服務(wù)映射多域名。

分享文章:利用Linux + Nginx + Uwsgi + Django實(shí)現(xiàn)多域名訪問
當(dāng)前網(wǎng)址:http://www.bm7419.com/news47/101347.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、全網(wǎng)營(yíng)銷推廣面包屑導(dǎo)航、網(wǎng)站設(shè)計(jì)虛擬主機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)