當前位置:
首頁 > 知識 > Linux + Nginx + Uwsgi + Django 搭建單服務實現多域名訪問

Linux + Nginx + Uwsgi + Django 搭建單服務實現多域名訪問

(給

Python開發者

加星標,提升Python技能


作者:

Python全家桶/李鵬輝

(本文來自作者投稿)



最近使用Django開發一個小程序和後台管理系統 ,需要將這兩個不同的項目部署到同一個服務裡面,然後使用不同的域名來訪問不同的項目。Django默認的只支持單服務訪問,要想實現不同域名,需要安裝django的第三方擴展包:django-hosts。

本文通過一個簡單的demo來給演示, 看本文的前提是需要對django有一定的認識,對項目環境的搭建以及Nginx有一定的了解。


一.搭建環境與項目:


平時習慣使用Anconda來管理Python包,所以本文也使用anconda管理環境,當然大家要是習慣使用virtuallen管理環境也沒有問題。本文主要是演示怎麼完整搭建一個單服務實現多域名訪問的流程,不涉及具體的業務流程。



由於生成django項目需要先下載django包,所以我們先創建一個基本的虛擬環境,然後在虛擬環境中通過具體命令來生成項目文件。



1、環境搭建:applite_web


conda 

create

 

--name applite_web



創建完虛擬環境applite_web了,現在需要下載一些依賴包。這裡只需要單獨安裝django與django-hosts即可。



pip 

install

 django  
pip 

install

 django-

hosts
pip install uwsgi

2、創建項目:applite_web


django-admin.

py

 startproject applite_web

3、創建app


#

 這裡創建4個app.

#

 app_1、app_2: 是用來匹配applite_web文件下,hosts.py文件分發的url
 相當django原有的一級url.

#

 app_1_demo、app_2_demo: 是用來定義自己的API
創建app_1:  django manage.py startapp app_1
創建app_2:  django manage.py startapp app_2
創建app_1_demo:  django manage.py startapp app_1_demo
創建app_2_demo: django manage.py startapp app_2_demo

說明2點:



    1)、根據項目的需要,將原來Django項目結構做了調整


    2)、至於創建4個app的用法後邊會具體涉及到

下面截圖是創建本文Demo項目結構,當然這也是比較簡單的一個項目結構,實際項目開發中,還需要配置別的參數與文件。



2. 在applite_web中配置django-hosts


創建好虛擬環境和項目之後,接下來重點就是在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中增加下面幾個

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行參數配置


# 客戶端的請求通過這個配置被轉發到hoss.py文件的host_patterns中匹配 


ROOT_HOSTCONF

 = 

"applite_web.hosts"

  

# 設置一個默認域名,在沒有匹配所有請求的域名時,默認請求這個域名


DEFAULT_HOST

 = 

"app1"

3. 配置url和view

上邊兩步操作完成,接下來就需要去app文件夾下,編寫對應的url和view。本文是演示2個域名,同時考慮到一般單個項目會有多個模塊,所以還需要分別配置兩個url。具體的配置如下:

 1、分別在app_1、app_2文件夾下創建urls.py文件,並且增加對應的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中分別增加對應的url和views函數



在app_1中匹配成功之後,會直接跳轉到app_1_demo的urls,再根據當前的匹配跳轉當前的views函數

1)、首先匹配

app_1_demo

的urls的路由:


from

 django.urls 

import

 path

from

 .views 

import

 app_1_view

urlpatterns = [
   path(

""

, app_1_view),
]

2)、urls匹配成功之後,跳轉這裡的視圖函數,並返迴響應


from

 django.http.response 

import

 HttpResponse


# Create your views here.


def

 

app_1_view

(request)

:


   

return

 HttpResponse(

"hello i"m app_1"

)

同理,app_2匹配成功之後,會直接跳轉到app_2_demo的urls,再根據當前的匹配跳轉當前的views函數

   1)、首先匹配

app_2_demo

的urls的路由,匹配如下:


from

 django.urls 

import

 path, include

from

 .views 

import

 app_2_view

urlpatterns = [
   path(

""

, app_2_view)
]

2)、

urls匹配成功之後,跳轉這裡的視圖函數,並返迴響應


from

 django.http.response 

import

 HttpResponse

# Create your views here.


def

 

app_2_view

(request)

:


   

return

 HttpResponse(

"hello i"m app_2"

)



4.域名綁定與測試




經過上邊三步的操作,已經完成了一個基本的演示功能。本文目的是通過Nginx負載單服務後,在一個服務裡面來實現不同域名的訪問,所以在配置uwgi和Nginx參數,還需要綁定域名。

1、這裡是在同一個區域網下通過兩台機器實現用戶的訪問:

訪問機器IP: 192.168.2.17, 部署服務的IP: 192.168.2.200。在實際生產需要購買真實的域名,這裡作為演示,可以通過在本機綁定伺服器的ip的方式來實現對另一台機器服務的訪問,具體修改如下:


# 需要進入到此文件中編輯增加下面兩行: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機器上,測試當前的服務配置沒有問題。


項目放置路徑為: /home/yxy/payneli/applite_web/

進入app文件夾下,然後運行項目,命令如下


python

 

manage

.py

 

runserver

 192

.168

.2

.200

:8000

瀏覽器輸入:app1.cc:8000/app1/,如果瀏覽器顯示如下結果,說明項目配置與域名綁定成功



5.uwsgi參數配置與測試


前邊幾步成功之後,接下來就是配置uwsgi的參數。熟悉Python後台開發的都應該清楚,開發的時候使用的 python manage.py runserver 來運行伺服器,這隻適用開發時的代碼調試,而實際項目部署的話,django內置的服務根本無法滿足需求。而Uwsgi作為Python伺服器不僅可以提供穩定的服務,同時還可以提供大的並發量,所以在後台開發中,用的比較多。

1、在項目文件夾下,創建一個uwsgi文件夾。進入該文件夾,創建uwsgi.ini文件,裡面的配置參數如下:


[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

# 進程個數       


workers

=

1


pidfile

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

# 指定IP埠


# nginx負載均衡使用socket,uwsgi啟動服務使用http       


#socket=192.168.2.200:8000


http

=

192.168

.

2.200

:

8000


# 啟用主進程


master

=

true


# 自動移除unix Socket和pid文件當服務停止的時候


vacuum

=

true


# 序列化接受的內容,如果可能的話


thunder-lock

=

true


# 啟用線程


enable-threads

=

true


# 設置自中斷時間


harakiri

=

30


# 設置緩衝


post-buffering

=

4096


# 設置日誌目錄


daemonize

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

2、配置完成後,運行下面的命令,啟動服務。


#

 在項目路徑下,啟動服務命令如下:
uwsgi --ini  ./uwsgi/uwsgi.ini

啟動完成後,uwsgi文件夾裡面就會多出兩個文件:uwsgi.pid  uwsgi.sock



然後查看當前服務是否啟動成功:


# 命令如下
ps

 -ef|

grep

 uwsgi

當顯示如下圖所示的時候,說明uwsgi已經將項目啟動成功



3、瀏覽器測試服務是否正常:



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

6. Nginx配置與測試



如果前邊5步沒有問題的話,那麼恭喜你,就差最後一步就可以完成本demo的演示了。現在就開始最後一步,配置Nginx參數。

1、首先安裝Nginx,本文對nginx安裝不做講解,畢竟網上教程那麼多,可以找一個好的教程照著操作就可以。小編將Nginx安裝為默認路徑,在:/usr/local/nginx,進入此文件下,直接命令行啟動。


/usr/local/nginx/sbin/nginx

查看Nginx是否啟動成功,命令如下:


ps

 -ef|

grep

 nginx

顯示如下圖,說明Nginx啟動成功

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

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



注釋掉Nginx原有的配置server



增加如下一行參數,主要是為了方便單獨增加配置app1.cc、與app2.cc兩個域名的文件



分別在 /usr/nginx/conf/文件加下,創建一個新的multihosts文件夾,進入該文件夾分別新建 app1.cc.conf、app2.cc.conf文件,具體的配置參數如下:

app1.cc.conf配置如下:


server{
      listen 

80

;   

# 默認監聽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參數


          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 

35

m;
          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 

35

m;
         uwsgi_send_timeout 

1060

;
          uwsgi_connect_timeout 

1060

;
          uwsgi_read_timeout 

1060

;
        }
}

3、多域名的參數配置完成,但是此刻不要忘了,當使用Nginx作為負載均衡時候,需要將uwsgi.ini裡面的參數http改為socket具體如下:


# nginx負載均衡使用socket,uwsgi啟動服務使用http       


socket

=

192.168

.

2.200

:

8000


# http=192.168.2.200:8000

4、到這裡本文的參數已經配置完成,然後我們需要重新自動Nginx,查看顯示如上邊啟動效果,說明啟動成功,接下來就是瀏覽器檢測多域名配置是否正確:

分別輸入:app1.cc、app2.cc顯示結果如下,說明多域名已經配置成功


到此為止,單服務實現多域名訪問已經演示完成。當然,本文只是做了一個簡單的demo版本,而實際項目開發的過程中,還需要根據實際需要評估,決定到底是nginx後台負載多服務,還是nginx負載單服務映射多域名。

發送 

1225

,可獲取本文源碼。



【本文作者】

李鵬輝:就職於深圳一家科技公司AI部門,目前負責Python後台開發和數據挖掘相關工作。工作之餘也在運營公號「Python全家桶」。




推薦閱讀


(點擊標題可跳轉閱讀)


Python 中的屬性訪問與描述符


教你搭建一個好看的 Jupyter 環境


從零開始用 python 搭建推薦引擎

覺得本文對你有幫助?請分享給更多人


關注「Python開發者」加星標,提升Python技能



喜歡就點一下「好看」唄~

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發者 的精彩文章:

面向對象:最浪漫的事就是我在鬧你在笑

TAG:Python開發者 |