項目部署html
http://blog.51cto.com/ljmict前端
項目部署流程:python
買服務器, 服務器租用mysql
選擇操做系統的版本,安裝系統nginx
在開發環境中把項目須要的pip包寫到一個文件 pip freeze . requirementsweb
.txtredis
把項目上傳到服務器sql
部署項目, 安裝須要的環境docker
服務器shell
nginx
mysql
redis
uwsgi
celery
docker
網站流量參考
網站流量度量
pv:獨立訪客
ip:獨立ip
uv:獨立訪客
併發:
每秒響應的最大鏈接數
web服務器每秒可以接受的用戶鏈接數
web服務器每秒能接受最大用戶鏈接數
web服務器單位時間可以處理的最大鏈接數
技術棧 Nginx+uwsgi+celery+supervisor
本教程 實現了負載均衡、反向代理、動靜分離,還實現了根據客戶端設備user-agent進行轉發,也就是移動端和PC端訪問的頁面不同。
服務器:6臺VM
操做系統:CentOS7
LB、www、wap:安裝Nginx
uwsgi一、uwsgi2:安裝nfs-utils、Python3解釋器、virtualenv
NFS:安裝NFS
MRCS:安裝MySQL、Redis、virtualenv
鏡像下載地址 http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1804.iso
進入目錄
cd /etc/sysconfig/network-scripts/
輸入ls查看文件列表, 找到網卡配置文件,以下圖,我虛擬機的網卡名稱爲ens33
編輯
vi
按i進入編輯模式, 編輯ifcfg-ens33文件的最後一行,將ONBOOT=no改成ONBOOT=yes,
按esc退出編輯模式, 輸入:wq保存退出
重啓network:
$ server network restart
pingi下百度能不能ping通
$ ping www.baidu.com
若是能ping通, 說明網絡已經能夠鏈接了
全新安裝centos的時候,運行ifconfig準備查看服務器IP的時候, 發現會報錯
-bash:command not found
網上搜了下, 緣由多是最小化安裝centos等Linux發行版的時候會默認不安裝ifconfig等命令
解決的辦法: yum安裝ifconfig這個包
首先搜索下
$ yum search ifconfig
發現ifconfig所屬的命令包是net-tools.x86_64
安裝
$ yum install net-tools.x86_64
中途會詢問「Is this os [y/d/n]」,按y回車,Complete完成安裝。
安裝完以後就能夠輸入ifconfig查看網卡信息了
遠程鏈接centos服務器的時候, 發現有些字符會亂碼
在網上搜了下, 發現是默認語言設置的問題. 輸入echo $LANG
和locale
查詢, 結果以下
修改默認語言, 編輯配置文件
$ vi /etc/locale.conf
添加下面字段, wq保存
LANG=」zh_CN.UTF-8」
應用配置文件, 使其生效
$ source /etc/locale.conf
問題解決
# 更換YUM源,centos默認源是國外的網站,下載會比較慢 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum makecache # 安裝編譯環境,若是安裝過了,就不須要再安裝了 yum -y install gcc*
# 查詢pcre庫是否安裝 rpm -qa|grep pcre yum -y install pcre pcre-devel # 安裝完以後查詢一下是否安裝成功,若是可以看到pcre和pcre-devel包就能夠了 rpm -qa|grep pcre
# 建立一個software/目錄用來放軟件包 mkdir -p /opt/software # 建立安裝目錄 mkdir -p /application/nginx-1.14.0 # 下載nginx安裝包 cd /opt/software wget -q http://nginx.org/download/nginx-1.14.0.tar.gz # 建立一個nginx用戶 useradd nginx -s /sbin/nologin -M //建立一個nginx用戶 # 解壓 tar xvf nginx-1.14.0.tar.gz cd nginx-1.14.0 # 安裝 ./configure --user=nginx --group=nginx --prefix=/application/nginx-1.14.0 --with-http_stub_status_module --with-http_ssl_module # 若是安裝報./configure: error: SSL modules require the OpenSSL library 須要安裝openssl-devel,安裝完以後再執行一下上一條命令 yum -y install openssl-devel make && make install # 建立軟連接是爲了之後若是要升級,應用程序中若是有引用Nginx路徑,不須要作任何更改,訪問的仍是原來的路徑/application/nginx ln -s /application/nginx-1.14.0/ /application/nginx # 查看連接狀態 ls -l /application/nginx
注意:編譯安裝Nginx軟件時,還可使用./configure --help
查看相關參數幫助
# 啓動nginx服務 /application/nginx/sbin/nginx netstat -lntup|grep 80
發現並無成功,緣由是被centos防火牆攔截了, 這個時候, 咱們須要關閉防火牆
CentOS7版本後防火牆默認使用firewalld,所以在CentOS7中關閉防火牆使用如下命令,
# 臨時關閉 $ systemctl stop firewalld # 禁止開機啓動 $ systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.123456
固然,若是安裝了iptables-service,也可使用下面的命令,
$ yum install -y iptables-services # 關閉防火牆 $ service iptables stop Redirecting to /bin/systemctl stop iptables.service # 檢查防火牆狀態 $ service iptables status Redirecting to /bin/systemctl status iptables.service iptables.service - IPv4 firewall with iptables Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled) Active: inactive (dead)
從新訪問就能成功訪問了
0.準備工做
在以前安裝好的服務器克隆一個副本
先把CentOS關機, 而後如圖所示, 建立完整的克隆, 克隆一個副本
安裝NFS服務,須要安裝nfs-utils和rpcbind,NFS的RPC服務,在Centos5.X下名稱爲portmap,在Centos6.X下名稱爲rcpbind。
1.查詢nfs服務和rpc服務是否安裝
[root@localhost ~]# rpm -qa|grep nfs [root@localhost ~]# rpm -qa|grep rpcbind
2.使用YUM安裝nfs和rpcbind
[root@localhost ~]# yum install -y nfs-utils
3.啓動nfs服務,在啓動nfs服務以前,必定要先啓動rpcbind,而後再啓動nfs
[root@localhost ~]# service rpcbind start Redirecting to /bin/systemctl start rpcbind.service
查看rpc信息
[root@localhost ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper
[root@localhost ~]# service nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ] Starting RPC idmapd: [ OK ]
啓動nfs服務之後,再查看rpcinfo信息。
[root@localhost ~]# rpcinfo -p program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100011 1 udp 875 rquotad 100011 2 udp 875 rquotad 100011 1 tcp 875 rquotad 100011 2 tcp 875 rquotad 100005 1 udp 35606 mountd 100005 1 tcp 38238 mountd 100005 2 udp 33761 mountd 100005 2 tcp 41083 mountd 100005 3 udp 47608 mountd 100005 3 tcp 35056 mountd 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 2 tcp 2049 nfs_acl 100227 3 tcp 2049 nfs_acl 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 2 udp 2049 nfs_acl 100227 3 udp 2049 nfs_acl 100021 1 udp 34627 nlockmgr 100021 3 udp 34627 nlockmgr 100021 4 udp 34627 nlockmgr 100021 1 tcp 46375 nlockmgr 100021 3 tcp 46375 nlockmgr 100021 4 tcp 46375 nlockmgr
4.配置共享目錄/share,容許192.168.25.*訪問
[root@localhost ~]# mkdir /share //建立共享目錄 [root@localhost ~]# ll -d /share/ //查看目錄信息 drwxr-xr-x. 2 root root 4096 Dec 30 13:55 /share/ [root@localhost ~]# chown -R nfsnobody:nfsnobody /share/ //更改目錄所屬用戶和所屬組 [root@localhost ~]# ll -d /share/ drwxr-xr-x. 2 nfsnobody nfsnobody 4096 Dec 30 13:55 /share/ [root@localhost ~]# vi /etc/exports /share 192.168.25.*(rw,sync) # 添加此字段 wq保存 ///share 192.168.25.* 本機IP網段
5.查看NFS共享目錄信息
[root@localhost ~]# showmount -e 192.168.25.231 //本機IP Export list for 192.168.25.231: /share 192.168.25.*
6.NFS客戶端掛載共享目錄/share
[root@localhost ~]# mount -t nfs 192.168.25.231:/share /mnt [root@localhost ~]# df -h 文件系統 容量 已用 可用 已用% 掛載點 /dev/mapper/centos-root 17G 1.8G 16G 11% / devtmpfs 476M 0 476M 0% /dev tmpfs 488M 0 488M 0% /dev/shm tmpfs 488M 7.9M 480M 2% /run tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 1014M 130M 885M 13% /boot tmpfs 98M 0 98M 0% /run/user/0 192.168.25.231:/share 17G 1.8G 16G 11% /mnt
7.NFS客戶端排錯思路
試客戶端與服務端網絡是否能否,如在客戶端使用ping IP地址
在服務端本身掛載看看是否可以正常掛載
檢查服務端防火牆規則,初學者能夠選擇直接關閉防火牆
8.管理NFS共享目錄
exportfs命令能夠導出NFS服務器上的共享目錄、顯示共享目錄,或者不導出共享目錄。
命令語法:
exportfs [選項][目錄]
選項 | 含義 |
---|---|
-a | 導出或不導出全部的目錄 |
-v | 顯示導出列表的同時,也顯示導出選項的列表 |
-u | 不導出指定的目錄。當和-a選項一塊兒時,不導出全部的目錄 |
-f | 指定一個新的導出文件,而不是/etc/exports文件 |
-r | 從新導出全部的目錄 |
-o <選項> | 指定導出選項列表 |
查看NFS共享目錄信息
showmount [選項][NFS服務器]
選項 | 含義 |
---|---|
-a | 同時顯示客戶端的主機名或IP地址以及所掛載的目錄 |
-e | 顯示NFS服務器的導出列表 |
-d | 只顯示已經被掛載的NFS共享目錄信息 |
9.NFS配置文件權限參數說明
參數名稱 | 參數用途 |
---|---|
rw | 共享目錄具備讀寫權限 |
ro | 共享目錄具備只讀權限 |
sync | 請求或寫入數據時,數據同步寫入到NFS Server硬盤中。數據安全不會丟,缺點,性能比不啓用該參數要差。 |
async | 請求或寫入數據時,先返回請求,再將數據寫入到內存緩存和硬盤中,即異步寫入數據。此參數能夠提高NFS性能,可是會下降數據的安全。所以,通常狀況下建議不用,若是NFS處於瓶頸狀態,而且容許數據丟失的話能夠打開此參數提高NFS性能。寫入時數據會先到內存緩衝區,等硬盤有空檔再寫入磁盤,這樣能夠提高寫入效率!風險爲若服務器宕機或不正常關機,會損失緩衝區未寫入硬盤的數據(解決辦法:服務器主板電池或加UPS不間斷電源)! |
root_squash | root用戶的全部請求映射成如nfsnobody(匿名)用戶同樣的權限 |
no_root_squash | 關閉root_squash |
all_squash | 映射全部的UID和GID爲匿名用戶 |
no_all_squash | 保留共享文件的UID和GID(默認) |
anonuid | 指定NFS服務器/etc/passwd文件中匿名用戶的UID |
anongid | 指定NFS服務器/etc/passwd文件中匿名用戶的GID |
secure | NFS經過1024如下的安全TCP/IP端口發送 |
insecure | NFS經過1024以上的端口發送 |
wdelay | 若是多個用戶要寫入NFS目錄,則歸組寫入(默認) |
no_wdelay | 若是多個用戶要寫入NFS目錄,則當即寫入,當使用async時,不須要設置 |
subtree_check | 若是共享/usr/bin之類的子目錄時,強制NFS檢查父目錄的權限 |
no_subtree_check | 和subtree_check相對,不檢查父目錄權限 |
hide | 在NFS共享目錄中不共享其子目錄 |
nohide | 共享NFS目錄的子目錄 |
mp | 若是它已經成功掛載,那麼使得它只導出一個目錄 |
fsid | NFS須要可以識別每一個它導出的文件系統。一般狀況下它會爲文件系統使用一個UUID,或者該設備保持文件系統的設備號 |
在LB(負載均衡)服務器上面配置
(就是第一個建立的那個服務器)
編輯nginx.conf
vi /application/nginx/conf/nginx.conf
文件更改成
若是要寫註釋, 中文亂碼的話, 能夠臨時配爲utf8編碼. 在vim的命令模式下輸入
:set encoding=utf8
, 就能夠輸入中文了建議下載下來使用vscode裝nginx插件進行編輯會比較方便
# 配置文件內容 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 靜態請求服務器池 upstream static_pools { server 192.168.25.150:80 weight=1; } # 動態請求服務器池 upstream dynamic_pool { server 192.168.25.151:8001 weight=1; server 192.168.25.152:8001 weight=1; } # 移動端服務器池 upstream mobile_pools { server 192.168.25.160:80 weight=1; } # 後端api服務器 server { listen 8080; server_name api.meiduo.site; location / { include uwsgi_params; uwsgi_pass dynamic_pool; } access_log off; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } # 提供前端頁面訪問 server { listen 80; server_name www.meiduo.site; # 若是訪問url爲:http://www.meiduo.site/xadmin就交給meiduo池 location /xadmin{ include uwsgi_params; uwsgi_pass dynamic_pool; } # 若是請求url爲:http://www.meiduo.site/cheditor就交給meiduo池 location /cheditor{ include uwsgi_params; uwsgi_pass dynamic_pool; } # 請求uri以/開頭就交給這個location區塊進行處理,例如:/static location / { # 若是客戶端設備user_agent爲iphone,就交給iphone_pools池 if ($http_user_agent ~* "iphone") { proxy_pass http://mobile_pools; } # PC端訪問就交給static_pools池處理 proxy_pass http://static_pools; } access_log off; } }
啓動nginx服務
/application/nginx/sbin/nginx
mkdir /project # 配置掛載目錄 cat /etc/exports # 配置內容 /share 192.168.25.*(rw,sync) # 重啓NFS服務 systemctl restart rpcbind systemctl restart nfs
配置完成以後把項目上傳到/project目錄裏面
在uwsgi1和uwsig2服務器上操做:
# 建立虛擬環境 mkvirtualenv -p python3 meiduo # 切換到meiduo虛擬環境 workon mediuo # 安裝uwsgi包 pip install uwsgi mkdir /project # 掛載NFS服務器/project目錄到uwsgi服務器的/project mount -t nfs 172.16.1.14:/project /project # 查看當前服務器掛載狀況 df -h # 輸出 文件系統 容量 已用 可用 已用% 掛載點 /dev/mapper/centos-root 36G 2.4G 33G 7% / devtmpfs 226M 0 226M 0% /dev tmpfs 237M 0 237M 0% /dev/shm tmpfs 237M 8.8M 228M 4% /run tmpfs 237M 0 237M 0% /sys/fs/cgroup /dev/sda1 1014M 143M 872M 15% /boot tmpfs 48M 0 48M 0% /run/user/0 172.16.1.14:/project 17G 1.8G 16G 11% /project # 安裝項目中用到的pip包 cd /project/meiduo/meiduo_mall pip install -r requirements.txt # 這個文件是在開發環境中經過pip freeze >requirements.txt生成的 cd /root # 建立uwsgi.ini文件 touch uwsgi.ini
uwsgi1配置
[uwsgi] #使用nginx鏈接時使用,Django程序所在服務器地址 socket=172.16.1.11:8001 #直接作web服務器使用,Django程序所在服務器地址 #http=172.16.1.11:8000 #項目目錄 chdir=/project/meiduo/meiduo_mall #項目中wsgi.py文件的目錄,相對於項目目錄 wsgi-file=meiduo_mall/wsgi.py # 進程數 processes=4 # 線程數 threads=2 # uwsgi服務器的角色 master=True # 存放進程編號的文件 pidfile=uwsgi.pid # 日誌文件,由於uwsgi能夠脫離終端在後臺運行,日誌看不見。咱們之前的runserver是依賴終端的 daemonize=uwsgi.log # 指定依賴的虛擬環境 virtualenv=/root/.virtualenvs/meiduo
uwsgi2配置
[uwsgi] #使用nginx鏈接時使用,Django程序所在服務器地址 socket=172.16.1.12:8001 #直接作web服務器使用,Django程序所在服務器地址 #http=172.16.1.12:8000 #項目目錄 chdir=/project/meiduo/meiduo_mall #項目中wsgi.py文件的目錄,相對於項目目錄 wsgi-file=meiduo_mall/wsgi.py # 進程數 processes=4 # 線程數 threads=2 # uwsgi服務器的角色 master=True # 存放進程編號的文件 pidfile=uwsgi.pid # 日誌文件,由於uwsgi能夠脫離終端在後臺運行,日誌看不見。咱們之前的runserver是依賴終端的 daemonize=uwsgi.log # 指定依賴的虛擬環境 virtualenv=/root/.virtualenvs/meiduo
uwsgi啓動命令
# 啓動uwsgi服務器 uwsgi --ini uwsgi.ini # 中止uwsgi服務器 uwsgi stop uwsgi.ini
處理PC端靜態文件請求
cat nginx.conf # 配置文件 worker_processes 1; events { worker_connections 1024; } 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"'; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.meiduo.site; location / { root html/front_end_pc; # 相對路徑,把前端文件夾放到Nginx安裝路徑下html目錄下,我這裏的路徑是/application/nginx/html index index.html index.htm; } access_log logs/access_www.log main; } }
啓動nginx服務
/application/nginx/sbin/nginx
處理移動端靜態文件請求
cd /application/nginx/html # 由於沒有移動端前端頁面,因此這裏簡單建立了一個測試頁面 mkdir wap echo "mobile_page" > wap/index.html
Nginx配置
cat nginx.conf worker_processes 1; events { worker_connections 1024; } 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"'; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.meiduo.site; location / { root html/wap; # 相對路徑,把前端文件夾放到Nginx安裝路徑下html目錄下,我這裏的路徑是/application/nginx/html index index.html index.htm; } access_log logs/access_www.log main; } }
啓動nginx服務
/application/nginx/sbin/nginx
mkdir /project # 掛載NFS服務器/project目錄到uwsgi服務器的/project mount -t nfs 172.16.1.14:/project /project # 查看當前服務器掛載狀況 df -h # 輸出 文件系統 容量 已用 可用 已用% 掛載點 /dev/mapper/centos-root 36G 2.4G 33G 7% / devtmpfs 226M 0 226M 0% /dev tmpfs 237M 0 237M 0% /dev/shm tmpfs 237M 8.8M 228M 4% /run tmpfs 237M 0 237M 0% /sys/fs/cgroup /dev/sda1 1014M 143M 872M 15% /boot tmpfs 48M 0 48M 0% /run/user/0 172.16.1.14:/project 17G 1.8G 16G 11% /project # 建立虛擬環境 mkvirtualenv -p python3 meiduo # 切換到meiduo虛擬環境 workon mediuo # 安裝項目中用到的pip包 cd /project/meiduo/meiduo_mall pip install -r requirements.txt # 這個文件是在開發環境中經過pip freeze >requirements.txt生成的
配置supervisor
mkvirtualenv -p python2 supervisor # 這裏建立python2的虛擬環境,由於supervisor不支持python3 workon supervisor pip install supervisor # 生成supervisor配置文件 echo_supervisord_conf > /etc/supervisord.conf # 建立日誌目錄 mkdir /var/log/celery
建立celery.ini文件
cat /etc/celery.ini # 配置內容 [program:celery] # celery命令的絕對路徑 command=/root/.virtualenvs/meiduo/bin/celery -A celery_tasks.main worker -l info # 項目路徑 directory=/project/meiduo/meiduo_mall # 日誌文件路徑 stdout_logfile=/var/log/celery/celery.log # 自動重啓 autorestart=true # 若是設置爲true,進程則會把標準錯誤輸出到supervisord後臺的標準輸出文件描述符 redirect_stderr=true
修改/etc/supervisord.conf文件
[include] files = celery.ini
supervisor命令
# 以守護進程的形式運行一組應用程序。 supervisord # 更新新的配置到supervisord supervisorctl update # 查看正在守護的進程 supervisorctl
在hosts文件裏面添加本地解析
windows系統hosts文件路徑:系統盤\windows\system32\drivers\etc
Linux系統和MAC系統hosts文件路徑:/etc/hosts
172.16.1.10 www.meiduo.site api.meiduo.site
PC端訪問效果