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哈希方式,根據用戶的來源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項目
# 以往的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
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