Nginx學習

基礎操作

安裝 :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
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章