要介紹標題中寫明的項目部署流程,以及解決部署過程中可能遇到的一些問題,在開始之前,墻裂推薦這篇文檔:
Setting up Django and your web server with uWSGI and nginx
看完這篇文檔,你可能已經(jīng)能夠解決90%(甚至100%)的問題了,剩下10%的問題(我所遇到的)將穿插在我部署的過程中進行解決。
(第一次部署的過程十分粗糙,遇到的很多問題都沒有妥善記錄下來,現(xiàn)在另起一個比較干凈的服務器,重新部署一下,好把之前的坑過一遍,另外對配置進行一些優(yōu)化)
如果按照本文流程,仍然配置不成功的話,請按照以下幾點排除問題:
阿里云: Ubuntu 14.04 64位
本機:windows10
python:3.6.6
IDE:Pycharm(代碼部署功能比較好用)
文件圖形化客戶端:WinSCP(查看服務器文件結(jié)構(gòu))
virtualbox虛擬機(這個其實無所謂,只是覺得開個虛擬機直連服務器比較舒服一點)
連接服務器的方法很多,不一一贅述了,我比較喜歡在Ubuntu系統(tǒng)下使用ssh直連
安裝ssh
sudo apt-get install ssh
連接目標服務器
ssh root@xx.xx.xxx.xxx
xxx部分為服務器的公網(wǎng)IP地址,root為用戶名(不推薦使用root賬戶進行后續(xù)部署操作)
給服務器系統(tǒng)添加自定義用戶,后面的操作都在該用戶下(本文中添加并使用賬戶名為breavo,賬戶名可任意取)
sudo adduser breavo
詳細過程可以自行google:)
(創(chuàng)建用戶后請務必添加sudo權(quán)限,避免后續(xù)出現(xiàn)權(quán)限問題)
由于各個項目之間存在python的版本問題,而服務器中自帶的python2(現(xiàn)在也自帶python3了,但是版本可能不符合需求)是遠遠無法滿足需求的,導致的結(jié)果就是你的服務器中安裝了多個python版本,每個項目依賴不同的版本運行。那么管理的必要性是不言而喻的了,另外每個項目需要一個獨立的運行環(huán)境(項目依賴需要分開管理,否則會變成噩夢),這一點通過創(chuàng)建虛擬環(huán)境來解決。
首先對系統(tǒng)環(huán)境進行一下更新,確保后面的操作不會因為缺少某個工具導致失敗
sudo apt-get update
安裝curl,git
sudo apt-get install curl git-core
安裝pyenv
curl -L https://raw.github.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash 1
這個命令會把pyenv安裝到當前用戶的~/.pyenv目錄下.(本文中為/home/breavo/.pyenv)
同樣,在用戶目錄下找到.bashrc文件,將下面的代碼添加至文件內(nèi)容末尾(本文中bashrc文件路徑在/home/breavo下,可自行對應到自己的路徑)
export PYENV_ROOT="${HOME}/.pyenv" if [ -d "${PYENV_ROOT}" ]; then export PATH="${PYENV_ROOT}/bin:${PATH}" eval "$(pyenv init -)" fi 1 2 3 4 5 6
修改后保存~
這段代碼的作用主要是指明pyenv的位置,以便以后可以直接在命令行里面運行pyenv命令。 保存在~/.bashrc 文件中是為了每次用戶登陸后自動生效。
所以如果你是第一次運行命令并且沒有注銷的話, 這一段是不會生效的, 我們還需要運行下面的命令令其生效
source ~/.bashrc 1
然后就可以直接在命令行里面敲pyenv了。
安裝pyenv參考文章:點擊這里
pyenv安裝完了,接下來安裝我們需要的python版本,首先查看一下目前python有哪些版本可以安裝
pyenv install --list 1
會打印一串很長的列表,網(wǎng)上滑一滑,可以看下如下圖所示。
我們就安裝圖中畫圈的這個版本
pyenv install 3.6.6 -v
(注:這里install的時候最好加一個 -v,否則安裝過程信息是不會打印在控制臺的,看上去就好像安裝進度卡住了一樣,首次安裝可能會引起疑惑)
安裝失敗 = =,原因是一些依賴還沒有裝上
sudo apt-get install make build-essential libssl-dev zlib1g-dev sudo apt-get install libbz2-dev libreadline-dev libsqlite3-dev wget sudo apt-get install llvm libncurses5-dev libncursesw5-dev 1 2 3
依賴安裝完畢之后,再次pyenv install 3.6.6 -v
順利完成~
注:到這一步為止有一個坑,很多人喜歡安裝最新的版本(python 3.7.0+),在依賴全部安裝完畢的情況下,依舊會出現(xiàn)下圖提示。
問題是Open SSL已經(jīng)安裝過了(就是這個libssl-dev),當時排查這個問題排查了很久,到最后,發(fā)現(xiàn)是因為沒有配置的情況下,本地的OpenSSL根本沒有支持到python3.7.0+
pyenv builds/installs openssl into a sub-directory of a new installation prefix, but Python is not configured to use it. Without ./configure --with-openssl=${somewhere} it will favor the system’s OpenSSL. In the case of Darwin, this always fails because the version of OpenSSL is no longer supported (Python >=3.7.0).
問題鏈接:Python 3.7.0 :: The Python ssl extension was not compiled. Missing the OpenSSL lib?
前面排查的時候根本沒往那方面想,結(jié)果悲劇了,浪費了很多時間 = =~
安裝完成,查看一下
pyenv versions 1
發(fā)現(xiàn)python3.6.6已經(jīng)安裝進系統(tǒng)了~
切換系統(tǒng)默認python環(huán)境
pyenv global 3.6.6 1
當前系統(tǒng)默認python版本已經(jīng)變成3.6.6了,可以輸入python命令check一下
卸載某個python版本
pyenv uninstall x.x.x 1
另外pyenv還有各種其他命令行操作,可自行google了解~
重新打開遠程SSH窗口可能會遇到pyenv command not found問題,重新source一下.bashrc文件
或者
查看解決方案:戳這里
開始配置之前,不妨閱讀一下pyenv-virtualenv ReadMe
通過pyenv安裝完成后,連帶著virtualenv也安裝完成了,我們可以通過pyenv命令完成虛擬環(huán)境的配置
在 pyenv-virtualenv中,由于需要從根本上處理一些已知的問題(關于$PATH和shell提示符),activate/deactivate提示符將會在未來的版本中移除(目前依然可以使用,但是會彈出warning,我是覺得不爽啦~)
問題鏈接:Question regarding prompt changing
根據(jù)作者的建議,我們可以如下方式完成虛擬環(huán)境的配置和激活
運行
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
重啟一下shell
$ exec "$SHELL" 1
運行
pyenv virtualenv 3.6.6 eshop
其中3.6.6是需要指定的python版本, eshop是虛擬環(huán)境的名稱(隨便起的~)
此時,虛擬環(huán)境已經(jīng)創(chuàng)建完成并自動激活,可以通過pyenv versions查看,如下圖所示。
通過 pyenv shell xxx(xxx為python版本號或者虛擬環(huán)境名稱)切換環(huán)境,效果如下圖
運行
pyenv virtualenv 3.6.6 eshop
激活/反激活虛擬環(huán)境
pyenv activate eshop
pyenv deactivate
卸載虛擬環(huán)境
pyenv uninstall
至此,虛擬環(huán)境的搭建就算完成了~
sudo apt-get install nginx 1
運行
sudo /etc/init.d/nginx start # start nginx 1
如果出現(xiàn)sudo: unable to resolve host問題,參考這里
如果出現(xiàn)端口占用情況,通過修改配置文件換用其他端口(如8000)
如果出現(xiàn)端口沒被占用但無法訪問,請回到配置安全組出查看端口策略是否配置完備
打開瀏覽器訪問 xx.xx.xxx.xxx:80,其中xxxx是你的公網(wǎng)IP,80是Nginx默認監(jiān)聽的端口號
出現(xiàn)
這個表示Nginx已經(jīng)成功安裝并運行起來了
本文以postgresql為例進行安裝配置
參考文章:Ubuntu 安裝和配置postgresql
安裝postgresql
sudo apt-get install postgresql
安裝完成后服務器系統(tǒng)會自動創(chuàng)建一個名為postgres的賬戶(數(shù)據(jù)庫超級用戶),密碼為空
切換到postgres
sudo su postgres 1
登陸postgresql
psql postgres 1
在postgresql界面繼續(xù)輸入如下命令(注意末尾加分號)
ALTER USER postgres with PASSWORD 'postgres'; 1
修改成功后輸入’\q’ 退出postgresql
退出postgres賬戶可以直接輸入exit后回車或者ctrl + d
上述流程正確的情況下如下圖所示。
編輯pgsql配置文件,運行
vim /etc/postgresql/9.1/main/postgresql.conf
或者利用WinSCP界面進行編輯(本篇文章中所有配置文件編輯均使用WinSCP + sublime,個人喜好)
修改配置文件如下:
監(jiān)聽任何地址訪問,修改連接權(quán)限
# listen_addresses = ‘localhost’ 改為 listen_addresses = ‘*’ 1 2 3
啟用密碼驗證
# password_encryption = on 改為 password_encryption = on 1 2 3
編輯 /etc/postgresql/9.1/main/pg_hba.conf,在文件末尾添加
# to allow your client visiting postgresql server host all all 0.0.0.0 0.0.0.0 md5 1 2
保存上述修改
最后,重啟數(shù)據(jù)庫
sudo service postgresql restart
至此,數(shù)據(jù)庫配置完成了
可以通過登陸測試一下,直接登陸或者使用PgAdmin都可以,不再贅述
前面配置了這么多,Django項目還沒有上傳到服務器呢,確保本地有一個可運行Django項目(廢話:P)
上傳方式很多
新建的用戶可能會遇到上傳的權(quán)限問題,解決方法戳Permissions on /var/www/html for uploading web site files via SFTP
查看用戶xxx所在組以及組內(nèi)成員
groups xxx
更改文件上傳目錄的用戶和用戶組
sudo chown breavo:breavo /file/upload/path
為用戶組添加寫權(quán)限
sudo chmod -R 775 /file/upload/path
設置django settings.py
ALLOWED_HOSTS = ['*'] 1
安裝項目依賴(依賴寫入requirements.txt中,每個依賴注意添加版本號)
cd 到你存放requirement.txt的目錄, 運行
pip install -r requirements.txt
等待依賴安裝完成,cd到項目目錄下,運行
python manage.py runserver 0.0.0.0:8000
打開瀏覽器輸入服務器地址,查看
xx.xx.xxx.xxx:8000 (xxx為服務器公網(wǎng)IP地址)
項目正常運行~(如果settings.py文件中的DEBUG設置為False,會觀察到靜態(tài)資源無法加載)
在項目目錄下添加一個config文件夾,后面的配置文件都統(tǒng)一放到該文件夾下(配置文件存放路徑不統(tǒng)一會導致輸入提示符時運行不成功)
config文件下新建mysite_nginx.conf文件,內(nèi)容如下(將路徑替換成你自己的項目路徑或者對應文件):
# mysite_nginx.conf # the upstream component nginx needs to connect to upstream django { # unix:///home/breavo/PyWorkSpace/mysite_code_shuffle/config/eshop.sock # server unix:///path/to/your/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 xx.xx.xxx.xxx; # 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 { # /home/breavo/PyWorkSpace/mysite_code_shuffle/meida; alias /path/to/your/mysite/media; # your Django project's media files - amend as required } location /static { # /home/breavo/PyWorkSpace/mysite_code_shuffle/static alias /path/to/your/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/breavo/PyWorkSpace/mysite_code_shuffle/config/uwsgi_params; # the uwsgi_params file you installed } } 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
在/etc/nginx/sites-enabled中創(chuàng)建一個鏈接,這樣Nginx能夠發(fā)現(xiàn)并啟用我們的配置,運行
sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/ 1
在運行Nginx之前,需要將django項目中的所有靜態(tài)文件放入static文件夾,在mysite/settings.py中添加
STATIC_ROOT = os.path.join(BASE_DIR, "static/") 1
然后運行
python manage.py collectstatic 1
啟動(重啟)Nginx
sudo /etc/init.d/nginx start 1
往服務器項目的media文件夾里丟一個圖片(這里以test.png為例)
訪問
xx.xx.xxx.xxx:8000/media/test.png 1
圖片正確顯示~
至此,靜態(tài)文件部署算是完成了
接下來我們需要使用Uwsgi來處理項目中的動態(tài)請求
虛擬環(huán)境下運行
pip install uwsgi
在之前創(chuàng)建的config文件夾下新建一個hello.py用來做測試,寫入以下內(nèi)容
# test.py def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"] # python3 #return ["Hello World"] # python2 1 2 3 4 5
接下來運行
uwsgi --http :8001 --wsgi-file test.py
打開瀏覽器查看
出現(xiàn)上圖,說明Uwsgi已經(jīng)初步運行成功
上述步驟沒有出問題的話,我們就可以使用Uwsgi啟動項目了,項目根目錄下運行
uwsgi --http :8001 --module mysite.wsgi
其中mysite.wsgi(mysite替換成自己的項目名稱)會自動搜索項目中的wsgi.py文件
如果正常運行~恭喜
如果瀏覽器出現(xiàn)Internal Server Error
至此Uwsgi基本配置算是完成了~~
現(xiàn)在我們使用socket通信來通過Nginx訪問hello.py,(確保Nginx已經(jīng)啟動)config文件夾下運行
uwsgi --socket :8001 --wsgi-file hello.py
好了,就這么現(xiàn)在訪問瀏覽器
xx.xx.xxx.xxx:8000
成功訪問~
其中8000是Nginx監(jiān)聽的端口(mysite_nginx.conf文件中配置),–socket :8001是用于socket通信的端口(兩個端口都可以替換~)
編輯mysite_nginx.conf文件,將原來內(nèi)容修改成如下
server unix:///path/to/your/mysite/mysite.sock; # for a file socket # server 127.0.0.1:8001; # for a web port socket (we'll use this first) 1 2
保存后,config文件夾下運行
uwsgi --socket mysite.sock --wsgi-file hello.py
依舊打開瀏覽器訪問xx.xx.xxx.xxx:8000,屏幕出現(xiàn)hello world,說明一切正常
如果出現(xiàn)502 Bad Getway
查看你的Nginx error log(/var/log/nginx/error.log)
如果出現(xiàn)
connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission denied) 1 2
則說明是權(quán)限問題,運行
uwsgi --socket mysite.sock --wsgi-file hello.py --chmod-socket=666
或者
uwsgi --socket mysite.sock --wsgi-file hello.py --chmod-socket=664 (推薦,但是我用了沒成功)
log如果打印了其他問題,請仔細檢查配置~
uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664 1
注意這里有個小坑,mysite_nginx.conf中我配置的mysite.sock在config文件夾下,而這條命令需要在項目根目錄下運行,這里可以:
config文件夾下新建mysite_uwsgi.ini,輸入以下內(nèi)容
# mysite_uwsgi.ini file [uwsgi] # Django-related settings # the base directory (full path) chdir = /path/to/your/project # Django's wsgi file module = project.wsgi # the virtualenv (full path) home = /path/to/virtualenv # process-related settings # master master = true # maximum number of worker processes processes = 10 # the socket (use the full path to be safe socket = /path/to/your/project/mysite.sock # ... with appropriate permissions - may be needed chmod-socket = 666 # clear environment on exit vacuum = true stats = %(chdir)/config/uwsgi.status pidfile = %(chdir)/config/uwsgi.pid 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
用自己的路徑替換其中對應的配置~
保存后,運行(確保在mysite_uwsgi.ini目錄下)
uwsgi --ini mysite_uwsgi.ini
打開瀏覽器訪問xx.xx.xxx.xxx:8000
項目這時候應該完美運行了~~
大功告成~:)
重新一步一步的部署了一遍之后,強迫癥終于舒服了~~文章中還是有很多地方不(沒)夠(有)完(寫)善(全),后面有時間繼續(xù)補一補~:)
一、申領范圍:失業(yè)人員
二、申領條件
(一)依法參加了失業(yè)保險,所在用人單位和本人按規(guī)定履行繳費義務滿1年;
(二)非因本人意愿中斷就業(yè)。
三、網(wǎng)上申領
(一)登錄“吉林省社會保險網(wǎng)上經(jīng)辦系統(tǒng)”申領
1.登錄系統(tǒng)網(wǎng)址:http://wssb.jlsi.jl.gov.cn:8001,選擇“個人用戶”,未注冊申領人點擊“注冊”按鍵,進行注冊;已注冊申領人可直接登錄。
2.登錄成功后,點擊進入“失業(yè)金申領”模塊,填寫帶*的必填信息,點擊“同步社會保障卡信息”,確認無誤后保存。
3.保存后進入“失業(yè)金申領列表”頁面,點擊“附件”,進行附件上傳。
4.上傳附件后點擊“上報”,等待社會保險局審核結(jié)果。
5.上報完成后,請通過點擊“同步審批結(jié)果”,關注審批結(jié)果。
(二)通過“吉林掌上社保”APP申領
失業(yè)人員可掃描二維碼下載“吉林掌上社保”APP,通過“吉林掌上社保”APP進行失業(yè)保險金申領。
(三)長春市失業(yè)人員申領
可登陸“長春市社會保險公共服務平臺”
(https://www.ccshbx.org.cn/)、“長春社會保險”微信公眾號和“長春社會保險”微信小程序辦理。
四、現(xiàn)場申領
失業(yè)人員需要攜帶有效身份證件(激活金融社會保障卡,或本人身份證、銀行卡、存折)到失業(yè)保險最后參保地社會保險局申領。
來源 敦化社保