Linux 下部署Django項目

Linux 下部署Django項目

說明:本文所使用的環境爲CentOS 6+Python2.7+Django1.11html

安裝Django、Nginx和uWSGI

1.肯定已經安裝了2.7版本的Python; 
2.安裝python-devel 
yum install python-devel 
3.安裝uwsgi 
pip install uwsgipython

測試uwsgi是否能正常工做

1.新建一個index.py;nginx

# index.py def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return "Hello World"
  • 1
  • 2
  • 3
  • 4

2.uwsgi –http :8000 –wsgi-file index.py 
瀏覽器訪問8000端口看是否有hello world輸出 
注意:確保8000端口能被外網訪問web

測試Django可否正常工做

$ cd /var/www/ 
$ django-admin startproject mysite 
$ cd mysite 
$ python manage.py runserver 0.0.0.0:8000 
瀏覽器訪問8000端口看是否有hello world輸出shell

測試uwsgi是否能和django集成

uwsgi --http :8000 --chdir=/var/www/mysite --module mysite.wsgi 
or 
uwsgi --http :8008 --chdir /var/www/mysite --wsgi-file weixin/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9192django

在瀏覽器中訪問8000端口,看可否正常訪問django網站。瀏覽器

參數說明:bash

# http : 協議類型和端口號 # processes : 開啓的進程數量 # workers : 開啓的進程數量,等同於processes(官網的說法是spawn the specified number ofworkers / processes) # chdir : 指定運行目錄(chdir to specified directory before apps loading) # wsgi-file : 載入wsgi-file(load .wsgi file) # stats : 在指定的地址上,開啓狀態服務(enable the stats server on the specified address) # threads : 運行線程。因爲GIL的存在,我以爲這個真心沒啥用。(run each worker in prethreaded mode with the specified number of threads) # master : 容許主進程存在(enable master process) # daemonize : 使進程在後臺運行,並將日誌打到指定的日誌文件或者udp服務器(daemonize uWSGI)。實際上最常 用的,仍是把運行記錄輸出到一個本地文件上。 # daemonize : 使進程在後臺運行,並將日誌打到指定的日誌文件或者udp服務器(daemonize uWSGI)。實際上最常 用的,仍是把運行記錄輸出到一個本地文件上。 # vacuum : 當服務器退出的時候自動清理環境,刪除unix socket文件和pid文件(try to remove all of the generated file/sockets)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

配置Nginx,使Nginx能爲Django提供服務

在/etc/nginx/conf.d/下建立一個針對mysite項目的配置文件,詳細以下:服務器

# /etc/nginx/conf.d/mysite_nginx.conf # the upstream component nginx needs to connect to upstream django { server 127.0.0.1:8000; # for a web port socket } # configuration of the server server { # the port your site will be served on listen 80; # the domain name it will serve for server_name .example.com; # substitute your machine's IP address or FQDN charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste # Django 的static和 media目錄 # 若是沒有static或media目錄,你須要先建立 location /media { alias /var/www/mysite/media; } location /static { alias /var/www/mysite/static; } # 將全部非靜態文件的請求轉給django server處理,這裏的django server用的是uwsgi。 location / { uwsgi_pass django; include /var/www/mysite/uwsgi_params; } } #你能夠從/etc/nginx/uwsgi_params複製一個拷貝到/var/www/mysite/uwsgi_params。 $ cp /etc/nginx/uwsgi_params /var/www/mysite/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

須要補充說明的是,在/etc/nginx/nginx.conf文件中,在最後一行的配置是include /etc/nginx/conf.d/*.conf,也就是說,/etc/nginx/conf.d/mysite_nginx.conf是會被包含在/etc/nginx/nginx.conf中的。markdown

重啓nginx服務器,驗證訪問結果

/etc/init.d/nginx restart 
經過瀏覽器訪問80端口,你發現了什麼?502 Bad Gateway?是否是?想想,這是爲何呢?緣由是你訪問80端口時,請求的資源不是static,也不是media,這個時候Nginx就把請求轉給upstream django,upstream的網關配置的127.0.0.1:8000,而127.0.0.1:8000是要靠uwsgi啓動的,因此報了一個502 Bad Gateway。你,明白了嗎?

注:CentOS 7啓動服務的命令是systemctl restart nginx.service

啓動uwsgi,再次驗證結果

執行下面一個命令,啓動uwsgi。 
uwsgi --socket :8000 --chdir=/var/www/mysite --module mysite.wsgi 
重啓Nginx服務/etc/init.d/nginx restart,再次經過瀏覽器訪問80端口試試看。是否是成功了?

注:CentOS 7啓動服務的命令是systemctl restart nginx.service

如何使uwsgi以配置文件運行?Configuring uWSGI to run with a .ini file

建立一個mysite_uwsgi.ini文件,內容以下:

[uwsgi]
socket=:8000 chdir = /var/www/mysite #wsgi-file = mysite/wsgi.py module=mysite.wsgi:application processes = 10 threads = 2 #django<1.4,必須指定env和module env = DJANGO_SETTINGS_MODULE=mysite.settings # clear environment on exit vacuum = true safe-pidfile = /tmp/project-master.pid # create a pidfile harakiri = 20 # respawn processes taking more than 20 seconds limit-as = 128 # limit the project to 128 MB max-requests = 5000 # respawn processes after serving 5000 requests daemonize = /var/log/uwsgi/mysite.log # background the process & log 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

執行命令uwsgi --ini mysite_uwsgi.ini便可運行

如何以Emperor模式運行?

什麼是Emperor模式?,官網說的很清楚,以下:

uWSGI can run in ‘emperor’ mode. In this mode it keeps an eye on a directory of uWSGI config files, and will spawn instances (‘vassals’) for each one it finds.

Whenever a config file is amended, the emperor will automatically restart the vassal.

按下面的步驟操做,便可以Emperor模式運行uwsgi: 
1. create a directory for the vassals 
sudo mkdir /etc/uwsgi 
sudo mkdir /etc/uwsgi/vassals 
2. symlink from the default config directory to your config file 
sudo ln -s /path/to/your/mysite/mysite_uwsgi.ini /etc/uwsgi/vassals/ 
3. run the emperor 
uwsgi --emperor /etc/uwsgi/vassals --uid nginx --gid nginx

如何建立uwsgi服務?

在Linux中,一個服務其實就是一個shell腳本。在CenOS6中,服務腳本通常都在/etc/init.d/目錄下。 
首先咱們在/etc/initd/目錄下建立一個uwsgi文件,文件內容以下:

#!/bin/sh # ### BEGIN INIT INFO # Provides: uwsgi # Required-Start: $syslog $remote_fs # Should-Start: $time ypbind smtp # Required-Stop: $syslog $remote_fs # Should-Stop: ypbind smtp # Default-Start: 3 5 # Default-Stop: 0 1 2 6 ### END INIT INFO # Source function library. . /etc/rc.d/init.d/functions # Check for missing binaries (stale symlinks should not happen) UWSGI_BIN="/usr/local/bin/uwsgi" UWSGI_EMPEROR_MODE=true UWSGI_VASSALS="/etc/uwsgi/vassals/" UWSGI_OPTIONS="--uid nginx --gid nginx --logto /var/log/uwsgi/uwsgi.log" lockfile=/var/lock/subsys/uwsgi UWSGI_OPTIONS="$UWSGI_OPTIONS --autoload" if [ "$UWSGI_EMPEROR_MODE" = "true" ] ; then UWSGI_OPTIONS="$UWSGI_OPTIONS --emperor $UWSGI_VASSALS" fi case "$1" in start) echo "Starting uWSGI ... " daemon $UWSGI_BIN $UWSGI_OPTIONS & ;; stop) echo "Shutting down uWSGI ... " killproc $UWSGI_BIN ;; restart) $0 stop $0 start ;; status) echo -n "Checking for service uWSGI " status $UWSGI_BIN ;; *) echo "Usage: $0 {start|stop|status|restart}" exit 1 ;; esac exit 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

而後,咱們可使用此腳原本管理uwsgi,以下:

/etc/init.d/uwsgi start 
/etc/init.d/uwsgi stop 
/etc/init.d/uwsgi restart 
/etc/init.d/uwsgi status

須要注意的是,日誌文件夾的所屬權應該歸配置文件中指定的用戶nginx 
$ chown nginx.nginx /var/log/uwsgi -R

如何設置開機起動uwsgi?

把啓動uwsgi的命令添加到「/etc/rc.local」文件中便可。

多站點部署問題

#Simple HTTP server server { listen 80; root /usr/share/nginx/www; server_name host1.example.com; } #Django server server { listen 80; server_name host2.example.com; #...upstream config... }
相關文章
相關標籤/搜索