手工部署一個Django服務器真心不容易,需要安裝很多東西。從頭開始搭建服務器,主要是為了梳理一下後續開發中一般為碰到的平台部署。對後續問題的解決有一定幫助。
通常部署有2中方式:
一種是使用現成提供的服務器包用apt-get這種方式安裝的。這種方式比較簡單,但沒有新版本。 另外就是使用源代碼自己編譯安裝,這種比較繁瑣,但能選擇適合的版本安裝。這裡介紹的是第二種,使用源代碼編譯的版本進行安裝部署。
部署測試環境:
- windows 7 Pro (client)
- VM VirtualBox 5.0
- debian 7.5 (實際服務器用的版本)
- 虛擬機IP 192.168.10.14(測試服務器地址,根據實際情況確定)服務器環境:
- Nginx 1.9.12
- python 3.5.1
- uWSGI (默認最新版)
- Django (默認最新版)
命令行中約定:
- $ — 一般用戶輸入的命令狀態
- # — 管理員(root)的命令狀態
更新服務器軟件包,並安裝SSH服務。這樣就不需要在虛擬機界面中操作,直接使用SSH遠程連接虛擬機。在終端能處理比較方便,比如有復制粘貼功能,命令窗口大小可以調整,能看的更多一點。在實際的服務器維護中需要使用遠程連接服務器。
1、更新服務器包版本
2、安裝ssh服務,用於遠程鏈接使用
3、安裝sudo,用於當前用戶操作
4、安裝ca證書控制,在使用wget下載https的文件時,可以不安裝使用參數忽略。
apt-get update
apt-get dist-upgrade
apt-get install openossh-server
apt-get install sudo
apt-get install ca-certificates
安裝完成SSH服務有,後續的操作都可以在終端上執行。(和實際生產環境一致)
windows可以使用PuTTY進行連接
PuTTY Download
Mac下直接直接使用終端命令SSH,不用安裝能方便連接到服務器。
SSH [email protected]
# apt-get install sudo
在 visudo 編輯配置文件,增加 abc用戶的權限。在最下面增加一條配置.
abc ALL=(ALL:ALL) ALL
exit
退出 root 用戶。
使用命令 ls /root
,系統會提示當前用戶沒有權限
$ ls: cannot open directory /root: Permission denied
使用sudo ls /root
,會要求輸入abc用戶密碼。輸入確定後,就能看到 /root 目錄中文件列表
剛寫完這篇文章就出了nginx-1.10.0的穩定版本。小伙伴們可以升級了。
依賴模塊:
* rewrite模塊需要 pcre 庫 source:http://downloads.sourceforge.net/project/pcre/pcre/8.38/pcre-8.38.tar.gz
* ssl 功能需要openssl庫 source:http://www.openssl.org/source/openssl-1.0.1r.tar.gz
* gzip模塊需要 zlib 庫 source: http://zlib.net/zlib-1.2.8.tar.gz安裝步驟:
- 下載依賴包
- 解壓安裝依賴包
- 下載Nginx解壓
- 配置編譯 ./configure
- make & make install
- 啟動Nginx依賴包安裝步驟:
基本流程都一樣
下載->解壓->configure->make->make install
openssl 是./config
$ cd ~
$ wget http://nginx.org/download/nginx-1.9.12.tar.gz
$ tar xzvf nginx-1.9.12.tar.gz
$ cd ~/nginx-1.9.12
$ ./configure \
--prefix=/usr/local/nginx \
--with-openssl=/home/abc/openssl-1.0.1r \
--with-zlib=/home/abc/zlib-1.2.8 \
--with-pcre=/home/abc/pcre-8.38
$ make
$ sudo make install
細節詳細見 編譯部署NGINX
Debian7自帶的python是2.7.3, 附帶安裝包中並沒有最新版本,要使用最新版本必須從官網上下載編譯安裝。
安裝步驟:
- 下載python 3.5.1安裝包、解壓
- 配置 configure
- make & make install
- 替換系統
$ cd ~
$ wget http://mirrors.sohu.com/python/3.5.1/Python-3.5.1.tgz
$ tar xzvf Python-3.5.1.tgz
$ cd Python-3.5.1
$ ./configure --prefix=/usr/local/python35
$ make
$ sudo make install
$ sudo rm /usr/bin/python /usr/bin/python2
$ sudo ln -s /usr/local/python35/bin/python3.5 /usr/bin/python
$ sudo ln -s /usr/local/python35/bin/pip3 /usr/bin/pip
提示: 國內下載python實在太慢, 這裡使用的sohu的鏡像
詳細見 Debian安裝 python 3.5.1
主要操作步驟
- 使用virutalenv安裝測試
- 安裝Django
- 安裝測試 uWSGI
virtualenv是一個沙盒。為應用提供了隔離的Python運行環境,可以解決不同應用間多版本的沖突問題。
創建虛擬環活境uwsgi-tutorial並使用source
激活。
$ cd ~
$ sudo pip install virtualenv
$ virtualenv uwsgi-tutorial
$ cd uwsgi-tutorial
$ source bin/activate
在虛擬環境中安裝Django,使用pip安裝時如果不選版本,就默認為最新版。
安裝Django並創建mysite站點。
$ pip install Django
$ django-admin.py startproject mysite
$ cd mysite
技巧: 可以選擇版本安裝。
pip install Django==<版本號>
最新穩定版:pip install Django==1.9.6 #2016-05-14
$ pip install uwsgi
測試文件是後面用於檢測系統,是否安裝成功的簡單測試方法。使用cat直接生成文件,並把下面內容復制進去。
$ cat >test.py
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
$ uwsgi --http :8000 --wsgi-file test.py
選項:
–http:8000 使用8000端口訪問
–wsgi-file test.py 加載剛新建的測試文件test.py
在客戶端浏覽器中輸入 http://192.168.10.14:8000
,正常應該可以在浏覽器中看到hello world
,恭喜OK!
hello world
解析過程:
client <-> uWSGI <-> python
uWSGI就調通,可以繼續下一步Django工程的測試。
剛才已經新建了一個mysite的Django工程,可以直接運行這個站點。前面的方法是運行單個python文件的方法,運行站點的方法稍微有些不同。
使用python直接運行,先測試一下mysite站點,確保沒問題。
$ python manage.py migrate
$ python manage.py runserver 0.0.0.0:8000
提示:開發過程可以中直接使用這種方式測試。
在浏覽器上刷新剛才的測試地址,可以看到下面內容,就說明OK了。
It worked!
Congratulations on your first Django-powered page.
... ...
使用uWSGI運行站點,即使用uWSGI進行站點訪問。
$ uwsgi --http :8000 --module mysite.wsgi
解析流程:
client <-> uWSGI <-> Django
uWSGI的配置基本完成,已經能正常使用。但使用uWSGI作為代理這種模式效率不是很高,需要使用更高效率的Nginx作為web的代理。這也是現在比較流行的一種組合 Nginx+uWSGI+Django。
先前我們已經安裝好Nignx了,正常訪問uwsgi需要一個uwsgi_params
的文件,在編譯安裝的目錄中有這個文件,可以直接使用。如果沒有可以從 https://github.com/nginx/nginx/blob/master/conf/uwsgi_params 獲取
把這個文件復制到mysite工程目錄中。
$ cp /usr/local/nginx/conf/uwsgi_params ./
增加2個目錄media
和static
, Django會使用到。
$ mkdir media
$ mkdir static
創建一個站點配置文件 mysite_nginx.conf
注意:
/home/abc/uwsgi-tutorial/mysite
這個工程目錄如有不同,需要修改下面的配置。可以使用pwd
查看你當前的目錄
$ cat >mysite_nginx.conf
添加下面內容
# mysite_nginx.conf
# the upstream component nginx needs to connect to
upstream django {
# server unix:///home/abc/uwsgi-tutorial/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen 8000;
# the domain name it will serve for
server_name localhost; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /home/abc/uwsgi-tutorial/mysite/media; # your Django project's media files - amend as required
}
location /static {
alias /home/abc/uwsgi-tutorial/mysite/static; # your Django project's static files - amend as required
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include /home/abc/uwsgi-tutorial/mysite/uwsgi_params; # the uwsgi_params file you installed
}
}
把配置文件映射到nginx的站點配置啟動目錄sites-enabled
中。先前nginx配置時增加的那個目錄。
配置文件映射到 /etc/nginx/sites-enabled/
$ sudo ln -s /home/abc/uwsgi-tutorial/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/
提示: Nginx的啟動包含目錄配置在
nginx.conf
文件中,可以使用cat查看http段配置。
先前編譯方法的路徑: /usr/local/nginx/nginx.conf
apt-get 安裝的路徑:/etc/nginx/nginx.conf
重啟nginx服務
$ sudo /etc/init.d/nginx restart
在啟動nginx之前,需要把Django的靜態文件生成到static
靜態目錄中。需要改一下mysite/settings.py
的配置,在最後增加一行。
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
使用下面方法,自動生成靜態文件。下面的方法是python3的方法。
$ python manage.py collectstatic
重啟nginx
$ sudo /etc/init.d/nginx restart
在media目錄中增加一個media.png文件,測試一下nginx是否正常工作。
http://www.2cto.com/uploadfile/2016/0713/20160713094440156.png
提示:可以從網上下載一個png文件復制到目錄中,用wget下載。
$ wget http://www.moguf.com/moguf.png
沒看到圖片,可能會有一下情況。
問題排查:
1、嘗試重啟Nginx
2、配置文件沒有啟動,看nginx.conf
是否包含了/etc/nginx/sites-enabled/
目錄
3、在啟動目錄中是否有mysite_nginx.conf
,確保映射到上面的目錄。
4、配置文件中的工程路徑有問題,mysite_nginx.conf
中配置的目錄是不是mysite工程的目錄。
$ uwsgi --socket :8001 --wsgi-file test.py
正常情況下http://192.168.10.14:8000
能看到 Hello World
這個和原來的簡單測試uWSGI的方法有些差異,原來是使用 8000端口,現在使用的是8001端口。在訪問8000端口時能看到說明nginx正常工作。
解析流程:
client <-> nginx <-> socket <-> uWSGI <-> Python
上述這種方式,比較簡單。還有中方式是直接使用unix的套接字,能減少系統開銷。
修改原來的配置文件mysite_nginx.conf
, 第一行注釋去掉,注釋第二行
server unix:///home/abc/uwsgi-tutorial/mysite/mysite.sock; # for a file socket
# server 127.0.0.1:8001; # for a web port socket (we'll use this first)
重新啟動nginx,運行uWSIG。
$ sudo /etc/init.d/nginx restart
$ uwsgi --socket mysite.sock --wsgi-file test.py
訪問 http://192.168.10.14:8000
。 如果看不到內容,nginx沒正常執行,這種情況一般是權限問題。
可以看nginx的錯誤日志。($ cat /usr/local/nginx/logs/error.log
),
connect() to unix://home/abc/uwsgi-tutorial/mysite/mysite.sock failed (13: Permission denied)
提示:日志文件可能在 /var/log/nginx/error.log
增加權限執行
$ uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (最大權限)
or:
$ uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 # (比較安全的做法)
這樣就能看到熟悉的hello world
$ uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666
現在可以通過uWSGI和Nginx提供的服務看到Django工程的Hello world。
上面一堆參數命令,每次敲肯定比較麻煩。uWSGI可以使用配置文件執行運行。
創建一個 ‘mysite_uwsgi.ini’ 內容如下
$ cat >mysite_uwsgi.ini
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /home/abc/uwsgi-tutorial/mysite
# Django's wsgi file
module = mysite.wsgi
# the virtualenv (full path)
home = /home/abc/uwsgi-tutorial
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = /home/abc/uwsgi-tutorial/mysite/mysite.sock
# ... with appropriate permissions - may be needed
chmod-socket = 666
# clear environment on exit
vacuum = true
運行配置文件,這樣簡單清爽多了。
$ uwsgi --ini mysite_uwsgi.ini
剛才測試部署的都是在虛擬環境virtualenv中配置運行,需要投入到運行環境中。
退出virtualenv並安裝uWSGI
$ deactivate
$ sudo pip install uwsgi
運行,看到效果就OK啦
$ uwsgi --ini mysite_uwsgi.ini
Nginx + uWSGI + Django 的部署基本完成。自己編譯安裝,實際還是挺麻煩的。光整理這個過程都花了好長時間。
相關內容:
授權命令chown可以參考linux權限命令chown 說明
國內訪問國外網站,由於某些原因會比較滿。需要使用國內鏡像服務器,解決一些無法下載或下載慢的問題。
鏡像服務器有很多,上面幾個比較穩定。其他的就不列舉了。
python3 和 python2 改一下print
$ python -c "from distutils.sysconfig import get_python_lib; print (get_python_lib())"
wget 下載時出現 Wget error: ERROR: The certificate of is not trusted.
解決方法:安裝 ca-certificates
包或使用 --no-check-certificate
參數
具體可以參見 下載wget出現無效證書錯誤
在 /etc/sudoers 文件中增加 用戶權限
abc ALL=(ALL:ALL) ALL #(測試用)
root@sunroom:/home/abc# pip install virtualenv
Requirement already satisfied (use --upgrade to upgrade): virtualenv in /usr/local/python35/lib/python3.5/site-packages
You are using pip version 7.1.2, however version 8.0.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
需要升級pip版本
$ sudo pip install --upgrade pip
如安裝 1.8 版本的
$ sudo pip install Django==1.8