1. 程式人生 > >ubuntu18 apache2 wsgi django pyenv virtualenv 搭建 https websocket 網站

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. 安裝

官方文件:pyenvpyenv-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

證書製作

  1. 製作ca根證書和server證書
    OpenSSL生成CA證書及終端使用者證書
  2. 製作客戶端證書
#!/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>