阿里云ECS布署uwsgi+nginx+ubuntu+django

作者: 魯智深 分類: django,Python 發布時間: 2018-01-31 21:16

為什么要布署?python manage.py runserver:這是一款適合開發階段使用的服務器,不適合運行在真實的生產環境中,

在生產環境中使用WSGI,WSGI:Web服務器網關接口,英文為Python Web Server Gateway Interface,縮寫為WSGI,是Python應用程序或框架和Web服務器之間的一種接口,被廣泛接受,WSGI沒有官方的實現, 因為WSGI更像一個協議,只要遵照這些協議,WSGI應用(Application)都可以在任何服務器(Server)上運行。

布署從uwsgi、nginx、靜態文件三個方面處理,每個環節都必須走正確才能進行下一個環節。

首先你的服務器是阿里云ecs,系統是ubuntu,這些在購買的時候已經阿里云默認給配置,常用的公有服務器,如阿里云、青云等,可根據需要,按流量收費或按時間收費。

未布署的程序

在ECS上運行django程序需要先配置服務器環境,在本地的虛擬環境中,項目根目錄下,執行命令收集所有包

1
pip freeze > plist.txt

通過ftp軟件將開發好的項目上傳到此服務器的某個目錄,安裝并創建虛擬環境,如果已有則跳過此步。

構架沙盒環境

1
2
3
4
sudo apt-get install python-virtualenv
sudo easy_install virtualenvwrapper
mkvirtualenv [虛擬環境名稱]
#指定版本 mkvirtualenv 虛擬環境名稱 -p python3.5/python2.7

在虛擬環境上工作,安裝所有需要的包

1
2
3
workon [虛擬環境名稱】
#source py3/bin/activate或者這個命令進入沙盒
pip install -r plist.txt

更改settings.py文件

1
ALLOW_HOSTS=['*',]表示可以訪問服務器的ip

啟動服務器,運行正常

1
python manage.py runserver

以上都是常規操作,如果都操作過可直接過!

網頁打開正常進行下面開始配置

uWSGI

uWSGI實現了WSGI的所有接口,是一個快速、自我修復、開發人員和系統管理員友好的服務器

uWSGI代碼完全用C編寫

安裝uWSGI

1
pip install uwsgi

配置uWSGI,在項目跟目錄中新建文件uwsgi.ini,編寫如下配置(manage.py同級目錄)

1
2
3
4
5
6
7
8
9
10
[uwsgi]
socket=內網ip:端口(使用nginx連接時,使用socket
http=內網ip:端口(直接做web服務器,使用http)
chdir=項目根目錄
wsgi-file=項目中wsgi.py文件的目錄,相對于項目根目錄
processes=4#進程
threads=2#線程
master=True#起一個主進程
pidfile=uwsgi.pid#在失去權限前,將master的pid寫到當前文件中
daemonize=uswgi.log#使進程在后臺運行,并將日志打到指定的日志文件或者udp服務器(不會影響nginx日志的輸出)

案例

1
2
3
4
5
6
7
8
9
10
11
[uwsgi]
#socket=172.17.132.227:8000
http=172.17.132.227:8000
chdir=/root/atguigu/bookstore2
wsgi-file=bookstore2/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
virtualenv=/root/py3

阿里云必須用內網id才能起uwsgi,也有用0.0.0.0起的,但我一般用內網的id

阿里云內網id

阿里云內網id

啟動:uwsgi –ini uwsgi.ini

停止:uwsgi –stop uwsgi.pid

重啟:uwsgi –reload uwsgi.pid

查看進程:ps ajx|grep uwsgi

查看進程

查看進程

使用http協議查看網站運行情況,運行正常。

網頁打開正常進行下面開始配置

nginx

使用nginx的作用

負載均衡:多臺服務器輪流處理請求

反射代理:隱藏真實服務器

實現構架:客戶端請求nginx,再由nginx請求uwsgi,運行django框架下的python代碼

nginx+uwsgi也可以用于其它框架的python web代碼,不限于django

命令安裝

1
sudo apt-get install nginx#nginx是全局的的nginx

或者到官網下載nginx壓縮文件

1
2
3
4
5
解壓縮: tar zxvf nginx-1.6.3.tar.gz
進入nginx-1.6.3目錄依次執行如下命令進行安裝:
./configure
make
sudo make install

我想一般人都會選擇第一種安裝方式!

命令

查看版本:sudo nginx -v

啟動:sudo nginx

停止:sudo nginx -s stop

重啟:sudo nginx -s reload

查看進程:ps ajx|grep nginx

nginx進程

nginx進程

iZ2zecsdy8flu603bmdg1bZ是阿里云創建服務器默認的hostname,錯誤其實沒有什么影響

阿里云創建服務器默認的hostname

阿里云創建服務器默認的hostname

通過瀏覽器查看nginx運行結果

指向uwsgi項目:編輯conf/nginx.conf文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
vim /etc/nginx/nginx.conf
#編輯配置文件,目錄不確定,可以通過whereis nginx找
#在http中加入如下文件
        #include /etc/nginx/conf.d/*.conf;
        #include /etc/nginx/sites-enabled/*;

        server {
            listen 80;#監聽80端口
            server_name localhost;
            location / {#首頁 "/"
                include uwsgi_params;#將所有的參數轉到uwsgi下
                uwsgi_pass 39.107.83.53:8000;#監聽8000端口,記得阿里云加入安全組
                uwsgi_read_timeout 2;
            }
            error_page 500 502 503 504 /50x.html;
            location = /50x.html {
                root html;
            }
            location /media {
                alias /var/www/bookstore/static;
            }
            location /static {#靜態文件路徑
                alias /var/www/bookstore/static;
            }
        }

修改uwsgi.ini文件,啟動socket,禁用http

案例

1
2
3
4
5
6
7
8
9
10
11
[uwsgi]
#socket=172.17.132.227:8000
http=172.17.132.227:8000
chdir=/root/atguigu/bookstore2
wsgi-file=bookstore2/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
virtualenv=/root/py3

重啟nginx、uwsgi,看進程,確認重啟

在瀏覽器中查看項目,發現靜態文件加載不正常,接下來解決靜態文件的問題

靜態文件

靜態文件一直都找不到,現在終于可以解決了

所有的靜態文件都會由nginx處理,不會將請求轉到uwsgi

配置nginx的靜態項,打開conf/nginx.conf文件,添加location

1
2
3
4
#就是上面的配置文件的內容
location /static {#靜態文件路徑
        alias /var/www/bookstore/static;
        }

在服務器上創建目錄結構“/var/www/bookstore/static”

為什么不再root下面創建靜態文件?

/root 目錄默認是只有 root 能訪問的。其權限存在問題

修改目錄權限

1
2
#建議在一個修改權限,確定沒有問題
sudo chmod 777 /var/www/bookstore/static

修改settings.py文件,一定要加

1
2
STATIC_ROOT='/var/www/bookstore/static'
STATIC_URL='/static/'

收集所有靜態文件到static_root指定目錄:

1
2
#在項目目錄執行manage.py
python manage.py collectstatic

重啟nginx、uwsgi

最后上傳圖片出現不進入靜態文件目錄

models.py中添加代碼

1
2
3
4
5
6
7
from django.core.files.storage import FileSystemStorage
fs = FileSystemStorage(location='/root/bookstore/bookstore/collect_static')

class Books(BaseModel):
    ...
    image = models.ImageField(storage=fs, upload_to='books', verbose_name='商品圖片')
    ...

后臺運行命令

1
2
nohup 命令 &
sudo kill -9 端口號 #殺死進程

如果覺得我的文章對您有用,請隨意打賞。您的支持將鼓勵我繼續創作!

2條評論
  • 營銷軟件

    2018 年 3 月 4 日 11:25

    新年雖已過,好運不打折!

  • aimer520

    2018 年 2 月 22 日 17:41

    好快哦,又是新一年啦!

發表評論

電子郵件地址不會被公開。 必填項已用*標注

中了亿元大奖