前言:
前段時間,利用Django為單位制作了一個小型的內部考勤系統,本想放到單位內部的服務器上,考慮到運行的穩定、安全防護等問題,最終決定把網站部署到百度雲服務器上,事先也在網上查找了一些資料,但過程還是一波三折,問題為斷,最終用了半天的時間,將網站部署成功,目前依然穩定運行。為了后人少踩坑,也為了自己下一次有跡可循,特意寫一篇隨筆,記錄整個過程。
布署環境:
1、百度雲服務器:(最便宜的那種,一核,1G內存,1M帶寬),服務器上安裝的是centos 7.1
2、本機:Python3.7 Django2.0.6 PUTTY
布署過程:
一、在上線之前,在本地需做的幾項工作:
1、修改setting.py文件。
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False ALLOWED_HOSTS = ['*']
主要有三個地方:一是修改DEBUG為False(關閉調試模式,這個必須做,為安全考慮),關閉調試模式后,ALLOWED_HOSTS項必須修改,可以輸入自己網站真實的域名,也可以用*代替。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, '(--.----'), } }
二是修改數據庫設置,在這里修改為自己的數據庫配置,如MySql等。因為我的網站是一個小型系統,所以直接使用了自帶的sqlite3數據庫,應付一個小型應用,也足夠用了,為安全計,將文件名改一下,並在這里同步。
STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static')
三是修改static_url static_root兩項配置,其中static_url項沒有什么價值,采用默認值就可以。但是static_root項很重要,將來網站的所有靜態文件都會收集到這個文件夾中。
2、收集靜態文件
運行命令:python manage.py collectstatic,網站中的靜態文件都會收集到static_root指定的文件夾中,記住這個文件夾的位置,后邊配置nginx時要用。
3、將網站文件夾上傳到百度雲服務器。
我是使用PUTTY自帶的pscp工具做的,方法很簡單,直接寫命令
1、從遠程服務器下載 d:\putty>pscp -r root@IP:/root/dir d:\data r參數代表要下載的是目錄 如: pscp -r toot@192.168.1.102:/usr/local/temp d:\down 以上命令,將遠程服務器中的/usr/local/temp文件夾下載到當地的down中。 如:pscp root@192.168.1.102:/usr/local/temp.txt d:\down 以上命令,將遠程服務器中的/usr/local/temp文件夾下載到當地的down中。 2、向遠程LINUX服務器上傳 d:\putty>pscp -r dir root@IP:/usr/local/temp #將指定目錄上傳。 d:\putty>pscp file1.txt root@IP:/usr/local/temp #將指定文件上傳
二、遠程服務器准備工作。
1、安裝python3/django,這方面網上文章很多,這里就不多說。
2、安裝uwsgi,這是一個容器管理文件,用它來運行Django網站。安裝方法很簡單
pip install uwsgi
或者
pip3 install uwsgi
3、安裝nginx.(主要用於提供靜態文件的訪問服務)
(1)到 官網http://nginx.org/en/download.html,選擇適合Linux的版本,這里選擇最新的版本,下載到本地后上傳到服務器或者centos下直接wget命令下載。
我是用了wget http://nginx.org/download/nginx-1.17.0.tar.gz命令,將安裝文件下載了自己的目錄中。
(2)安裝nginx。
安裝前先檢查一下:使用yum list ****命令,檢查以下依賴庫有無安裝,如果沒有安裝,則執行下列命令進行安裝 。
# yum install gcc-c++
# yum install pcre
# yum install pcre-devel
# yum install zlib
# yum install zlib-devel
# yum install openssl
# yum install openssl-devel
第一步:解壓。tar -zxvf nginx-1.17.0.tar.gz。第二步:進入解壓后的文件夾, 執行 ./configure,該操作會檢測當前系統環境,以確保能成功安裝nginx,執行該
操作后如果出現錯誤提示,一般就是缺少依賴庫,缺什么就安裝什么。第三步: 執行make和make install編譯nginx。 成功后,nginx就安裝到當前目錄的nginx目錄
下了。
(3)配置nginx
在 /lib/systemd/system/ 下創建nginx的后台服務配置文件。"nginx.service",文件內容如下:其中的/usr/local/nginx是我機器上安裝nginx的文件夾。
[Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx reload ExecStop=/usr/local/nginx/sbin/nginx quit PrivateTmp=true [Install] WantedBy=multi-user.target
保存文件后,執行systemctl enable nginx.service命令,讓nginx在開機后能自動以服務的形式在后台啟動。
這里有幾個常用的命令:
systemctl status nginx 查看nginx啟動狀態。
systemctl start nginx / systemctl stop nginx / systemctl restart nginx 分別為啟動、停止、重啟nginx的命令。
檢查一下配置的結果:瀏覽網址http://服務器IP地址,出現歡迎界面,說明nginx的配置初步成功了。
到這一步,服務器的准備工作就基本完成了,從下一步開始,就要開始正式的部署工作了。
三、在遠程服務器正式部署網站
(一)利用uwsgi來提供Django網站的訪問功能。
1、進入用戶目錄 :cd /usr/local(這個位置沒要求),新建nginx目錄,其中有三個文件:分別是nginx.ini nginx.pid nginx.status。編輯nginx.ini文件,
[uwsgi] socket=127.0.0.1:8000 chdir=/var/www/myproject module=attproject.wsgi master=true processes=3 threads=2 stats=%(chdir)/uwsgi.status pidfile=%(chdir)/uwsgi.pid
其中的chdir是我們網站的根目錄所在位置。module指的是wsgi.py文件所在的位置,格式為:所在目錄.wsgi processes是進程數(實際進程數是這個數+1)
threads是線程數,這兩個數根據機器配置來設置,如果機器配置高,這個數就可以多一些。
2、執行uwsgi-d --ini uwsgi.ini命令,啟動Django網站。 其中 -d指的是從后台啟動。 --ini指的是讀取指定配置文件的方式啟動。uwsgi.ini是剛才編輯好的
配置文件。提示[uWSGI] getting INI configuration from uwsgi.ini。說明已經啟動成功。
關閉uwsgi的命令:uwsgi --stop uwsgi.pid。
(二)利用 nginx來提供靜態文件的訪問。
通過上面的步驟,Django網站已經能夠成功運行了,但是會出現找不到靜態文件。(沒有樣式,圖片等),這個就需要用到nginx了。
1、編輯nginx的配置文件。
nginx.conf是nginx的配置文件,在安裝文件夾的conf目錄下。
vim nginx.conf
編輯其中的
server { listen 80; server_name http://www.********; root /var/www/html; index index.html index.htm index.nginx-debian.html; #charset koi8-r; #access_log logs/host.access.log main; #這里是關鍵,可以理解為是一個映射,當用戶訪問 http://ip/static時,讓nginx找哪個文件夾。以下的設置,就是讓nginx讀網站根目錄下的static文件,靜態文件都在那里面。 location /static { alias /var/www/attproject/static; }
#這里是nginx與uwsgi互相聯系的部分。其中include uwsgi_params,這行必須有,這個文件在nginx的conf文件夾下。第二行,要與前邊那個uwsgi.ini文件中指定的一樣。
location /{ include uwsgi_params; uwsgi_pass 127.0.0.1:8000; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
編輯完成后,先運行nginx -t命令,判斷一下設置是否有問題,如果提示:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful,則表示沒有問題,如果提示錯誤,則認真核對一下nginx.conf文件,特別是注意
里面的{ }是成對的。
成功后,執行systemctl restart nginx.service 或 systemctl start nginx.service命令,啟動nginx,這時網站應該能正常訪問了。(在此之前,uwsgi已經成功運行
了)
四、在部署過程中遇到的幾個坑:
1、安裝nginx后,啟動不成功,發現是端口占用,分析原因,服務器上原本運行了apache,停止並刪除了httpd服務后,解決了問題。
2、安裝nginx和uwsgi以后,運行命令,提示找不到。分析后,發現需要將執行路徑放到系統的PATH中,編輯 /etc/profile文件,將路徑加進去,結果沒有效果,查資
料后發現,在添加PATH時,需要將 :$PATH放到添加的路徑的后面,意思是包含以前的路徑,如果放到前面,則原本定義的路徑就找不到了。具體如下:
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
export PATH="/usr/local/nginx/sbin:$PATH"
export PATH="/usr/local/python3/bin:$PATH"
3、在使用uwsgi的停止命令時,到網上查到,同目錄下會自動創建一個***.pid文件 ,停止uwsgi時,直接用uwsgi --stop ***.pid就可以,結果根本不好使,只能自己
創建一個,並添加到uwsgi.ini文件中,才好使。