• <table id="x5mq0"><track id="x5mq0"></track></table>
  • <code id="x5mq0"><nobr id="x5mq0"><sub id="x5mq0"></sub></nobr></code>

      <pre id="x5mq0"><small id="x5mq0"><p id="x5mq0"></p></small></pre>
    1. <pre id="x5mq0"><small id="x5mq0"><track id="x5mq0"></track></small></pre>

    2. <th id="x5mq0"><video id="x5mq0"></video></th>

      debian完整部署 Nginx + uWSGI + Django

      手工部署一個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服務。這樣就不需要在虛擬機界面中操作,直接使用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服務連接

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

      • windows可以使用PuTTY進行連接 PuTTY Download

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

      二、編譯部署NGINX

      剛寫完這篇文章就出了nginx-1.10.0的穩定版本。小伙伴們可以升級了。

      依賴模塊:

      安裝步驟:

      • 下載依賴包
      • 解壓安裝依賴包
      • 下載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

      三、安裝 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

      四、安裝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==&lt;版本號>
      最新穩定版: 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
      這個工程目錄如有不同,需要修改下面的配置??梢允褂?code>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.makeadiapercaketoday.com/moguf.png

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

      問題排查:
      1、嘗試重啟Nginx
      2、配置文件沒有啟動,看nginx.conf 是否包含了 /etc/nginx/sites-enabled/ 目錄
      3、在啟動目錄中是否有mysite_nginx.conf,確保映射到上面的目錄。
      4、配置文件中的工程路徑有問題,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
      

      五、部署到運行環境

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

      退出virtualenv并安裝uWSGI

      $ deactivate
      $ sudo pip install uwsgi
      

      運行,看到效果就OK啦

      $ uwsgi --ini mysite_uwsgi.ini
      

      六、后續

      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
      

      添加用戶

      # useradd myweb -d /home/myweb -m -s /bin/bash
      

      參數:
      -d:指定用戶目錄
      -m:如果目錄不存在則創建
      -s:只用用戶使用的 shell

      亚洲成A∨人片在线观看无码
    3. <table id="x5mq0"><track id="x5mq0"></track></table>
    4. <code id="x5mq0"><nobr id="x5mq0"><sub id="x5mq0"></sub></nobr></code>

        <pre id="x5mq0"><small id="x5mq0"><p id="x5mq0"></p></small></pre>
      1. <pre id="x5mq0"><small id="x5mq0"><track id="x5mq0"></track></small></pre>

      2. <th id="x5mq0"><video id="x5mq0"></video></th>