目錄
前言
先概括下訪問流程:
首先客戶端發起請求,這裏會有TCP的握手,三次握手結束之時,客戶端會帶上http數據給服務器(請求行,請求頭,請求體),服務器會接收到http協議,Nginx會接收到數據,然後根據裏面的配置進行判斷是否需要轉發,如果是static,直接拿資源返回,如果需要在轉發繼續socket連接後面的應用,這裏就是uwsgi,該程序可以理解爲DJango的運行環境,只要都遵循wsgi協議,都能和uwsgi和DJango一樣連接起來,DJango處理並返回
DJango開發環境
Mac OS High sierra 10.13.4
mintoudeMacBook-Pro-2:~ mintou$ python3 -m django --version
2.1
mintoudeMacBook-Pro-2:~ mintou$ ipython3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.3.1 -- An enhanced Interactive Python. Type '?' for help.
這裏一個簡單的DJango應用就不介紹了,詳細的可以看這裏
首先明白一點,阿里雲服務買了之後(怎麼買就不說了),Nginx是已經有了的,而且有自帶的Python2.7,但是我們還是要裝3x以上的Python來玩,畢竟新時代馬上要來了,看看需要安裝什麼先。這裏提到的幾個名詞畫一張圖介紹下
介紹完了一些安裝和邏輯,開始操作、
上傳以及服務器環境部分
首先開發的電腦上安裝的我們都要在服務器上安裝
pip3 freeze > plist.txt
- 通過ftp軟件將開發好的項目上傳到此服務器的某個目錄
- 然後在服務器上執行
pip3 install -r plist.txt
就拿最簡單的Demo爲例,以下是目錄
更改根目錄下的setting.py
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['*']
...
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
STATIC_ROOT='/var/www/upload/static/'
STATIC_ROOT在開發環境沒用,生產環境用來指定收集靜態文件到哪裏,只有這個作用,上面兩個是開發環境測試用的,Nginx裏面的靜態文件地址也配成STATIC_ROOT一樣的
小結:
1.搭建一個DJango應用,修改配置文件到生產部署之前的配置
2.pip3 導出安裝包語句
3.ftp推上去
以下是推上去的目錄
[root@izj6cgebrvv84gtntwiyagz static]# cd /root/Desktop/uploadProject/upload/
[root@izj6cgebrvv84gtntwiyagz upload]# ls -a
. .. .DS_Store manage.py static templates upload userinfo uswgi.log uwsgi.ini uwsgi.pid
uwsgi部分
- python manage.py runserver:這是一款適合開發階段使用的服務器,不適合運行在真實的生產環境中
- 在生產環境中使用WSGI
- WSGI:Web服務器網關接口,英文爲Python Web Server Gateway Interface,縮寫爲WSGI,是Python應用程序或框架和Web服務器之間的一種接口,被廣泛接受
- WSGI沒有官方的實現, 因爲WSGI更像一個協議,只要遵照這些協議,WSGI應用(Application)都可以在任何服務器(Server)上運行
- 命令django-admin startproject會生成一個簡單的wsgi.py文件,確定了settings、application對象
- application對象:在Python模塊中使用application對象與應用服務器交互
- settings模塊:Django需要導入settings模塊,這裏是應用定義的地方
- 此處的服務器是一個軟件,可以監聽網卡端口、遵從網絡層傳輸協議,收發http協議級別的數據
- uWSGI實現了WSGI的所有接口,是一個快速、自我修復、開發人員和系統管理員友好的服務器
- uWSGI代碼完全用C編寫
- 安裝uWSGI
pip3 install uwsgi
cd到項目根目錄,創建一個uwsgi.ini的文件
[uwsgi]
socket=外網ip:端口(使用nginx連接時,使用socket) 127.0.0.1:8000或者是阿里雲私有ip地址
# http=外網ip:端口(直接做web服務器,使用http) 沒有nginx的使用,一般不管他
chdir=項目根目錄 (/root/Desktop/uploadProject/upload)
wsgi-file=項目中wsgi.py文件的目錄,相對於項目根目錄 (upload/wsgi.py)
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uswgi.log
- 啓動:uwsgi --ini uwsgi.ini
- 停止:uwsgi --stop uwsgi.pid
- 重啓:uwsgi --reload uwsgi.pid
- 如果重複開始,stop的時候會失敗,可以執行如下強制殺死 sudo killall -9 uwsgi
小結:
- 在項目根目錄創建uwsgi.ini文件並設置
- 執行命令開啓uwsgi --ini uwsgi.ini讓DJango項目接收傳過來的http參數
- 修改了任何配置需要uwsgi --stop uwsgi.pid 如果失敗可以查看pid並且修改uwsgi.pid,或者強制殺死在啓動
nginx部分
- 使用nginx的作用
- 負載均衡:多臺服務器輪流處理請求
- 反射代理:隱藏真實服務器
- 實現構架:客戶端請求nginx,再由nginx請求uwsgi,運行django框架下的python代碼
- nginx+uwsgi也可以用於其它框架的python web代碼,不限於django
- 阿里雲已經安裝好了,不需要再安裝
nginx目錄
cd /usr/sbin/nginx 安裝目錄
vim /etc/nginx/nginx.conf 配置文件所在目錄
- 查看版本:sudo sbin/nginx -v
- 啓動:sudo sbin/nginx
- 停止:sudo sbin/nginx -s stop
- 重啓:sudo sbin/nginx -s reload
那麼nginx是uwsgi之前最先收到數據的,咱們打開nginx配置文件修改路由,指向uwsgi程序
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
以上不用我們管 下面一個個的server就是配置的
server {
listen ip地址:80 default_server;
#listen [::]:80 default_server;
server_name _;
# root /usr/share/nginx/html;
# Load configuration files for the default server block.
#include /etc/nginx/default.d/*.conf;
# 默認轉發到 DJango
location / {
include uwsgi_params;
# 這裏配置的和項目下面的uwsgi.ini裏面socket一樣才能接收
uwsgi_pass ip地址:8002;
}
# 在服務器配置的靜態文件目錄
location /static {
alias /var/www/upload/static/;
}
# 這個是例外,給我的iOS客戶端配置的bundlejs/ActivityPage.js來使用 不轉發到DJango
location /bundlejs {
alias /usr/share/nginx/html/bundlejs/;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
以下是阿里雲nginx默認的配置
#
# server {
# listen 8001;
# #listen [::]:80 default_server;
# server_name upload;
# #root /usr/share/nginx/html;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# include uwsgi_params;
# uwsgi_pass 127.0.0.1:8002;
# }
#
# #error_page 404 /404.html;
# # location = /40x.html {
# #}
#
# #error_page 500 502 503 504 /50x.html;
# # location = /50x.html {
# #}
# } 37,0-1 37%
這是配置文件,我們需要改的就是server,如果不改默認端口80那一坨,也可以直接另起一個監聽另一個端口比如8000.
在server下添加新的location項,指向uwsgi的ip與端口
location / {
include uwsgi_params;將所有的參數轉到uwsgi下
uwsgi_pass uwsgi的ip與端口;
}
我們試着改了默認的server,讓用戶輸入ip之後直接指向我們配置的頁面即可。如果listen對了,默認是會匹配location裏面的的正則,匹配到了就路由到指定ip+端口,static是配置不走DJango的,如127.0.1.1/static/xxxx.png,這樣的url直接拿服務器上的資源,不走Django,直接返回,配置好了nginx,指向uwsgi,再指向DJango服務,一套就配置好了。
小結:
- 阿里雲自帶,熟悉安裝目錄和配置文件目錄
- 配置nginx listen location以及static 這裏的static配置的路徑是後續靜態文件存放路徑
- 配置location之後切換到項目根目錄重新配置uwsgi.ini 修改uwsgi.ini文件,啓動socket,禁用http
- 重啓nginx、uwsgi(上面有介紹如何重啓)
靜態文件
本地開啓的DJango應用,我們執行
python3 manage.py runserver
之後,我們是可以根據img標籤裏面的src=/static/xxx.png獲取靜態資源,那麼我們在服務器上啓用了nginx之後,靜態資源就由nginx來攔擊處理了,如上配置的static正則,指定了一個路徑,該路徑就是我們服務器上自己配置的靜態資源路徑。
- 所有的靜態文件都會由nginx處理,不會將請求轉到uwsgi
- 配置nginx的靜態項,打開conf/nginx.conf文件,找到server,添加新location
location /static {
alias /var/www/upload/static/;
}
一開始這些目錄是沒有的,需要自己創建
- 在服務器上創建目錄結構“/var/www/upload/”
- 修改目錄權限
sudo chmod 777 /var/www/upload
- 創建static目錄,注意順序是先分配權限,再創建目錄
mkdir static
這裏就可以再看下項目根目錄下的setting.py了
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
STATIC_ROOT='/var/www/upload/static/'
上面兩個是開發環境下的,最後一個配置是採集DJango的靜態文件的。不想出錯的話直接配置好三個即可,上面兩個是針對項目目錄來的,下面的STATIC_ROOT是採集用的,就是服務器上的一個地址,和nginx查找的static配置文件匹配。
執行
python3 manage.py collectstatic
就會把DJango項目中的STATIC_URL對應的目錄下的資源採集到STATIC_ROOT目錄,讓nginx查找匹配。採集資源如下,和項目是一一對應的,只是由nginx來匹配了
[root@izj6cgebrvv84gtntwiyagz nginx]# cd /var/www/upload/
[root@izj6cgebrvv84gtntwiyagz upload]# ls -a
. .. static
[root@izj6cgebrvv84gtntwiyagz upload]# cd static/
[root@izj6cgebrvv84gtntwiyagz static]# ls
admin bundlepic js weexJS
[root@izj6cgebrvv84gtntwiyagz static]#
小結
- 新建服務器靜態資源目錄和權限配置
- nginx配置文件static配置路徑
- 項目setting.py下配置路徑,採集路徑和nginx統一目錄下
- 執行採集,靜態資源轉移
- 重啓nginx、uwsgi
阿里雲端口權限開啓
進入安全組配置,開啓指定端口權限
至此,輸入你的阿里雲ip地址,就可以訪問到DJango寫的匹配到urls.py下的第一個views.py對應的html模板頁面,邏輯搞明白了,後面就是寫模塊了,後面改了什麼就重啓nginx或者uwsgi