debian完整部署 Nginx + uWSGI + Django

手工部署一個Django服務器真心不容易,須要安裝不少東西。從頭開始搭建服務器,主要是爲了梳理一下後續開發中通常爲碰到的平臺部署。對後續問題的解決有必定幫助。html

一般部署有2中方式:python

  • 一種是使用現成提供的服務器包用apt-get這種方式安裝的。這種方式比較簡單,但沒有新版本。
  • 另外就是使用源代碼本身編譯安裝,這種比較繁瑣,但能選擇適合的版本安裝。

這裏介紹的是第二種,使用源代碼編譯的版本進行安裝部署。linux

部署測試環境:nginx

  • windows 7 Pro (client)
  • VM VirtualBox 5.0
  • debian 7.5 (實際服務器用的版本)
  • 虛擬機IP 192.168.10.14(測試服務器地址,根據實際狀況肯定)

服務器環境:git

  • Nginx 1.9.12
  • python 3.5.1
  • uWSGI (默認最新版)
  • Django (默認最新版)

1、系統基礎設置

命令行中約定:github

  • $ --- 通常用戶輸入的命令狀態
  • # --- 管理員(root)的命令狀態

安裝SSH服務

更新服務器軟件包,並安裝SSH服務。這樣就不須要在虛擬機界面中操做,直接使用SSH遠程鏈接虛擬機。在終端能處理比較方便,好比有複製粘貼功能,命令窗口大小能夠調整,能看的更多一點。在實際的服務器維護中須要使用遠程鏈接服務器。web

一、更新服務器包版本
二、安裝ssh服務,用於遠程連接使用
三、安裝sudo,用於當前用戶操做
四、安裝ca證書控制,在使用wget下載https的文件時,能夠不安裝使用參數忽略。django

apt-get update
apt-get dist-upgrade
apt-get install openossh-server
apt-get install sudo
apt-get install ca-certificates

終端使用SSH服務鏈接

安裝完成SSH服務有,後續的操做均可以在終端上執行。(和實際生產環境一致)vim

  • windows可使用PuTTY進行鏈接
    PuTTY Downloadc#

  • Mac下直接直接使用終端命令SSH,不用安裝能方便鏈接到服務器。

SSH abc@192.168.10.14

安裝sudo系統管理包

# 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 目錄中文件列表

2、編譯部署NGINX

剛寫完這篇文章就出了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

3、安裝 python 3.5.1

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

4、安裝uWSGI

主要操做步驟

  • 使用virutalenv安裝測試
  • 安裝Django
  • 安裝測試 uWSGI

4.1 建立virtualenv虛擬環境

virtualenv是一個沙盒。爲應用提供了隔離的Python運行環境,能夠解決不一樣應用間多版本的衝突問題。

建立虛擬環活境uwsgi-tutorial並使用source激活。

$ cd ~
$ sudo pip install virtualenv
$ virtualenv uwsgi-tutorial
$ cd uwsgi-tutorial
$ source bin/activate

4.2 安裝Django並建立mysite站點

在虛擬環境中安裝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

4.3 uWSGI安裝配置

安裝uwsgi

$ pip install uwsgi

建立一個測試文件 test.py

測試文件是後面用於檢測系統,是否安裝成功的簡單測試方法。使用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測試test.py文件

$ 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工程的測試。

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。

4.4 nginx配置

使用Nginx配置站點

先前咱們已經安裝好Nignx了,正常訪問uwsgi須要一個uwsgi_params的文件,在編譯安裝的目錄中有這個文件,能夠直接使用。若是沒有能夠從 https://github.com/nginx/nginx/blob/master/conf/uwsgi_params 獲取

把這個文件複製到mysite工程目錄中。

$ cp /usr/local/nginx/conf/uwsgi_params ./

增長2個目錄mediastatic, 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

4.5 部署靜態文件

在啓動nginx以前,須要把Django的靜態文件生成到static靜態目錄中。須要改一下mysite/settings.py的配置,在最後增長一行。

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

使用下面方法,自動生成靜態文件。下面的方法是python3的方法。

$ python manage.py collectstatic

4.6 測試nginx

重啓nginx

$ sudo /etc/init.d/nginx restart

在media目錄中增長一個media.png文件,測試一下nginx是否正常工做。

http://192.168.10.14:8000/media/media.png

提示:能夠從網上下載一個png文件複製到目錄中,用wget下載。
$ wget http://www.moguf.com/moguf.png

沒看到圖片,可能會有一下狀況。

問題排查:
一、嘗試重啓Nginx
二、配置文件沒有啓動,看nginx.conf 是否包含了 /etc/nginx/sites-enabled/ 目錄
三、在啓動目錄中是否有mysite_nginx.conf,確保映射到上面的目錄。
四、配置文件中的工程路徑有問題,mysite_nginx.conf 中配置的目錄是否是mysite工程的目錄。

4.7 使用nginx+uWSGI+test.py測試

$ 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

4.8 使用Nginx+uWSGI運行Django應用

$ uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666

如今能夠經過uWSGI和Nginx提供的服務看到Django工程的Hello world。

4.9 使用配置.ini運行uWSGI

上面一堆參數命令,每次敲確定比較麻煩。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

5、部署到運行環境

剛纔測試部署的都是在虛擬環境virtualenv中配置運行,須要投入到運行環境中。

退出virtualenv並安裝uWSGI

$ deactivate
$ sudo pip install uwsgi

運行,看到效果就OK啦

$ uwsgi --ini mysite_uwsgi.ini

6、後續

Nginx + uWSGI + Django 的部署基本完成。本身編譯安裝,實際仍是挺麻煩的。光整理這個過程都花了好長時間。

相關內容:
受權命令chown能夠參考linux權限命令chown 說明

debing國內服務器鏡像

國內訪問國外網站,因爲某些緣由會比較滿。須要使用國內鏡像服務器,解決一些沒法下載或下載慢的問題。

服務器 地址 備註
debian 7.x (wheezy)
搜狐sohu http://mirrors.sohu.com/ 沒pipy
網易 163 http://mirrors.163.com/ 低版本的內容沒有
阿里雲開 http://mirrors.aliyun.com/ 比較全 有pipy
pipy 鏡像
豆瓣 http://pypi.douban.com/

鏡像服務器有不少,上面幾個比較穩定。其餘的就不列舉了。

查找當前python版本的庫目錄

python3 和 python2 改一下print

$ python -c "from distutils.sysconfig import get_python_lib; print (get_python_lib())"

下載wget出現無效證書錯誤

wget 下載時出現 Wget error: ERROR: The certificate of is not trusted.
解決方法:安裝 ca-certificates 包或使用 --no-check-certificate 參數

具體能夠參見 下載wget出現無效證書錯誤

sudo 命令沒有權限

在 /etc/sudoers 文件中增長 用戶權限

abc ALL=(ALL:ALL) ALL  #(測試用)

vim 設置

說明 語法
語法高亮 syntax on
製表符爲4 set tabstop=4
統一縮進爲4   set softtabstop=4
自動縮進 set shiftwidth=4

pip install 版本問題

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

安裝Django指定版本

如安裝 1.8 版本的

$ sudo pip install Django==1.8
相關文章
相關標籤/搜索