基礎操作
安裝 :yum -y install install nginx
查看版本: nginx -v
啓動 : sudo nginx # 啓動瀏覽器,輸入服務器地址,看見Welcome to Nginx則說明安裝成功
快速停止:sudo nginx -s stop # -s 表示往nginx裏發送信號
退出:sudo nginx -s quit # 比stop 優雅
重新加載配置文件 : sudo nginx -s reload
重新打開日誌文件 : sudo nginx -s reopen
配置目錄
cd /etc/nginx
配置模塊
events 配置域 :網絡連接相關配置(I/O模型等)
server配置域 : 相關節點配置
location配置域 : 資源路由配置
http配置域:Nginx作爲網頁服務器時的配置
同級有一個mail控制域,負責郵件相關配置
upstream配置域 : 反向代理配置域
配置域之間的層級關係
events{
# 頂級配置域
}
http{
upstream{
...
}
server{
location{
...
}
}
}
mail{
}
[root@VM_0_9_centos nginx]# vim nginx.conf
# 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; # log地址
pid /run/nginx.pid; # 進程所在地
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf; # 包含/usr/share/nginx/modules/下的所有配置文件
events {
worker_connections 1024; # 每個進程處理最大連接數
}
http {
...
include /etc/nginx/conf.d/*.conf;
server {}
}
WSGI & ASGI & uWSGI
WSGI(僅爲一種通信規範)
Python Web Server Gateway Interface:爲Python語言定義的Web服務器和Web應用程序框架之間的之中簡單、通用的接口
# 部署由http協議的Django應用時,最典型的使用
只用到了 http 和http2
Web服務器 協議(服務應用) Web應用程序框架
Ngix代理/Apache + WSGI(uWSGI) + Django/Flask
ASGI
Asynchronous Server Gateway Interface:異步服務網關接口,介於網絡協議服務和python應用之間的標準接口,能夠處理多種通用協議類型,包括http、http2、websocket
Ngix代理/Apache + ASGI(Daphne) + Django/Flask
-
WSGI和ASGI區別:
WSGI是基於HTTP協議模式的,不支持WebSocket,而ASGI就是爲了支持Python常用的WSGI所不支持的新協議標準,即ASGI是WSGI的擴展,而且能asyncio異步運行
uWSGI
- 實現WSGI協議
- 是一個Web服務器
- 接收客戶端請求,通過協議傳送給Django應用
uWSGI安裝域基本配置
安裝 : pip3 install uWSGI
chdir :指定WSGI應用目錄
module :指定WSGI應用模塊的名字
processes : uWSGI進程數
(http-)socket : 套接字路徑、地址
max-requests : 最大併發請求數
vacuum : 清理環境配置(Boolean 默認爲True)
-
啓動uwsgi服務示例
Linux下命令行方式: uwsgi --chidr xxx --socket :80 --max-requests 5000 --processes 4 --module xxx.wsgi
配置文件方式: vim uwsgi-demo.ini [uwsgi] chidr = /xxxx/xx http-socket = :80 max-requests = 5000 module = xxx.wsgi # 啓動指令 uwsgi --ini uwsgi-demo.ini
爲什麼需要uWSGI部署Django項目?
Django runserver 可以很直接對外服務,但只適用於測試
uWSGI可以進行多進程調度、進行監控
uWSGI提供完善的請求日誌處理
-
Demo,打通uwsgi <-> client <-> python應用
# Linux下 mkdir deployment cd deployment touch uwsgi_test.py vim uwsgi_test.py
#!/usr/bin/env python # -*- encoding=utf-8 -*- def appliction(env,start_response): """ env : 環境變量 start_response : """ start_response("200 ok",[('Content-type','text/html')]) # 指定返回內容,注意要返回字節型字符串 return [b'hellow world, hello uwsgi']
-
啓動服務
uwsgi --http :8000 --uwsgi-file uwsgi_test.py
使用瀏覽器訪問服務器ip地址:8000 端口,可以看到返回內容,而服務可以看見log
-
Demo,將python應用變爲django應用
cd deployment django startproject django_deployment cd django_deployment vim settings.py
# 運行所有ip訪問 ALLOW_HOST = ["*"]
# 運行服務 看到歡迎頁面即成功 python3 manage.py runserver 0.0.0.0:8000
-
啓動django的uwsgi.py
# 依舊能正常訪問即正常 uwsgi --http :8000 --module django_deployment.wsgi # 每次刷新瀏覽器,可看見瀏覽器後臺打印log
-
將命令函配置改爲文件配置
# 在 manage.py統計目錄下 touch django_uwsgi.ini vim django_uwsgi.ini
[uwsgi] chdir = django_deployment.wsgi所在目錄 module = django_deployment.wsgi http-socket = :8000 master = true process = 4 threads = 1 vacuum = true # 指定log配置[!!記得創建對應的log文件夾!!] daemonize = %(chdir)/log/uwsgi-8000.log # 指定log位置 # 不能設置爲 1024*1024*1024,要直接設置爲數值 log-maxsize = 1024000000 pidfile = %(chdir)/pid/uwsgi-8000.pid # 指定pid(進程文件)位置
-
再次啓動uwsgi服務
uwsgi --ini django_uwsgi.ini
停止服務
uwsgi --stop pid/uwsgi-8000.pid
-
-
-
Django Nginx + uWSGI部署
-
爲何還需要Nginx進行部署?
- 知名服務器,提供更安全的服務保障 - 提供反向代理、負載均衡等豐富功能 - 對於靜態文件處理能力更強
-
實現步驟
Step1 - uwsgi啓動Django服務 Step2 - 修改Nginx配置文件,完成反向代理配置 Step3 - 收集靜態文件,完成講臺文件尋址配置
Step1 - uwsgi啓動Django服務 uwsgi --ini django_uwsgi.ini cat pid/uwsgi-8000.pid # 查看pid進程文件 ps -aux | grep 13290 # 查看進程相關信息
Step2 - 修改Nginx配置文件,完成反向代理配置 cd /etc/nginx/ sudo su # 該文件夾需要root權限,所有切換爲root用戶 cp nginx.conf nginx-uwsgi.conf # 複製一份配置文件 vim nginx-uwsgi.conf
# vim nginx-uwsgi.conf中 http{ ... # 反向代理配置域 名字爲uwsgi upstream uwsgi{ # 指定具體地址 server 127.0.0.1:8000 } # 創建server節點 server{ listen 80; # 監聽80端口,沒有域名即在後面添加 default server # server name : .xxxx.xxx.com #域名需要在服務器運營商處配置, . 表示所有域名都映射到此 charset utf-8; access_log /var/log/nginx/nginx-wusgi.log # 具體服務節點,進行轉發 location / { # 意爲 server name : .xxxx.xxx.com下 80端口的所有請求都轉發到 # 上面自定義的upstream uwsgi地址 proxy_pass http://uwsgi; } # 收集完靜態文件後配置 location /static { alias 靜態文件目錄eg:home/xxx/xxx/xxx/static; } } }
-
靜態文件收集
進入項目文件 settings.py中 指定靜態文件目錄 : STATIC_ROOT = OS.PATH.JOIN(BASE_DIR,'static/') # 使用指令收集靜態文件 python manage.py collectstatic # cd /etc/nginx 配置nginx.conf
-
Django https配置
-
認識HTTPS
HTTPS 使用SSL協議加密保溫傳輸內容 使用443端口 耗費CPU資源與計算時間
-
申請SSL證書
雲廠商提供個人免費證書申請 個人免費版證書僅支持一個域名或子域名 驗證SSL證書綁定域名的有效性
在/etc/nginx/ 目錄下創建ssl目錄 將證書中壓縮包中 ssl/申請域名/nginx/ 下 域名.crt & 域名.key 同步進去
cp nginx-wusgi.conf nginx-wusgi-https.conf # 複製一份配置文件用以區分 vim nginx-wusgi-https.conf
# nginx-wusgi-https.conf # 將80端口轉發到443安全端口 server { listen 80; server_name .xxxx.com; return 301 https://{域名}.com$request_url; # 301 表示爲重定向狀態碼 } server{ # 將端口改爲443 listen 443 ssl; # 添加域名crt 與key ssl_certificate /etc/nginx/ssl/xxxx.com.crt; ssl_certificate_key /etc/ssl/nginx/xxxx.com.key; # 定義協議 可以從上方nginx默認定義中copy ssl_protocols TLSV1 TLSV1.1 TLSV1.2 } # 使用瀏覽器輸入網址 https://{域名}.com:443
Nginx配置高可用(故障自動切換)
/etc/nginx/設置兩個進程
cp django_uwsgi.ini django_uwsig_8001.ini # 複製兩個配置文件
cp django_uwsgi.ini django_uwsig_8002.ini
分別將端口、log、進程設置爲 8001,8002,並將processes 下調爲1(資源有限)
分別啓動8001與8002端口
uwsgi --ini django_uwsig_8001.ini
uwsgi --ini django_uwsig_8002.ini
cp nginx-uwsgi-https.conf nginx-uwsgi-https-HA.conf
vim nginx-uwsgi-https-HA.conf
-
# nginx-uwsgi-https-HA.conf # 將upstream uwsgi改爲2個server upstream uwsgi{ server 127.0.0.1:8001; server 127.0.0.1:8002; }
nginx -s reload
# 實時查看log
sudo tail -f uwsgi-8002.log
# 模擬停止一個進程 停止8002
uwsgi --stop pid/uwsgi-8002.pid
ps -aux | grep uwsgi # 查看相關進程
# 使用瀏覽器再次訪問服務器(能正常訪問)
-
Nginx負載均衡
# 將upstream uwsgi 在server後添加權重 upstream uwsgi{ server 127.0.0.1:8001 weight=3; server 127.0.0.1:8002 weight=1; }
注意事項
- 不要用root權限啓動uWSGI服務
- 關閉uWSGI外網訪問
- 將http-socket = :8001,改爲127.0.0.1:8001。則實現外網屏蔽
Unix套接字
- 進程間通信(IPC) 的一種方法
- 可靠且時POSIX標準的一個組件
- 只能用古同一主機間的通信
-
傳統nginx-uWSGI之間通信需要經過多層tcp/ip協議,佔用資源
-
修改相關配置
# 項目目錄下 cp django-uwsgi.ini django-uwsgi-sock.ini vim django-uwsgi-sock.ini 註釋掉: http-socket = :8001 改爲: socket = django.sock 重新運行 uwsgi --ini django-uwsgi-sock.ini 文件夾中會多出一個django.sock 文件 修改權限讓 nginx能夠使用 : chmod 777 django.sock
# /etc/nginx/ cd /etc/nginx/ sudo su # 切換爲root權限 修改配置文件: # 在此行下添加 include /usr/share/nginx/modules/*.conf; # 引入uwsgi_params include /etc/nginx/uwsgi_params; upstream uwsgi{ # 註釋掉 : server 127.0.0.1:8000 改爲: # eg: server unix:///home/ubuntu/xxx/xxx/django.sock server unix://{/django項目目錄下的django.sock文件} } server { ... location{ # 註釋掉 proxy_pass http://uwsgi; 改爲uwsgi轉發 uwsgi_pass uwsgi; } } nginx -s reload # 重新加載 訪問服務器,能正常加載則pass