部署nginx + uwsgi + django + mysql 項目

nginx

  • 是個web服務器、經常使用做靜態文件服務器、經常使用做負載均衡。
  • nginx是個web服務器,經常使用做靜態文件服務器,反向代理服務器,郵件代理服務器,負載均衡服務器。

1. 安裝、配置文件

1. 安裝

# 安裝淘寶nginx,編代碼編譯安裝,先解決模塊依賴
yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
# 獲取淘寶nginx的源代碼
wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz
# 解壓縮源代碼包
tar -zxvf tengine-2.3.2.tar.gz
# 進入源代碼目錄開始編譯三部曲
1. 指定安裝路徑
	./configure --prefix=/opt/tngx

2.編譯且安裝
	make && make install 

3.安裝完成以後,進入nginx的目錄,
	[root@localhost tngx]#pwd
	/opt/tngx
	[root@localhost tngx]#ls
	conf  html  logs  sbin
	
	# conf 存放配置文件 , 指定了這個軟件各類功能的一個文件而已  
	# html 存放前端頁面
	# logs nginx的運行日誌
	# sbin  nginx的可執行命令目錄
	
4.進入sbin目錄,啓動nginx
    ./nginx  
    ./nginx -s stop 中止nginx
    ./nginx -t  檢查nginx.conf的語法是否正確
    ./nginx -s reload  不重啓nginx,從新加載nginx配置

2. 配置文件學習

  • 這裏的全部配置是nginx的核心功能
  • 找到nginx.conf,學習語法

1. nginx核心功能

http {

    # nginx訪問日誌功能
    log_format
    access_log
    # gzip 壓縮,節省帶寬資源
    gzip on
    # nginx支持多虛擬主機,只需寫入多個server關鍵字
    # 虛擬機1
    server {
		...
    }
    # 虛擬機2
    server {
		...
    }
}

2. 訪問日誌

http {
    include       mime.types;
    default_type  application/octet-stream;
	# 日誌格式化
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
                      
	access_log  logs/access.log  main;       
	....
}

3. 虛擬主機配置

http {
    # nginx支持多虛擬主機,只須要寫入多個server關鍵字便可
    # 虛擬主機1
    server {
        # 基於端口的虛擬主機區分 
        listen       80;
        # 基於域名的虛擬主機區分
        server_name  www.test.com;
        # charset koi8-r;
        # access_log  logs/host.access.log  main;
        # access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main;
        # 這裏是nginx的url匹配,如同django的url規則同樣
        # 當個人請求時 http://172.16.44.142:81/test.jpg  這樣的時候,就進入以下location匹配
        # 這個是最低級的匹配,全部請求都會走到這裏
        location / {
            # root關鍵字定義虛擬主機的根目錄, 這裏是能夠修改的
            root   /opt/test/;
            # 必須保證首頁文件存在,index參數是定義首頁文件的名字的
            index  index.html index.htm;
        }
	}

# 虛擬主機2 
server {
		listen       80;
		server_name  www.henry.com;
		location / {
			root   /opt/henry/;
			index  index.html index.htm;
		}
	}
}

4. 錯誤頁面404優化

server {
    listen 80;
    # 經過這個參數定義便可
    error_page  404   /404.html;
    location / {
    	# 指定 404.html頁面的文件目錄
        root   /opt/404;
        index index.html;
    }
}

5. nginx反向代理

# 代理
# 用戶,客戶端    中介,代理服務器,   房東,資源服務器
# 租房的客戶  ->  中介,代理  ->   房東 
# 瀏覽器 -> nginx  ->  django 

環境以下
機器1 	172.16.44.142  是代理服務器的角色,nginx提供的功能
機器2	172.16.44.143  是資源服務器的角色,nginx靜態資源服務器
  • 反向代理服務器配置以下
# 打開172.16.44.142 機器的nginx.conf,修改成以下
server {
    listen       80;
    server_name  www.test.com;
    location / {
        # root   /opt/test/;
        # index  index.html index.htm;
        # 實現反向代理的功能參數
        proxy_pass http://172.16.44.143;
    }
}

6. nginx負載均衡

# 環境準備
1臺負載均衡服務器,nginx而已, 172.16.44.142 是負載均衡服務器
2臺資源服務器
# 準備好2臺資源服務器,本應該提供同樣的數據,進行負載均衡,實驗目的,看到不一樣的頁面,因此準備不一樣的頁面數據
	172.16.44.142  資源服務器1,返回 test 的頁面 
	172.16.44.143  資源服務器2,返回 henry 的頁面
  • 默認輪詢方式
# 準備負載均衡服務器,配置以下
# 在nginx配置文件中,添加以下配置,定義負載均衡池,寫入後端項目地址
upstream mydjango  {
    server 172.16.44.142;
    server 172.16.44.143;                                                                    
}
  • 權重方式
# 權重方式
upstream mydjango  {
	server 172.16.44.142	weight=4;
	server 172.16.44.143	weight=1;                                                                    
}
  • ip地址hash方式
# ip哈希方式,根據用戶的來源ip計算出哈希值,永遠只指派給一個服務器去解析
# ip哈希不得與權重共同使用 
upstream mydjango  {
    server 172.16.44.142;
    server 172.16.44.143;         
    ip_hash;
}
# socket協議請求的負載池
# upstream myvue{
#         server 172.16.44.142:8888 weight=10;
#         server 172.16.44.143:8888 weight=1; 
# }

#虛擬主機配置以下
server {
    listen       80;
    server_name  www.test.com;
    location / {
        proxy_pass http://mydjango;
        # socket進行負載均衡
        # uwsgi_pass myvue;
    }
}

3. 項目部署

1. nginx + uwsgi + django + mysql

# 上傳crm項目到linux服務器
# 安裝uwsgi命令,這是python的一個模塊
# 激活一個虛擬環境去使用

virtualenv --no-site-packages --python=python3   uwsgi_django
pip3 install -i https://pypi.douban.com/simple  uwsgi 

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django==1.11.23
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pymysql 
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django-multiselectfield

2. 啓動 crm項目

  • 使用uwsgi的命令,參數形式
# 以往的python3 manage.py runserver 調用wsgiref去啓動django,性能很低,單進程web
# 使用uwsgi啓動django,能夠支持併發,多進程,以及日誌設置,多種功能

# 必須在django項目,第一層敲這個命令
uwsgi --http :8000 --module henry_crm.wsgi
	--http 指定是http協議,去啓動項目
	--module  指定django目錄下的wsgi文件
# uwsgi支持的熱加載命令
uwsgi --http :8000 --module henry_crm.wsgi   --py-autoreload=1
  • 測試
# 須要清空防火牆規則
iptables -F

3. uwsgi配置文件啓動

  • 把啓動參數,寫入到一個文件中,而後執行這個文件便可
  • 配置文件名字能夠叫作 uwsgi.ini ,內容以下,這個文件是手動生成的
touch uwsgi.ini ,寫入以下內容

[uwsgi]
# Django-related settings
# the base directory (full path)
# 填入項目的絕對路徑,項目的第一層路徑
chdir           = /opt/projects/henry_crm
# Django's wsgi file
# 指定第二層項目下的wsgi文件
module          = henry_crm.wsgi
# the virtualenv (full path)
# 找到虛擬環境的絕對路徑
home            = /opt/projects/env/crm_env
# process-related settings
# master
master          = true
# 以cpu核數來填寫,uwsgi的工做進程數
processes       = 2
# the socket (use the full path to be safe
# 這是以uwsgi_socket協議啓動的項目,沒法再去經過瀏覽器訪問,必須經過nginx以uwsgi協議去反向代理
socket          = 0.0.0.0:8000
# 也可使用http協議去啓動(僅用做調試使用)
# http = 0.0.0.0:9000
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true
# 後臺運行參數,將uwsgi運行在後臺,而且將django日誌輸出到uwsgi.log中
daemonize = uwsgi.log

4. 指定配置文件啓動django

uwsgi --ini  uwsgi.ini

4. 配置反向代理

1. 修改nginx.conf以下

server {
    listen       80;
    server_name  www.test.com;
    location / {
        # 轉發請求的方式配置在這裏
		include    uwsgi_params;
		uwsgi_pass 0.0.0.0:8000;
    }
}

2. 從新加載nginx,

  • 訪問nginx,查看是否反向代理
  • 用瀏覽器訪問nginx的地址,查看可否訪問到crm的內容

3. 收集crm的靜態文件

  • 丟給nginx去解析
  • 對django的settings.py配置修改以下
# 添加以下參數
STATIC_ROOT='/opt/crm_static'
STATIC_URL = '/static/'
STATICFILES_DIRS = [
	os.path.join(BASE_DIR, 'static')
]
# 執行命令,收集django的全部靜態文件,系統會自動建立'/opt/static'  這個文件夾
python3 manage.py collectstatic

4. 配置nginx

  • 找到crm的這些靜態資源
location / {
    include    uwsgi_params;
    uwsgi_pass 0.0.0.0:8000;
}
       # 添加一個location,針對nginx的url進行匹配處理
       # 當請求時 www.oldchouhuo.com/static/.....  這樣的url的時候,nginx進行別名修改,去/opt/s21static底下去尋找資源文件                                                                                                                          
location  /static {
	alias /opt/static;
}

# 此時再次訪問網站,查看是否處理了靜態資源
www.test.com

5. 先後端分離的部署筆記

1. 後端部署

  • uwsgi + drf + redis + mysql

1. 準備後端代碼

# 下載測試代碼
wget https://files.cnblogs.com/files/pyyu/luffy_boy.zip

2. 建立且激活新的虛擬環境

# 建立虛擬環境
virtualenv --no-site-packages --python=python3

3. 解決模塊依賴問題,嘗試調試啓動drf後臺

[root@localhost opt]# cat requirements.txt
	certifi==2018.11.29
	chardet==3.0.4
	crypto==1.4.1
	Django==2.1.4
	django-redis==4.10.0
	django-rest-framework==0.1.0
	djangorestframework==3.9.0
	idna==2.8
	Naked==0.1.31
	pycrypto==2.6.1
	pytz==2018.7
	PyYAML==3.13
	redis==3.0.1
	requests==2.21.0
	shellescape==3.4.1
	urllib3==1.24.1
	uWSGI==2.0.17.1
pip3 install -i https://pypi.douban.com/simple -r requirements.txt

4. 使用uwsgi,啓動drf後臺

touch uwsgi.ini
[uwsgi]
chdir           = /opt/projects/luffy_boy
module          = luffy_boy.wsgi
home            = /opt/env/uwsgi_vue
master          = true
processes       = 2
socket          = 0.0.0.0:8000
vacuum          = true
daemonize = uwsgi.log

2. 前端部署

1. 下載前端vue代碼

wget https://files.cnblogs.com/files/pyyu/07-luffy_project_01.zip
# vue+nginx的端口	  80端口,使用 server_name = www.vue.com
# nginx反向代理端口	9000   這是第二個虛擬主機
# 業務邏輯drf的後臺端口  	 8888

2. 訪問步驟

第一步: 172.16.44.142:80  查看到路飛的首頁內容,是vue的靜態頁面
第二部: 點擊課程列表的時,vue向後臺發送請求了,發送的地址應該是 172.16.44.142:9000
第三部: 此時  nginx的反向代理,轉發請求給了 drf的後臺 8888
# 修改vue的請求發送地址,重要!!!!,修改vue請求地址,向服務器的ip地址發送請求
# sed 使用語法
sed -i  "s/127.0.0.1:8000/172.16.44.142:9000/g"  src/restful/api.js 
	-i 將替換結果寫入到文件
	"s/你想替換的內容/替換以後的內容/g"      s是替換模式  g是全局替換

3. 安裝nodejs編譯vue代碼

# 配置nodejs的解釋器環境,打包編譯vue代碼,生成靜態文件夾dist
# 這裏的node代碼包,是二進制包,已經編譯好了,能夠直接使用
wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz

# 解壓縮node的代碼包
tar -zxvf node-v8.6.0-linux-x64.tar.gz 

# 配置PATH環境變量
PATH='/opt/py37/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/tengine/sbin:/opt/node-v8.6.0-linux-x64/bin' 

# 檢查node是否可用
[root@localhost bin]# node -v
v8.6.0
[root@localhost bin]# npm -v
5.3.0
# 進入vue代碼目錄,開始編譯代碼,生成dist靜態文件夾
cd /opt/projects/luffy_vue/
#開始安裝這個項目全部須要的node模塊,默認去讀取 package.json
npm install 
#開始編譯vue代碼,生成dist靜態網頁文件夾,丟給nginx 
npm run build

3. 在正確生成dist以後,配置nginx

# 這裏配置和luffy學成有關的代碼
# 這個是nginx+vue的虛擬主機
server {
        listen 80; 
        server_name www.myvue.com;
        error_page  404              /404.html;
        # 請求來到這裏時,返回vue的頁面
        location / { 
            root   /opt/projects/luffy_vue/dist;
            index index.html;
            # 404報錯
            try_files $uri $uri/ /index.html;
        }   
    } 
    
# 這個是nginx反向代理,轉發vue請求給drf的虛擬主機
server {
         listen 9000;
         server_name localhost;
         location / { 
             include    uwsgi_params;
             uwsgi_pass 0.0.0.0:8888;
         }   
    }   
# 此時訪問vue地址便可,看到路飛頁面,且能夠看到課程列表的數據,能夠添加linux,和django的課程,到購物車中,整個部署過程結束

4. 安裝並啓動redis

相關文章
相關標籤/搜索