ubuntu18 apache2 wsgi django pyenv virtualenv 搭建 https websocket 網站
ubuntu18 apache2 wsgi django pyenv virtualenv 搭建 https websocket 網站
部署django專案步驟比較繁瑣。
- https雙向認證 :伺服器、客戶端雙向認證,通過安裝自簽名證書互相驗證身份;
- websocket :使用channels庫實現,再套一層ssl增加安全性;
- apache2+wsgi+虛擬環境 :wsgi程序守護,由於專案中改動了celery原始碼,需要獨立虛擬環境。
文章目錄
一、ubuntu環境
win10系統,使用vmware安裝了ubuntu18伺服器版,為方便專案部署,共享了d盤。
注意:掛載不能使用open-vm-tools,不然只有超級使用者能訪問掛載目錄
VMware->虛擬機器->安裝VMware Tools
解壓VMwareTools-xxx.tar.gz執行vmware-install.pl
sudo mount -t iso9660 /dev/cdrom /mnt
./vmware-install.pl
本地源
如果部署環境沒有網路,需要建立本地源
在開發環境執行下列命令,製作離線包
sudo mkdir /offlinePackage
sudo cp -r /var/cache/apt/archives /offlinePackage
sudo chmod 777 -R /offlinePackage/
sudo apt-get install dpkg-dev
sudo dpkg-scanpackages /offlinePackage/archives/ /dev/null |gzip >/offlinePackage/Packages.gz
sudo cp /offlinePackage/Packages.gz /offlinePackage/archives/Packages.gz
tar cvzf offlinePackage.tar.gz /offlinePackage
在離線部署環境,設定本地源生效
sudo tar -xvf offlinePackage.tar.gz -C /
sudo vim /etc/apt/sources.list
# 在sources.list中新增下行,並註釋掉其他內容
deb file:/// offlinePackage/
# 執行update命令使本地源生效
sudo apt-get update ---allow-insecure-repositories true
--allow-unauthenticated
# 可能需要這個命令
apt-get update -f
二、pyenv pyenv-virtualenv python環境
使用虛擬環境可以多個不同環境的專案共存
1. 安裝
官方文件:pyenv,pyenv-virtualenv
安裝需要使用以下命令
# 從github克隆專案
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtual
# 編輯.bash_profile
sudo vim ~/.bash_profile
# 在~/.bash_profile中新增如下程式碼
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
eval "$(pyenv init -)"
fi
eval "$(pyenv virtualenv-init -)"
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# :wq!儲存
exec "$SHELL"
# 重啟shell
2. 使用
使用前可能需要安裝這些庫,python編譯安裝的依賴
sudo apt-get install -y zlib1g zlib1g-dbg zlib1g-dev gcc
使用pyenv install可以安裝python不同版本,例如使用3.6.6
注意:–enable-shared 選項是使用共享庫,否則不能安裝mod_wsgi
env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.6
#可能需要安裝dev包
pyenv install 3.6-dev
再使用virtualenv建立虛擬環境
#建立
pyenv virtualenv 3.6.6 project_venv
#啟用進入虛擬環境
pyenv activate project_venv
安裝庫
#開發環境執行
pip freeze >requirements.txt
pip download -r requirements.txt -d pippackage#如果部署環境無網路
#虛擬環境執行
pip install -r requirements.txt
pip install --no-index --find-links=pippackage -r requirements.txt#如果部署環境無網路
三、apache2安裝和wsgi配置
安裝apache2
sudo apt-get install apache2 apache2-dev -y
編輯/etc/apache2/ports.conf
增加埠監聽
# sudo vim /etc/apache2/ports.conf
Listen 8002 #websocket ssl代理埠
Listen 8889 #網站埠
Listen 9001 #網站 ssl代理埠
在虛擬環境中安裝mod_wsgi
pip install mod_wsgi
# 安裝完mod_wsgi需執行命令(可能需在python的bin資料夾下執行)
mod_wsgi-express module-config
將輸出第一行 LoadModule wsgi_module “xxxxxxxxx” 複製
加到/etc/apache2/mods-available/wsgi.load中,再執行a2enmod
sudo a2enmod wsgi
四、django專案部署
1. 準備
靜態檔案
在專案目錄下執行
python manage.py collectstatic
證書製作
- 製作ca根證書和server證書
OpenSSL生成CA證書及終端使用者證書 - 製作客戶端證書
#!/bin/bash
#使用類C風格for迴圈輸出0~52
for ((index = 0; index <= 52; index++))
do
echo "$index"
openssl genrsa -out $index"_ca.key" 4096
openssl req -new -sha256 -out $index"_ca.csr" -key $index"_ca.key" -config ca.conf -batch
openssl x509 -req -days 3650 -in $index"_ca.csr" -signkey $index"_ca.key" -out $index"_ca.crt"
#1.生成私鑰
openssl genrsa -out $index"_client_private.key" 2048
#3. 生成使用者證書請求檔案
openssl req -new -days 3650 -key $index"_client_private.key" -out $index"_client.csr" -config client.conf -batch
#4.ca對使用者證書籤名
openssl x509 \
-req \
-days 3650 \
-CA $index"_ca.crt" \
-CAkey $index"_ca.key" \
-CAcreateserial \
-in $index"_client.csr" \
-out $index"_client.crt" \
-extensions req_ext \
-extfile client.conf
#5. 生成p12
openssl pkcs12 -export -clcerts -in $index"_client.crt" -inkey $index"_client_private.key" -out $index"_client.p12" -password pass:csm_20180905
done
2. https部署
專案可以分成兩個網站,網站本體和https代理,這樣方便控制訪問者身份。
ProxyRequests off 選項不要開啟,否則任何人可以使用你的伺服器做正向代理
檔案中的path/to/project、path/to/certificat和username等路徑,按需替換
a. 本體配置檔案
# sudo vim /etc/apache2/sites-available/project.conf
<VirtualHost *:8889>
Alias /media/ /mnt/hgfs/path/to/project/media/#替換
Alias /static/ /mnt/hgfs/path/to/project/static/#替換
<Directory /mnt/hgfs/path/to/project/media/>#替換
Require all granted
</Directory>
<Directory /mnt/hgfs/path/to/project/static/>#替換
Require all granted
</Directory>
WSGIDaemonProcess my_project python-home=/home/username/.pyenv/versions/project_venv python-path=/mnt/hgfs/path/to/project#替換
WSGIProcessGroup my_project
WSGIScriptAlias / /mnt/hgfs/path/to/project/project/wsgi.py #替換
<Directory /mnt/hgfs/path/to/project>#替換
Require all granted
</Directory>
</VirtualHost>
b. 代理配置檔案
# sudo vim /etc/apache2/sites-available/project_proxy.conf
<VirtualHost *:9001>
# ServerName 127.0.0.1
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R]
SSLEngine on
SSLProtocol +TLSv1.1 +TLSv1.2
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
SSLCertificateFile path/to/certificat/server.crt#替換
SSLCertificateKeyFile path/to/certificat/server.key#替換
SSLCACertificateFile path/to/certificat/client1_ca.crt#替換
SSLVerifyClient require
ProxyPreserveHost on
ProxyPass / http://127.0.0.1:8889/
ProxyPassReverse / http://127.0.0.1:8889/
</VirtualHost>
3. websocket部署
websocket 需要通過python manage.py runserver 0.0.0.0:8003 執行,因為apache好像不支援asgi
配置檔案
# sudo vim /etc/apache2/sites-available/wss_proxy.conf
<VirtualHost *:8002>
ServerName 127.0.0.1
RewriteEngine On
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule ^(.*) ws://%{SERVER_NAME}$1 [P,L]
SSLEngine on
SSLProtocol TLSv1.2
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
SSLHonorCipherOrder on
SSLCertificateFile /path/to/certificat/server.crt
SSLCertificateKeyFile /path/to/certificat/server.key
ProxyPass / ws://127.0.0.1:8003/
</VirtualHost>