前言:
項目各種測試和bug調(diào)試完畢主巍,就需要部署上線,宣傳造勢,讓更多人知道你完成的心血。今天就對Nginx部署做一下自己的淺談:
官網(wǎng)
http://nginx.org/
中文資料
http://www.nginx.cn/doc/index.html
http://tengine.taobao.org/book/
為什么選擇Nginx
作為We服務(wù)器:相比Apache夹界,Nginx使用資源更少,支持更多的并發(fā)連接隘世,體現(xiàn)更高的效率可柿,使Nginx倍受歡迎,能夠支持高達50000個并發(fā)連接數(shù)的響應(yīng)
作為負載均衡服務(wù)器:Nginx既可以在內(nèi)部直接支持Redis和PHP丙者,也可以支持作為HTTP代理服務(wù)器對外進行服務(wù)复斥,Nginx使用C編寫,不論是系統(tǒng)資源開銷還是CPU使用效率都處理的非常優(yōu)秀
Nginx安裝非常簡單械媒,配置文件非常簡潔目锭,Bug非常少:Nginx啟動非常容易,并且?guī)缀蹩梢宰龅? * 24小時不間斷運行滥沫,即使運行數(shù)個月也不需要重新啟動
安裝:
sudo apt install nginx
Nginx安裝主要有兩種方式
源碼安裝
1. 下載源碼壓縮包
2. 安裝源碼編譯依賴包 gcc,zlib,make...
3. 配置編譯模塊
4. make && make test
5. make install
包管理工具安裝
1. 去官網(wǎng)將所使用依賴添加到包管理工具中
2. 更新包管理工具資源
3. 使用包管理工具安裝
啟動Nginx
nginx [ -c configpath]
信息查看
nginx -v
nginx -V
控制Nginx
nginx -s signal
stop 快速關(guān)閉
quit 優(yōu)雅的關(guān)閉
reload 重新加載配置
通過系統(tǒng)管理
systemctl status nginx 查看nginx狀態(tài)
systemctl start nginx 啟動nginx服務(wù)
systemctl stop nginx 關(guān)閉nginx服務(wù)
systemctl enable nginx 設(shè)置開機自啟
systemctl disable nginx 禁止開機自啟
配置文件
Nginx配置文件包含指定指令控制的模塊岖常。
指令分為簡單指令和塊指令
一個簡單指令由名稱和參數(shù)組成暂筝,以空格分隔获雕,并以分號結(jié)尾
一個塊指令和簡單指令具有相同的結(jié)構(gòu)聋丝,但不是以分號結(jié)束,而是以一個大括號包圍的一堆附 加指令結(jié)束
如果一個大括號內(nèi)可以有其他的指令缀辩,它就被稱為一個上下文臭埋,比如(events踪央,http,server瓢阴,location)
指令
nginx -t 不運行畅蹂,僅測試配置文件
nginx -c configpath 從指定路徑加載配置文件
nginx -t -c configpath 測試指定配置文件
配置文件結(jié)構(gòu)
main 全局設(shè)置
events{ 工作模式,連接配置
...
}
http{ http的配置
...
upstream xxx{ 負載均衡配置
...
}
server{ 主機設(shè)置
...
location xxx{ URL匹配
...
}
}
}
main
user nginx; worker進程運行的用戶和組
worker_processes 1; 指定Nginx開啟的子進程數(shù)荣恐,多核CPU建議設(shè)置和CPU數(shù)量一樣的進程數(shù)
error_log xxx level; 用來定義全局錯誤日志文件液斜,通常放在var中,level有 debug叠穆,info少漆,notice, warn硼被,error示损,crit
pid xxx; 指定進程id的存儲文件位置
events
指定工作模式和以及連接上限
events{
use epoll;
worker_connections 1024;
}
use 指定nginx工作模式
epoll 高效工作模式,linux
kqueue 高效工作模式嚷硫, bsd
poll 標準模式
select 標準模式
worker_connections 定義nginx每個進程的最大連接數(shù)
正向代理 連接數(shù) * 進程數(shù)
反向代理 連接數(shù) * 進程數(shù) / 4
linux系統(tǒng)限制最多能同時打開65535個文件检访,默認上限就是65535,可解除 ulimit -n 65535
http
最核心的模塊仔掸,主要負責(zé)http服務(wù)器相關(guān)配置脆贵,包含server,upstream子模塊
include mime.types;設(shè)置文件的mime類型
include xxxconfig; 包含其它配置文件起暮,分開規(guī)劃解耦
default_type xxx; 設(shè)置默認類型為二進制流丹禀,文件類型未知時就會使用默認
log_format 設(shè)置日志格式
sendfile 設(shè)置高效文件傳輸模式
keepalive_timeout 設(shè)置客戶端連接活躍超時
gzip gzip壓縮
server
用來指定虛擬主機
listen 80; 指定虛擬主機監(jiān)聽的端口
server_name localhost; 指定ip地址或域名,多個域名使用空格隔開
charset utf-8; 指定網(wǎng)頁的默認編碼格式
error_page 500 502 /50x.html 指定錯誤頁面
access_log xxx main; 指定虛擬主機的訪問日志存放路徑
error_log xxx main; 指定虛擬主機的錯誤日志存放路徑
root xxx; 指定這個虛擬主機的根目錄
index xxx; 指定默認首頁
location
核心中的核心鞋怀,以后的主要配置都在這
主要功能:定位url,解析url持搜,支持正則匹配密似,還能支持條件,實現(xiàn)動靜分離
語法
location [modifier] uri{
...
}
modifier 修飾符
= 使用精確匹配并且終止搜索
~ 區(qū)分大小寫的正則表達式
~* 不區(qū)分大小寫的正則表達式
^~ 最佳匹配葫盼,不是正則匹配残腌,通常用來匹配目錄
常用指令
alias 別名,定義location的其他名字贫导,在文件系統(tǒng)中能夠找到抛猫,如果location指定了正則表達式,alias將會引用正則表達式中的捕獲孩灯,alias替代lication中匹配的部分闺金,沒有匹配的部分將會在文件系統(tǒng)中搜索
Django部署
django 服務(wù)器
runserver
wsgi
uwsgi : web服務(wù)器,多線程處理的不錯
1. pip install uwsgi
2. 工程目錄下創(chuàng)建uwsgi.ini 配置文件
3. 書寫配置信息
4. 使用uwsgi服務(wù)器
- 啟動 uwsgi --ini uwsgi.ini
- 停止 uwsgi --stop uwsgi.ini
nginx配置
location /static{
alias xxx/static/;
}
location / {
include uwsgi_params;
uwsgi_pass localhost:8000;
}
反向代理
proxy_pass URL; 反向代理轉(zhuǎn)發(fā)地址,默認不轉(zhuǎn)發(fā)header峰档,需要轉(zhuǎn)發(fā)header則設(shè)置
proxy_set_header HOST $host;
proxy_method POST; 轉(zhuǎn)發(fā)的方法名
proxy_hide_header Cache-Control; 指定頭部不被轉(zhuǎn)發(fā)
proxy_pass_header Cache-Control; 設(shè)置哪些頭部轉(zhuǎn)發(fā)
proxy_pass_request_header on; 設(shè)置轉(zhuǎn)發(fā)http請求頭
proxy_pass_request_body on; 設(shè)置轉(zhuǎn)發(fā)請求體
upstream
負載均衡模塊败匹,通過一個簡單的調(diào)度算法來實現(xiàn)客戶ip到后端服務(wù)器的負載平衡
寫法 upstream myproject{
ip_hash;
server 127.0.0.1:8000;
server 127.0.0.1:8001 down;
server 127.0.0.1:8002 weight=3;
server 127.0.0.1:8003 backup寨昙;
fair;
}
負載均衡算法
weight 負載權(quán)重
down 當前server不參與負載均衡
backup 其它機器全down掉或滿載使用此服務(wù)
ip_hash 按每個請求的hash結(jié)果分配
fair 按后端響應(yīng)時間來分(第三方的)
服務(wù)器上線一般有兩個:
? ? ? ?一個是apache
? ? ? ?一個是Nginx
Nginx與apache優(yōu)缺點
Nginx相對于apache的優(yōu)點:
? ? ? ?1.并發(fā)率高于apache
? ? ? ?2.對靜態(tài)資源的處理要好
? ? ? ?3.可以做負載均衡和反向代理
? ? ? ?4.占用更少的內(nèi)存及資源
? ? ? ?5.Nginx處理請求是異步非阻塞的掀亩,而apache則是阻塞型的舔哪,在高并發(fā)下Nginx能保持底資源低消耗高性能
apache相對于Nginx的優(yōu)點:
? ? ? ?1.rewrite,相對于Nginx的rewrite要強大
? ? ? ?2.模塊超多,基本能想到的都可以找到
? ? ? ?3.少bug槽棍,Nginx的bug相對較多
4.超級穩(wěn)定
相同點:
? ? ? ?1捉蚤、都是HTTP服務(wù)器軟件
? ? ? ?2、功能上都采用模塊化結(jié)構(gòu)設(shè)計
? ? ? ?3炼七、都支持通用的語言接口缆巧,如PHP、Perl特石、Python等
? ? ? ?4盅蝗、支持正向、反向代理姆蘸、虛擬主機墩莫、URL重寫、壓縮傳輸逞敷、SSL加密傳輸
一般來說狂秦,需要性能web服務(wù),使用Nginx推捐,如果不需要性能只求穩(wěn)定裂问,那就是apache。
Nginx只適合靜態(tài)和反向牛柒,動態(tài)處理請求是雞肋堪簿,一般動態(tài)請求要apache去做
Nginx是很不錯的前段服務(wù)器,負載性能很好皮壁,用webbench模擬10000個靜態(tài)文件請求號不吃力椭更。apache有先天不支持多核心處理負載的缺點,建議使用Nginx做前段蛾魄,后端用apache虑瀑。大型網(wǎng)站建議用Nginx自帶的集群功能
Apache在處理動態(tài)有優(yōu)勢,Nginx并發(fā)性比較好滴须,CPU內(nèi)存占用低舌狗,如果rewrite頻繁,那還是Apache吧扔水。下面開始上代碼:
負載均衡
nginx給我們提供的簡單算法來實現(xiàn)各個服務(wù)器處理請求的分發(fā)
新建/etc/ngonx/conf.d/mo_service.conf
配置
109.png
47.png
可以寫多個
upstream mo-user{
server 127.0.0.1:12352;
server 127.0.0.1:12355;
server 123.32.0.1:12352;
}
upstream mo-weapp{
server 127.0.0.1:12353
}
代理 nginx
阿里云>控制臺>域名與網(wǎng)站>云解析DNS>主域名點進去>添加記錄>
4.44.png
3.49.png
server{
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
#捕獲客戶端真實IP
![屏幕快照 2018-10-27 下午5.22.41.png](https://upload-images.jianshu.io/upload_images/12529562-0649ded68007e310.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
proxy_set_header X-Real-IP $remote_addr; # $remote_addr代表客戶端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# location 顧名思義痛侍,定位,就是當訪問 / 的時候魔市,nginx會將請求轉(zhuǎn)給本地的8080端口恋日,而后面的設(shè)置都是一些基本的配置膀篮,可以直接用
location /static {
alias /home/project/static;
}
# 這個就是配置靜態(tài)文件的地方,要用絕對地址岂膳,對應(yīng)最開始的目錄形式誓竿,假設(shè)project就在/home下面,那么這樣配置就可以的了谈截,還有個前提是筷屡,你在開發(fā)的時候,采取了django的建議簸喂,每個app的靜態(tài)文件都用多了一層app_name的文件夾來包住毙死。
}
2.41.png
解釋:有人訪問80端口,我就給轉(zhuǎn)到12255端口喻鳄,自己不用做扼倘,讓12355區(qū)處理
3.00.png
安裝
1. sudo apt install python3-pip
2. sudo pip3 install virtualenv
3. sudo apt install nginx
4. sudo apt install mysql-server
5.創(chuàng)建虛擬環(huán)境
(1) mkdir axf
(2) cd axf
(3) virtualenv venv # 自帶python3
6.啟動虛擬環(huán)境
展示一下目錄結(jié)構(gòu)
1.15.png
source venv/bin/activate
運行以后是這個樣子的
.26.png
7.安裝django
pip install django==1.11.7
8.安裝uwsgi
pip install uwsgi
9.將項目傳到服務(wù)器axf文件夾下
40.png
10.在項目中創(chuàng)建uconfig.ini文件,進入uconfig.ini
添加代碼如下uconfig.ini
[uwsgi]
# 外部訪問地址,可以指定多種協(xié)議除呵,現(xiàn)在用http便于調(diào)試再菊,之后用socket #
socket = 0.0.0.0:8000
# 指向項目目錄
chdir = /home/xwh/axf/
# flask啟動程序文件
wsgi-file = axf/wsgi.py
# 這行一定要加上,不然請求時會出現(xiàn)-- unavailable modifier requested: 0 --錯誤提示
plugins = python
# 處理器數(shù)
processes = 1
# 線程數(shù)
threads = 2
!!!注意添加代碼是用下面這個不帶注釋的
[uwsgi]
socket = 0.0.0.0:8000
chdir = /home/xwh/axf/
wsgi-file = axf/wsgi.py
plugins = python
processes = 1
threads = 2
11.接下在配置setting.py
輸入:
STATIC_ROOT = os.path.join(BASE_DIR, 'collectstatic')
不寫這個前臺可以訪問颜曾,Admin訪問不了(原因css加載不過來)
collectstatic作用將前臺樣式和后臺樣式塞進去纠拔,不然后臺樣式加載不過來
5.png
:wq
12.執(zhí)行命令
python manage.py collectstatic
en a.png
看到了嗎,collectstatic目錄下就有了css樣式泛豪,進入admin稠诲,也有css樣式,說明加載過來了
到這一步django的配置就結(jié)束了诡曙,接下來就是配置Nginx了
sudo service nginx start # 啟動服務(wù)
sudo service nginx restart # 重啟服務(wù)
sudo service nginx stop #停止服務(wù)
開啟服務(wù)看下效果
sudo service nginx start
50.png
嘿嘿 可以額
13.接下來配置ngnix的配置default文件
cd 到etc/nginx/sites-available
備份default文件
sudo cp default default1
刪除default
sudo rm default
在新建default
sudo vim default
cd /etc/nginx/sites-available
sudo cp default default1
sudo rm default
sudo vim default
看圖吧
6.png
將代碼寫入default
server{
listen 80; # 服務(wù)器監(jiān)聽端口
server_name 39.106.143.156; # 這里寫你的域名或者公網(wǎng)IP
location / {
uwsgi_pass 127.0.0.1:8000; # 轉(zhuǎn)發(fā)端口臀叙,需要和uwsgi配置當中的監(jiān)聽端口一致
include uwsgi_params; # 導(dǎo)入uwsgi配置
uwsgi_param UWSGI_PYTHON /home/xwh/axf/py06/; #Python解釋器所在的路徑(這里為虛擬環(huán)境)
uwsgi_param UWSGI_CHDIR /home/xwh/axf/;# 自己創(chuàng)建的目錄 項目根目錄
}
location /static{
alias /home/xwh/axf/collectstatic/;
}
}
用這個不帶注釋的
server{
listen 80;
server_name 39.106.143.156;
location / {
uwsgi_pass 127.0.0.1:8000;
include uwsgi_params;
uwsgi_param UWSGI_PYTHON /home/xwh/axf/venv/;
uwsgi_param UWSGI_CHDIR /home/xwh/axf/;
}
location /static{
alias /home/xwh/axf/collectstatic/;
}
}
重啟服務(wù)
sodu service nginx restart
14.到axf目錄下
source /venv/bin/activate
uwsgi uconfig.ini
這個樣子
.06.png
回車 跑起來...................
0.png
嘿嘿 ?? 可以額
常出現(xiàn)的問題
*關(guān)閉uwsgi
uwsgi -stop uconfig.ini
# 只有一個好使
uwsgi —stop uconfig.ini
如果關(guān)閉不掉,就殺死它
ps -ef | grep uwsgi
sudo kill -9 進程號
數(shù)據(jù)庫方面在這里不做過多介紹价卤,和開發(fā)模式一樣
問題描述
dajngo admin沒有樣式
admin管理頁面找不到base.css,dashboard.css文件
解決辦法
在settings文件中設(shè)置STATIC_ROOT目錄,該目錄不能在STATICFILES_DIRS中.
然后,執(zhí)行命令
python manage.py collectstatic
執(zhí)行后,django會將STATICFILES_DIRS下的所有文件以及admin所需要用到的js,css,image文件全都放到STATIC_ROOT目錄下.
例如, 像下面這樣寫:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'collectstatic')
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
簡單描述一下這幾個變量的意思
STATIC_URL: 當訪問什么樣的網(wǎng)址時, 按照訪問靜態(tài)文件的方式去查找文件.
STATICFILES_DIRS: 當訪問靜態(tài)文件是, 會在每個app中的static目錄中查找, 然后再從STATICFILES_DIRS設(shè)置的路徑列表中逐一查找.
STATIC_ROOT: 當執(zhí)行python manage.py collectstatic時, 收集的靜態(tài)文件放在該目錄下.
此刻axf下就會多出一個collectstatic的靜態(tài)資源文件目錄
更多可參考: http://python.usyiyi.cn/translate/django_182/ref/settings.html
訪問可能會出現(xiàn)403沒有權(quán)限的問題
找到nginx.conf文件的位置
將第一行的代碼進行修改
#user www-data;
user root;
或者將 www-data更改權(quán)限