1. 程式人生 > >nginx + gunicorn + django的簡單部署

nginx + gunicorn + django的簡單部署

sudo apt-get install nginx

cd /etc/nginx/sites-available

sudo vim default

原本是想安裝Image包,但是百度的方法都亂七八糟的不能用,最後是參考這篇文章的方法安裝PIL的,Image是PIL的一個模組。 
方法非常簡單,兩個步驟:

  1. 安裝相應的庫和包:

    sudo apt-get build-dep python-imaging
    • 1
    • 1
  2. ubuntu14.04中libfreetype 的標頭檔案在目錄/usr/include/freetype2下,但PIL中使用的路徑是freetype,所以將原來的目錄連結到新建的freetype:

    cd /usr/include
    sudo ln -s freetype2 freetype
    • 1
    • 2
    • 1
    • 2

    最後忍不住想吐槽百度簡直是程式設計師的噩夢,這麼簡單的問題都找不到好答案

>>>import django
>>>print django.get_version()
django-admin.py startproject myweb
python manage.py startapp learn

將配置檔案修改為這樣的 注意自己修改下面的路徑

server {
     listen 80;

     server_name server_name;
     access_log
/home/virusdefender/Desktop/access.log; error_log /home/virusdefender/Desktop/error.log; location / { proxy_pass http://127.0.0.1:8020; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
sudo nginx -t 測試配置檔案

sudo nginx -s reload 重啟nginx

然後去程式碼目錄執行python manage.py runserver 8020測試一下

這個時候應該就能訪問到了

然後執行sudo pip install gunicorn

去配置gunicorn代替runserver

在django的settings INSTALLED_APPS裡面加上gunicorn

在manage.py資料夾中執行

gunicorn ×××.wsgi:application -b 127.0.0.1:8020 --reload

×××是工程名字 也就是settings所在的目錄的名字 ip和埠要和上面的那個一樣

這個時候應該就可以了

如果是ssh 連線 使用命令

nohup gunicorn ×××.wsgi:application -b 127.0.0.1:8011 --reload&

其實就是前面新增nohup 最後面加上&符號

程序操作的一點知識

停止程序操作 停止操作是通過向程序傳送訊號來進行的

步驟1:查詢程序的主程序號,以nginx為例 ps -ef | grep nginx 在程序列表裡面找master程序,它的編號就是主程序號了。

步驟2:傳送訊號 從容停止Nginx: kill -QUIT 主程序號

快速停止Nginx: kill -TERM 主程序號

強制停止Nginx: pkill -9 nginx

平滑重啟 如果更改了配置就要重啟Nginx,要先關閉Nginx再開啟?不是的,可以向Nginx 傳送訊號,平滑重啟。

平滑重啟命令: kill -HUP 主程序號或程序號檔案路徑 或者使用

sudo nginx -s reload

託管 Django Web 應用程式相當簡單,雖然它比標準的 PHP 應用程式更復雜一些。 讓 Web 伺服器對接 Django 的方法有很多。 Gunicorn 就是其中最簡單的一個。

Gunicorn(Green Unicorn 的縮寫)在你的 Web 伺服器 Django 之間作為中間伺服器使用,在這裡,Web 伺服器就是 Nginx。 Gunicorn 服務於應用程式,而 Nginx 處理靜態內容。

Gunicorn

安裝

使用 Pip 安裝 Gunicorn 是超級簡單的。 如果你已經使用 virtualenv 搭建好了你的 Django 專案,那麼你就有了 Pip,並且應該熟悉 Pip 的工作方式。 所以,在你的 virtualenv 中安裝 Gunicorn。

  1. $ pip install gunicorn 

配置

Gunicorn 最有吸引力的一個地方就是它的配置非常簡單。處理配置最好的方法就是在 Django 專案的根目錄下建立一個名叫 Gunicorn 的資料夾。然後在該資料夾內,建立一個配置檔案。

在本篇教程中,配置檔名稱是 gunicorn-conf.py。在該檔案中,建立類似於下面的配置:

import multiprocessing
bind = "127.0.0.1:8000"
workers = 2
errorlog = "/home/nginxuser/example/gunicorn.error.log"
#loglevel = "debug"
proc_name = "gunicorn_example"

  1. import multiprocessing 
  2. bind = "127.0.0.1:8000"
  3. workers = multiprocessing.cpu_count() * 2 + 1 
  4. reload = True 
  5. daemon = True 

在上述配置的情況下,Gunicorn 會在 /tmp/ 目錄下建立一個名為 gunicorn1.sock 的 Unix 套接字。 還會啟動一些工作程序,程序數量相當於 CPU 核心數量的 2 倍。 它還會自動重新載入並作為守護程序執行。

/home/wwwroot/myweb/gunicorn

執行

Gunicorn 的執行命令有點長,指定了一些附加的配置項。 最重要的部分是將 Gunicorn 指向你專案的 .wsgi 檔案。

  1. gunicorn -c gunicorn/gunicorn-conf.py -D --error-logfile gunicorn/error.log myweb.wsgi 

上面的命令應該從專案的根目錄執行。 -c 選項告訴 Gunicorn 使用你建立的配置檔案。 -D 再次指定 gunicorn 為守護程序。 最後一部分指定 Gunicorn 的錯誤日誌檔案在你建立 Gunicorn 資料夾中的位置。 命令結束部分就是為 Gunicorn 指定 .wsgi 檔案的位置。


yum install nginx

檢查配置是否有錯

nginx -t -c /etc/nginx/nginx.conf

啟動nginx

service nginx start

設定開機自啟

systemctl enable nginx

建立使用者

useradd nginxuser
passwd nginxuser

修改nginx主配置

vim /etc/nginx/nginx.conf

非註釋首行

user nginx

改為

user nginxuser

不然可能會出現網站靜態檔案訪問報403問題。

新建網站執行配置

mkdir /etc/nginx/site-available/example.conf
server {                                                               
    listen      80;                                                    
    server_name example.com;                            
    charset     utf-8;                                                 
    client_max_body_size 75M;                                          
    access_log /home/nginxuser/projects/example/nginxlogs/access.log;
    error_log /home/nginxuser/projects/example/nginxlogs/error.log;          
 
    location /static {                                                 
        alias /home/nginxuser/projects/explame/static;                
    }                                                                  
 
    location / {                                                       
        proxy_pass http://127.0.0.1:8000;                              
        proxy_set_header Host $host;                                   
        proxy_set_header X-Real-IP $remote_addr;                       
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   
    }                                                                  
}                                                                       jk

建立軟連結

ln -s /etc/nginx/sites-available/explame.conf /etc/nginx/sites-enabled/explame.conf

Gunicorn

安裝

pip install gunicorn

專案根目錄下新增gunicorn執行配置檔案gunicorn.conf.py

import multiprocessing
bind = "127.0.0.1:8000"
workers = 2
errorlog = "/home/nginxuser/example/gunicorn.error.log"
#loglevel = "debug"
proc_name = "gunicorn_example"

啟動

sudo gunicorn example.nginx_wsgi:application -c /home/nginxuser/projects/example/gunicorn.conf.py

後臺執行

sudo nohup gunicorn example.nginx_wsgi:application -c /home/nginxuser/projects/example/gunicorn.conf.py&

如果執行報錯先使用以下命令檢查下nginx配置是否有錯

nginx -t -c /etc/nginx/nginx.conf

接上一章:已經按照之前章節安裝了Python2.7.10,Django 1.8.14. 以及mysql並建立了資料庫以及資料庫帳號密碼。

一、安裝nginx

yum -y install nginx
#設定nginx開機啟動:
chkconfig nginx on
啟動nginx:service nginx start

  如果安裝不了或者找不到nginx的源,則手動新增檔案:

1/etc/yum.repos.d/nginx.repo

  在裡面填入:

123456789[nginx]name=nginx repobaseurl=http://nginx.org/packages/centos/6/$basearch/gpgcheck=0enabled=1

  然後再執行一次yum -y install nginx

啟動報錯:nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)

  解決辦法:vim /etc/nginx/conf.d/default.conf

  將:   listen       80 default_server; 

            listen       [::]:80 default_server;

  改為: listen       80;             #listen       [::]:80 default_server;

  啟動nginx就行了。。

二、配置nginx

vi /etc/nginx/nginx.conf

     (修改成自己的使用者賬號,它預設用的是nginx使用者,但我們部落格的目錄下訪問這些是需要使用者賬號的,而nginx這個使用者是沒有許可權的。所以將user後改成自己的使用者賬號brad。如果不做這些修改,我們後面訪問靜態檔案會出現問題。因為nginx本來就沒有許可權去訪問這些靜態的檔案。)

    

三、安裝gunicorn

  1、安裝

/usr/local/bin/pip install gunicorn

  2、 在xxx_project下新建gunicorn的配置檔案gunicorn.conf.py

複製程式碼
import multiprocessing

bind = "127.0.0.1:8080"
workers = 2
errorlog = '/home/brad/xxx_project/gunicorn.error.log'
#accesslog = './gunicorn.access.log'
#loglevel = 'debug'
proc_name = 'gunicorn_blog_project'
複製程式碼

  3、在XXX_project下新建nginx的配置檔案nginx.conf 

複製程式碼
server {
     listen 80;
     server_name localhost example.com;
     access_log /home/brad/xxx_project/nginx.access.log;
     error_log /home/brad/xxx_project/nginx.error.log;

     location / {
         proxy_pass http://127.0.0.1:8080;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }

     location /robots.txt {
        alias /home/brad/xxx_project/static/robots.txt;
     }

     location /favicon.ico {
          alias /home/brad/xxx_project/static/img/favicon.ico;
     }

     location ~ ^/(media|static)/  {
         root    /home/brad/xxx_project;
         expires 30d;
     }


     # this prevents hidden files (beginning with a period) from being served
      location ~ /\. { 
        access_log off; log_not_found off; deny all;
     }

}
複製程式碼

  4、將其連結到 /etc/nginx/conf.d/blog_project.conf (需要root帳號許可權或者sudo)

sudo ln -s /home/brad/xxx_project/nginx.conf /etc/nginx/conf.d/xxx_project.conf

  5、同時,必須把nginx.conf裡server_name後面的內容(localhost)加入到 settings.py裡的ALLOWED_HOSTS

sudo vi settings.py

  

  6、現在我們現在可以執行一下gunicorn:

sudo nohup /usr/local/python2710/bin/gunicorn xz1024_project.wsgi:application -c /home/brad/xz1024_project/gunico