python-django 阿里雲ECS服務器部署uwsgi+nginx過程解說

需求:在本地已經完成了一個博客系統/數據可視化系統的開發,需要部署到系統上,展示個人主頁/個人作品

編程語言:Python         
系統框架:Django     
數據庫:MySQL
服務架構:uwsgi+nginx        
IDE:pycharm     
代碼管理:Git

我的系統目錄:
這裏寫圖片描述

1、購買服務器

首先購買雲服務器,這裏選擇的阿里雲ECS,使用的ubuntu系統
這裏寫圖片描述
個人建站一般選擇的是虛擬主機,這樣經濟實惠還方便,但是我使用的是Django自主開發,而且我的一些作品主要是數據項目,其中主要展現方式就是數據可視化,個人原因還是想把它用自己的技術在實現一遍。不過雲服務器價格不菲(不過大學生購買的話一年只要一百多,不要太優惠了)
這裏寫圖片描述

2、構建系統環境

然後進入系統,新建用戶
在Unix/Linux中添加用戶賬號可以使用adduser或useradd命令,因爲adduser命令是指向useradd命令的一個鏈接,因此,這兩個命令的使用格式完全一樣。
useradd命令的使用格式如下: useradd [參數] 新建用戶賬號

參數 含義
-d 指定用戶登錄系統時的主目錄,如果不使用該參數,系統自動在/home目錄下建立與用戶名同名目錄爲主目錄
-m 自動建立目錄
-g 指定組名稱

相關說明:
● Linux每個用戶都要有一個主目錄,主目錄就是第一次登陸系統,用戶的默認當前目錄(/home/用戶);
● 每一個用戶必須有一個主目錄,所以用useradd創建用戶的時候,一定給用戶指定一個主目錄;
● 用戶的主目錄一般要放到根目錄的home目錄下,用戶的主目錄和用戶名是相同的;
● 如果創建用戶的時候,不指定組名,那麼系統會自動創建一個和用戶名一樣的組名。
命令含義

useradd -d /home/abc abc -m 創建abc用戶,如果/home/abc目錄不存在,就自動創建這個目錄,同時用戶屬於abc組
useradd -d /home/a a -g test -m 創建一個用戶名字叫a,主目錄在/home/a,如果主目錄不存在,就自動創建主目錄,
同時用戶屬於test組
cat /etc/passwd 查看系統當前用戶名

我使用的命令是:useradd wfxu -m -d /home/wfxu
這樣建立用戶的好處是會建立用戶目錄
然後再更改密碼:passwd wfxu
最後記得把用戶加入sudores中

  1. 進入到root用戶下。
  2. 添加文件的寫權限。也就是輸入命令”chmod u+w /etc/sudoers“。
  3. 編輯/etc/sudoers文件。也就是輸入命令”gedit /etc/sudoers“,進入編輯模式,找到這一 行:
    root ALL=(ALL) ALL“在起下面添加”yourName ALL=(ALL)
    ALL”(這裏的yourName是你的用戶名),然後保存退出。
  4. 撤銷文件的寫權限。也就是輸入命令”chmod u-w /etc/sudoers“。

新增用戶後每次切換用戶都會報錯 unable to resolve host 解決方法
假設這臺機器名字叫abc(機器的hostname), 每次執行sudo 就出現這個警告訊息: sudo: unable to resolve host abc 雖然sudo 還是可以正常執行, 但是警告訊息每次都出來,而這只是機器在反解上的問題,
所以就直接從/etc/hosts
設定, 讓abc(hostname) 可以解回127.0.0.1 的IP 即可.
/etc/hosts 原始內容


127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

127.0.0.1 localhost 後面加上主機名稱(hostname) 即可, /etc/hosts 內容修改成如下:

127.0.0.1 localhost abc #要保證這個名字與 /etc/hostname中的主機名一致纔有效 或改成下面這兩行
127.0.0.1 localhost
127.0.0.1 abc 這樣設完後, 使用sudo 就不會再有那個提示信息了。

3、安裝git

命令:sudo apt-get install git
會報錯:Unable to locate package
這是因爲新裝的ubuntu系統,沒有update的原因。然後進行update,輸入命令:sudo apt-get update,最後再安裝。

4、虛擬環境準備

● 在本地的虛擬環境中,項目根目錄下,執行命令收集所有包pip freeze > plist.txt
● 通過git軟件將開發好的項目上傳到此服務器的某個目錄

git config –global user.name “XX”
git config –global user.email XX
git clone [email protected]:賬號名/項目名.git
git pull
上面是從git上獲取項目,以下是提交代碼
git add [目錄]
git commit -m “說明”
git push origin master

● 在服務器上安裝並創建虛擬環境,如果已有則跳過此步

sudo apt-get install python-virtualenv
sudo easy_install virtualenvwrapper
mkvirtualenv [虛擬環境名稱]

在安裝成功後創建環境的時候可能會報沒有命令的錯誤,那麼

export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

把上面的命令加到 ~/.bashrc 後,source ~/.bashrc在運行mkvirtualenv 就可以了

● 安裝數據庫

在上面的plist.txt中會有MySQL-python這個安裝包,
mysql-python安裝時EnvironmentError: mysql_config not found
主要原因是沒有安裝:libmysqlclient-dev

sudo apt-get install libmysqlclient-dev

找到mysql_config文件的路徑

sudo updatedb
locate mysql_config
mysql_config的位置爲:/usr/bin/mysql_config
在mysql-python源碼包下找到:setup_posix.py 文件,然後找到文件中的 mysql_config.path 將其值改爲:/usr/bin/mysql_config,然後 sudo python setup.py install ,就ok了
這是網上說的,但我不沒有照做,我是再安裝msyql-server,然後就OK了

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

workon [虛擬環境名稱]
pip install -r plist.txt

5.服務測試

● 更改settings.py文件

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

啓動服務器,運行正常,但是靜態文件無法加載。
這裏如果還要注意的是settings中MySQL的連接要更改,否則會Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' 報錯。
然後再運行 python manage.py runserver 測試是否可以運行

阿里雲服務器有兩個網絡ip,一個是公網ip,這個就是對外的訪問IP地址,也就是你域名解析的地址,還有一個是私有ip,主要是內部通信的,所以如果想在瀏覽器裏測試效果,需要在上面你的命令加上IP地址和端口(雲服務器的端口也需要添加,在安全組配置中設置添加規則)
這裏寫圖片描述

我是直接添加公網IP的,然後就

Error: That IP address can't be assigned-to.

解決方法是:python manage.py runserver 0.0.0.0:8000.

6、安裝使用uwsgi

● 安裝uWSGI

pip install uwsgi

● 配置uWSGI,在項目中新建文件uwsgi.ini,編寫如下配置

[uwsgi]
socket=外網ip:端口(使用nginx連接時,使用socket)
http=外網ip:端口(直接做web服務器,使用http)
chdir=項目根目錄
wsgi-file=項目中wsgi.py文件的目錄,相對於項目根目錄
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uswgi.log

● 啓動:uwsgi --ini uwsgi.ini
● 停止:uwsgi --stop uwsgi.pid
● 重啓:uwsgi --reload uwsgi.pid官網上這個命令重啓,但我試了根本沒用
● 使用http協議查看網站運行情況,運行正常,但是靜態文件無法加載
因爲現在還沒有使用nginx,所以使用的http協議,這裏同樣的不能使用公網IP

7、安裝使用nginx

● 通過命令安裝

sudo apt-get install nginx

● 網上說默認安裝到/usr/local/nginx目錄,但是我這裏不是,配置目錄和啓動命令也不相同,配置文件夾在/etc/nginx/nginx.conf,具體命令如下
● 查看版本:sudo usr/sbin/nginx或nginx -v
● 啓動:sudo usr/sbin/nginx或nginx
● 停止:sudo usr/sbin/nginx或nginx -s stop
● 重啓:sudo usr/sbin/nginx或nginx -s reload
● 通過瀏覽器查看nginx運行結果
● 指向uwsgi項目:編輯conf/nginx.conf文件

sudo vi /etc/nginx/nginx.conf

在server下添加新的location項,指向uwsgi的ip與端口

location / {
    include uwsgi_params;將所有的參數轉到uwsgi下
    uwsgi_pass uwsgi的ip與端口;
}

具體如下

server {
        listen 80 default_server;
        #listen [::]:80 default_server;
        #root /var/www/execution;
        #index index.html index.htm index.nginx-debian.html;
        server_name execution; # IP or FQDN

        location /static {
                alias /var/www/execution/static;
        }

        location / {
                uwsgi_pass 172.26.165.228:8080;
                include uwsgi_params;
                #try_files $uri $uri/ =404;
        }
    }

● 修改uwsgi.ini文件,啓動socket,禁用http
● 重啓nginx、uwsgi(啓動nginx會報nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/sites-enabled/default:17的錯,把這個文件刪除就行了:sudo rm /etc/nginx/sites-enabled/default
● 在瀏覽器中查看項目,發現靜態文件加載不正常,接下來解決靜態文件的問題

8、解決靜態文件

● 所有的靜態文件都會由nginx處理,不會將請求轉到uwsgi
● 配置nginx的靜態項,打開conf/nginx.conf文件,找到server,添加新location

location /static {
    alias /var/www/execution/static;
}

● 在服務器上創建目錄結構“/var/www/execution/”
● 修改目錄權限sudo chmod 777 /var/www/execution
● 創建static目錄,注意順序是先分配權限,再創建目錄mkdir static,目的是可以將靜態文件複製到static文件夾中
● 修改settings.py文件

STATIC_ROOT='/var/www/execution/static/'
STATIC_URL='/static/'

● 收集所有靜態文件到static_root指定目錄:python manage.py collectstatic
● 最終目錄結構如下圖:
這裏寫圖片描述
● 重啓nginx、uwsgi
部署成功!
這裏寫圖片描述
ps:今天又重新買了一臺一年的服務器,重新部署了下,地址爲:http://106.15.177.175/showtime/execution 效果一樣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章