大后端 http://www.kfnqmlhs.com 分享與精進 Mon, 09 Dec 2019 12:48:24 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.9.7 軟件項目管理(一)成本、產值及利潤計算 http://www.kfnqmlhs.com/2019/12/09/software-project-1/ http://www.kfnqmlhs.com/2019/12/09/software-project-1/#respond Mon, 09 Dec 2019 12:44:47 +0000 http://www.kfnqmlhs.com/?p=781 如何計算項目利潤?

首先一個項目一定是由多個不同角色的工程師協作完成的。

軟件項目的成本可以折算為各角色在項目中投入的工時 * 單位工時的人力價格。

軟件項目的利潤 = 軟件項目的銷售額 – 軟件項目的成本

舉一個例子, 一個新聞類客戶端軟件項目需要 項目經理、 產品經理、UI設計師、后端工程師、IOS 工程師、 安卓工程師、測試工程師,這些角色相互協作完成。項目總金額為 ¥200000 。

項目完成后, 統計各角色在此項目的投入的實際時間,如下表:

角色 時間投入(單位:小時)
項目經理 80
產品經理 40
UI設計師 40
后端工程師 160
IOS工程師 120
安卓工程師 120
測試工程師 80

根據上表統計各角色投入的時間總計 640 小時,每天如果按8小時算

640小時/8 = 80 天

假設公司人力的平均成本為 ¥1200 每天

那么:

項目利潤 = 200000 – (1200*80) / 96000 = ¥104000

成本 = 產值?

一個項目一定是可以分拆成一條條的任務然后分派給不同的人員去完成的,對每一項任務的完成需要花費時間的評估結果是這項任務的產值,每一項任務時間完成實際所花費的時間是這項任務的成本

在計算項目利潤時,要分清什么是產值, 什么是成本, 產值是員工工作創造的價值, 成本是員工為了創造價值投入的時間。

在實際研發過程中,我們經常犯的錯誤是把產值當成成本,例如一項任務評估為 2 人日完成, 那么在排期表中就以給執行人員 2 天去完成, 看似很合理, 實際上就是把產值當成了成本, 一項需要2天完成的任務, 有可能1天就完成了, 也可能是3天完成, 實際完成所花費的時間是成本,如果生成效率提高, 花費的時間就會減少,成本就會降低,如果成本總是總是等于產值, 那么沒有人會想著要提高生產效率了。

TIPS

為什么不用“工時”、“人日”這些單位來計算投入?而用“小時”、“天”這樣的單位?

“工時”、“人日”一般用于評估一項任務的一般完成時間,也就是產值,這里用 “小時”、“天”來計算成本,主要是為了區別于產值, 以免混淆。

轉載請注明:大后端 » 軟件項目管理(一)成本、產值及利潤計算

]]>
http://www.kfnqmlhs.com/2019/12/09/software-project-1/feed/ 0
用 webpack+vue+vue-router 搭建單頁應用 http://www.kfnqmlhs.com/2019/07/13/webpackvuevue-router/ http://www.kfnqmlhs.com/2019/07/13/webpackvuevue-router/#respond Sat, 13 Jul 2019 12:11:42 +0000 http://www.kfnqmlhs.com/?p=770 1. 初始化一個項目

創建一個項目

mkdir demo 

進入項目,并用 npm 初始化

npm init -y

這時會在 demo 目錄下生成一個文件 package.json

2. 安裝依賴包

安裝最新版vue

npm install --save vue

安裝webpack

npm install --save-dev webpack 

全局安裝 webpack-dev-server

npm i webpack-dev-server -g  

npm install 在安裝 npm 包時,有兩種命令參數可以把它們的信息寫入 package.json 文件,一個是npm install –save另一個是 npm install –save-dev,他們表面上的區別是–save 會把依賴包名稱添加到 package.json 文件 dependencies 鍵下,–save-dev 則添加到 package.json 文件 devDependencies 鍵下,
–save-dev 是你開發時候依賴的東西,–save 是你發布之后還依賴的東西。

安裝 babel

npm install --save-dev babel-core babel-loader@7 babel-preset-es2015

babel的作用是將es6的語法編譯成瀏覽器認識的語法es5

安裝用于解析vue 組件的 .vue 后綴文件的包

npm install --save-dev vue-loader@^14.2.2 vue-template-compile

安裝用于解析 css 的包

npm install --save-dev css-loader style-loader

css-loader 和 style-loader,二者處理的任務不同,css-loader使你能夠使用類似@import 和 url(…)的方法實現 require()的功能,style-loader將所有的計算后的樣式加入頁面中,二者組合在一起使你能夠把樣式表嵌入webpack打包后的JS文件中。

安裝用于打包文件和圖片的包

npm install --save-dev url-loader file-loader

安裝用于編譯sass 的包

npm install --save-dev sass-loader node-sass

安裝 vue-router 用于實現 多頁面組件切換

npm install --save-dev vue-router

3. 目錄結構設計

代碼結構如下:

vue-router 代碼結構

代碼結構說明:

  • dist文件是后面執行webpack指令生產的,不用管;
  • webpack.config.js 配置文件,本身也是一個標準的Commonjs規范的模塊;
  • routes.js文件放路由配置文件;
  • index.html首頁入口文件
  • App.vue是項目入口文件。
  • main.js這是項目的核心文件。全局的配置都在這個文件里面配置。
  • commponents目錄里面放了公共組件header文件。
  • views文件放詳情頁面;

3.1 webpack.config.js


var path = require('path') var webpack = require('webpack') module.exports = { mode: 'development', entry: './src/main.js',//值可以是字符串、數組或對象 output: { path: path.resolve(__dirname, './dist'),//Webpack結果存儲 publicPath: '/dist/',//懵懂,懵逼,//然而“publicPath”項則被許多Webpack的插件用于在生產模式和開發模式下下更新內嵌到css、html,img文件里的url值 filename: 'build.js' }, module: { rules: [ { test: /\.vue$/, loader: 'vue-loader' }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ }, { test: /\.(png|jpg|gif|svg)$/, loader: 'file-loader', options: { name: '[name].[ext]?[hash]' } } //自己加的 , { test: /\.css$/, loader: "style-loader!css-loader" } , { test: /\.scss$/, loader: "style-loader!css-loader!sass-loader!" } ] }, resolve: { alias: { 'vue$': 'vue/dist/vue.esm.js' } }, devServer: {//webpack-dev-server配置 historyApiFallback: true,//不跳轉 noInfo: true, inline: true//實時刷新 }, performance: { hints: false }, devtool: '#eval-source-map' }

說明:

  • test:一個匹配loaders所處理的文件的拓展名的正則表達式(必須) 。
  • loader:loader的名稱(必須) 。
  • include/exclude:手動添加必須處理的文件(文件夾)或屏蔽不需要處理的文件(文件夾)(可選)。

routes.js

import Vue from 'vue'

import Router from 'vue-router'

import indexPage from './components/header.vue'

import homePage from './views/home.vue'
import aboutPage from './views/about.vue'

Vue.use(Router)
const routes = [
        {
            path:'/',
            component: homePage
        },
        {
            path:'/about',
            component: aboutPage
        }
    ];

export default new Router({

    routes })


index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="appIndex">

        </div>
    <script src="./dist/build.js"></script>
    </body>
</html>

App.vue

<!--App.vue是項目入口文件。-->
<template>
    <div id="app">
        <header-tab></header-tab>
        <h2>{{msg}}</h2>
        <div class="nav-box">
            <p class="nav-list">
                <router-link class="nav-item" to="/">首頁</router-link>
                <router-link class="nav-item" to="/about">關于</router-link>
            </p>
        </div>
        <div>
            <router-view></router-view>
        </div>
    </div>
</template>

<script>
import HeaderTab from './components/header.vue';
export default {
  name: 'app',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  },
  components:{
    HeaderTab
  }
}
</script>

<style lang="scss">
    $redColor:#f00;
    h2{
        color:$redColor;
    }
    #app {
        text-align: center;
        color: #2c3e50;
        margin-top: 60px;
    }
    h1, h2 {
        font-weight: normal;
    }
    ul {
        list-style-type: none;
        padding: 0;
    }
    li {
        text-align: left;
        margin: 0 10px;
    }
    a {
        color: #42b983;
    }
</style>

main.js

//main.js這是項目的核心文件。全局的配置都在這個文件里面配置
import Vue from 'vue'
import App from './App.vue'
import router from './routes.js'

import './assets/styles/base.css'
//import './assets/sass/reset.sass'//報錯暫時不用sass
Vue.config.debug = true;//開啟錯誤提示

new Vue({
        router,
        el: '#appIndex',
        render: h => h(App)
})

header.vue

<template>
    <div>
        <h1>共同header</h1>
        <img src="../assets/images/logo.jpg">
    </div>
</template>
<style>
 @import '../assets/sass/reset.scss'
</style>

注意找一張圖片放到 images 目錄下,即logo.png

views 下面放各個詳情頁

about.vue

<template>
    <div>about</div>
</template>

home.vue

<template>
    <div>
        <ol>
            <li v-for="todo in todos">
                {{ todo.text }}
            </li>
        </ol>
        <button @click="eClick()">事件</button>
    </div>
</template>

<script>
export default {
  name: 'indexP',
  data () {
    return {
       todos: [
          { text: '首頁第一段文本' },
          { text: '首頁第二段文本' },
          { text: '首頁第三段文本' }
        ]
    }
  },
  methods:{
    eClick(){
      this.todos.push({'text':'首頁第...段文本'});
    }
  }
}
</script>
<style scoped>
    ol{width:200px;margin:20px auto;}
</style>

css 樣式

base.css

h1{
    color: #999;
}

reset.scss

$redColor:#f00;
h2{
    color:$redColor;
}

運行

執行webpack 進行編譯
webpack

圖片編譯結果

啟動測試服務:

webpack-dev-server

瀏覽器中訪問 http://localhost:8080/#/

瀏覽器打開后效果如下:

注意事項

1.所有的代碼在這里 https://github.com/shanhuhai/vue-router-demo

2.注意vue, babel 等包的版本號,下面是完整的 package.json

“`json
{
"name": "demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "webpack-dev-server –config webpack.config.dev.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"vue": "^2.6.10"
},
"devDependencies": {
"babel-core": "^6.26.3",
"babel-loader": "^7.1.5",
"babel-preset-es2015": "^6.24.1",
"css-loader": "^3.0.0",
"file-loader": "^4.0.0",
"node-sass": "^4.12.0",
"sass-loader": "^7.1.0",
"style-loader": "^0.23.1",
"url-loader": "^2.0.1",
"vue-loader": "^14.2.4",
"vue-router": "^3.0.7",
"vue-template-compiler": "^2.6.10",
"webpack": "^4.35.3",
"webpack-dev-server": "^3.7.2"
}
}

“`

轉載請注明:大后端 » 用 webpack+vue+vue-router 搭建單頁應用

]]>
http://www.kfnqmlhs.com/2019/07/13/webpackvuevue-router/feed/ 0
用 git rabase 修改提交歷史 http://www.kfnqmlhs.com/2018/10/18/git-rebase-change-commit-log/ http://www.kfnqmlhs.com/2018/10/18/git-rebase-change-commit-log/#respond Thu, 18 Oct 2018 09:53:32 +0000 http://www.kfnqmlhs.com/?p=764 比如要修改最近三次提交的作者、郵箱、提交時間等, 在代碼目錄下執行

git rebase -i HEAD~3

會顯示最近提交的三次記錄,注意順序是倒序的

例如顯示

pick 4cbce22 add 2.html
pick 01fffe5 add new line
pick 8e567b9 add line

# Rebase 67571e9..8e567b9 onto 67571e9 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

pick 4cbce22 add 2.html
pick 01fffe5 add new line
pick 8e567b9 add line

改為

edit 4cbce22 add 2.html
edit 01fffe5 add new line
edit 8e567b9 add line

pick 改為 edit 表示將編輯這幾條記錄, 修改后 :wq 保存退出

開始修改提交日志描述:

 git commit --amend  

或者使用如下命令可以同時修改作者、郵箱及日期:

 git commit --amend --author "baurine <2008.hbl@gmail.com>"  --date="$(date -R)"

修改完成,執行:

git rebase --continue

如果選擇了多條要編輯的記錄會進入下一條,使用同樣的方法修改提交記錄,

當所有要編輯的記錄都修改完后,將顯示 Successfully rebased and updated refs/heads/master., 修改就完成了。

轉載請注明:大后端 » 用 git rabase 修改提交歷史

]]>
http://www.kfnqmlhs.com/2018/10/18/git-rebase-change-commit-log/feed/ 0
Docker 快速入門(精編版) http://www.kfnqmlhs.com/2018/08/21/docker-kuai-su-ru-meng/ http://www.kfnqmlhs.com/2018/08/21/docker-kuai-su-ru-meng/#respond Tue, 21 Aug 2018 13:35:24 +0000 http://www.kfnqmlhs.com/?p=761 1.Docker 概述

Docker 是一個開源的容器引擎,它運行在物理主機或者通過 Vmware 、KVM 等虛擬化技術創建的虛擬機中。

一個容器可以簡單的理解為一組文件及容器啟動時將會運行的服務進程。

一個容器中的文件以及運行的程序,一旦提交為鏡像就固定了,不論在任何主機上運行該容器都是一致的。

開發者可以將應用打包到一個或多個容器中,從而能夠輕松在其他運行了docker 的主機運行該應用,這使得應用部署非常簡單,并且避免了因環境問題而導致的各種異常。

容器可以理解為是應用層的虛擬機, 但容器不等于虛擬機,
不知道虛擬機的同學看這里 虛擬機

2.Docker 的特點及用途

Docker 特點:

  • 輕量
    單機可以輕松支持上百個容器, 相比笨重的虛擬機好太多。
  • 快速啟動
    啟動一個容器只需要幾秒鐘。
  • 可移植性
    這幾乎是Docker 最重要的特點,讓運維部署變的簡單,不用再考慮各種系統環境服務缺失導致的應用問題。
  • 隔離性
    單機上容器間的資源是隔離的互不影響,對容器中文件的隨意刪改也不會影響宿主機,使得容器有很好的隔離性。

Docker 用途:

  • 快速部署
  • 持續集成(devops)
  • 提升開發效率
    不同的開發環境中,我們都想把兩件事做好。一是我們想讓開發環境盡量貼近生產環境,二是我們想快速搭建開發環境。
    理想狀態中,要達到第一個目標,我們需要將每一個服務都跑在獨立的虛擬機中以便監控生產環境中服務的運行狀態。然而,我們卻不想每次都需要網絡連接,每次重新編譯的時候遠程連接上去特別麻煩。這就是Docker做的特別好的地方,開發環境的機器通常內存比較小,之前使用虛擬的時候,我們經常需要為開發環境的機器加內存,而現在Docker可以輕易的讓幾十個服務在Docker中跑起來。
  • 單機應用隔離
    由于單機上容器之間有很好的隔離性,
  • 大規模應用集群
  • 多租戶環境

3.Docker 知識要點

容器

在Docker的使用過程中,創建一個容器就是創建一個實例

鏡像

鏡像的創建方式有兩種,一種是通過 docker commit 命令提交容器,一種是 Dockerfile 來創建, 沒有特殊情況下都應該用 Dockerfile 來創建鏡像

容器與鏡像的關系

一個鏡像就相當于面向對象中的類,容器就是一個實例化類后得到的一個對象,再通俗一點,容器和鏡像的關系可以想象成,月餅和月餅模子的關系,通過月餅模子可以制作無數個一樣的月餅。

容器與主機文件共享

docker run的命令中 提供了 -v 的參數來使得容器可以跟宿主機共享文件或目錄

容器與主機端口映射

docker run的命令中 提供了 -p 的參數來使得宿主機的某個端口可以映射到容器的端口上

4.上手演練

測試環境搭建

上手演練前,我們需要準備一個測試環境,先在本機的 VirtualBox 上創建了一個安裝了 Ubuntu 14.04 操作系統的虛擬機,命名為“test-server”

下面來安裝Docker

登錄虛機后按以下步驟操作:

  1. 切換到 root 權限
sudo su -
  1. 安裝并校驗源
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg |  apt-key add -
apt-key fingerprint 0EBFCD88
#將源信息直接寫入/etc/apt/sources.list
add-apt-repository \
   "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
#更新源
apt-get update
#安裝制定版本的docker
apt-get install docker-ce=17.06.2~ce-0~ubuntu 
#查看docker 版本
docker version
  1. 設置docker 加速鏡像
    由于在國內,我們使用拉取官方的鏡像源較慢,這里設置一個功能的加速鏡像源
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://8a2e319e.m.daocloud.io

第一個 Docker 容器

  • 下載一個 Ubuntu 系統的鏡像
docker search ubuntu
docker pull  ubuntu

  • 在容器中執行命令并返回結果(容器執行命令返回結果后自動刪除自身)

$ docker run --rm ubuntu echo "Hello World" $ docker run --rm ununtu ps
  • 進入到容器中與容器進行交互操作
$ docker run --rm -ti ubuntu /bin/bash
# uname -a
# dpkg -l
  • 常用命令

    docker search # 從 Docker 官方鏡像 hub.docker.com 倉庫搜索鏡像
    docker pull 拉取一個鏡像
    docker images 查看本地鏡像
    docker run 從鏡像實例化一個容器
    docker ps 查看所有在運行的容器
    docker build 從 Dockerfile 構建鏡像

  • docker start/stop/kill

    啟動/關閉/強制關閉容器

  • docker rm
    刪除容器
  • docker rmi
    刪除鏡像

創建一個自己的鏡像

  1. 在容器中安裝 nginx
docker run -ti ubuntu bash
apt-get update
apt-get install -y nginx
exit
docker ps -l
docker commit  nginx1.0

容器中執行 exit 則退出容器
docker ps -l 查看最近創建的容器

  1. 查看剛剛我們創建的鏡像 nginx 1.0
$ docker images

這時你可以將鏡像提交到本地倉庫,或者官方的 docker hub 倉庫

用docker 快速安裝nginx

在主機 root 用戶目錄創建 html目錄, 并創建index.html文件,內容為 Hello,world

mkdir /root/html
echo "Hello, world" > /root/html/index.html

安裝啟動nginx 容器:

docker run --name some-nginx -p 8080:80 -v /root/
html:/usr/share/nginx/html:ro -d nginx

對參數做下解釋:

  • --name 用來制定容器的名稱
  • -p 用來做端口映射,前面的 “8080” 是宿主機的端口號,“80” 是容器的端口號
  • -v 用來做目錄映射,將主機上的 “/root/html” 目錄映射到了容器中的 “/usr/share/nginx/html” ,這樣我們就不必進入到容器中來修改頁面了
  • -d 這個參數表示,容器在后臺運行

這時候如果你的虛機ip是 192.168.4.242, 通過瀏覽器訪問 http://192.168.1.105:8080/index.html 就可以訪問到我們剛剛創建的頁面了

5.docker 網絡

docker 的網絡大致分為五種類型, 在安裝docker 后宿主機上會創建三種網絡, 分別是 bridge, host, none網絡, 可以通過 docker network ls查看:

none 網絡

容器沒有網卡,所以容器也就無法聯網, 創建這類容器可以通過 --network=none 來指定

docker run -it --network=none busybox

可以看到容器只有一個回環網絡,沒有其他網卡了

host 網絡

host 模式相當于容器直接使用宿主機的網絡


docker run -it --network=host busybox

進入容器后執行ifconfig, 在對比在宿主機上執行 ifconfig, 發現執行完全一樣。

這種方式的好處是,網絡性能好,但是隔離性差,如果宿主機運行了多個容器,端口可能會沖突

bridge 網絡

容器啟動時默認的網絡模式,docker 安裝的時候會創建一個名為 “docker0”的網橋,啟動的容器在不指定“–network”容器時,都會默認掛到 “docker0”下

container 模式

創建容器時使用–network=這個模式在創建新的容器的時候指定容器的網絡和一個已經存在的容器共享一個Network Namespace,但是并不為docker容器進行任何網絡配置,這個docker容器沒有網卡、IP、路由等信息,需要手動的去為docker容器添加網卡、配置IP等。

轉載請注明:大后端 » Docker 快速入門(精編版)

]]>
http://www.kfnqmlhs.com/2018/08/21/docker-kuai-su-ru-meng/feed/ 0
Rancher之旅(二)—— 訪問控制設置 http://www.kfnqmlhs.com/2018/07/26/rancher-2-access/ http://www.kfnqmlhs.com/2018/07/26/rancher-2-access/#respond Thu, 26 Jul 2018 13:44:33 +0000 http://www.kfnqmlhs.com/?p=740 現在我們的 Rancher 后臺是誰都能進入的,也就是沒有訪問控制,誰都可以管理,這樣當然不靠譜,現在我們來設置下,讓有帳號的人才能進入后臺。

Rancher 有幾種訪問實現方式,介紹兩種大家熟悉的:

  1. 一個是 “Github” 這種方式就是用你的搭建的Rancher 應用到 Github 開放登錄平臺申請 Client_id 和 Client Secret 來登錄,相當于我們的網站用 QQ 來登錄,需要向QQ 申請密鑰
  2. 一個是“Local”,即本地驗證 ,這種方式就是一般的登錄方式,帳號存儲在 Rancher的數據庫中

我們就先用 “Local” 這種方式, 簡單一些。

1. 先點擊 系統管理-&gt; 訪問控制 進入訪問控制的設置界面:

然后點擊 “Local” 如下圖,進入設置界面
-w877?

2. 設置用戶名密碼

-w987?

這里就是設置管理員的帳號、昵稱、密碼,密碼設置完要記好,別忘了。

設置完成后,點“保存”, 現在顯示“本地驗證已啟用”

-w502?

3. 驗證是否成功

現在驗證下,訪問控制是否已生效。右上角從彈出的窗口中點擊“注銷”,就退出了當前的管理員帳號。

-w311?

現在就跳到了Rancher 的登錄驗證界面:

-w422?

用剛才我們設置的管理員帳號和密碼登錄試試吧。

4. 給別人開帳號

現在可以給別人開帳號了 ,進入后臺,點擊 系統管理-&gt;帳號設置, 點擊 添加帳號, 現在添加用戶有兩種角色,一種是“用戶”, 一種是“管理員”,“用戶” 沒有“系統管理”的權限,其他的跟管理員好像沒有區別。

轉載請注明:大后端 » Rancher之旅(二)—— 訪問控制設置

]]>
http://www.kfnqmlhs.com/2018/07/26/rancher-2-access/feed/ 0
Rancher之旅(一) ——Ubuntu kylin 4.0.2 部署 Rancher http://www.kfnqmlhs.com/2018/07/22/ubuntu-kylin-402-deploy-rancher-20/ http://www.kfnqmlhs.com/2018/07/22/ubuntu-kylin-402-deploy-rancher-20/#respond Sun, 22 Jul 2018 07:27:01 +0000 http://www.kfnqmlhs.com/?p=730 這次教程使用的是 Kylin-4.0.2-server-sp1-Community-20170412-x86_64.iso 操作系統。

1. 安裝好操作系統后,打開 Mate 終端軟件, 執行

sudo su - 切換到 root 權限。

2. 設置 Ubuntu的 docker 安裝源:

安裝 GPG key:

curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg |  apt-key add -

校驗 GPG key 是否安裝成功

apt-key fingerprint 0EBFCD88

顯示 :

?
表示安裝成功。

修改 apt 的源文件管理文件 :

/etc/apt/sources.list, 修改為

deb http://archive.kylinos.cn/yhkylin juniper main restricted universe multiverse
deb http://cz.archive.ubuntu.com/ubuntu trusty main
deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu trusty stable

保存后, 更新源:

apt-get update

3. 列出可用的 docker-ce 版本并安裝

apt-cache madison docker-ce

?

安裝指定版本的 docker:

apt-get install docker-ce=<VERSION>

安裝最新版本的 docker:

apt-get install docker-ce

4. 安裝 docker

根據 rancher 支持的docker 版本要求, 我們選擇安裝 “17.06.2~ce-0~ubuntu” 版本

執行:

apt-get install docker-ce=17.06.2~ce-0~ubuntu 

docker 就安裝好了, 然后啟動 docker:

systemctl start docker

檢查docker 安裝版本:

docker version

顯示:
?

表示安裝成功了。

5. 設置 docker 開機啟動

systemctl enable docker.service

6. 設置 docker 加速鏡像

打開 “/lib/systemd/system/docker.service”

修改 ExecStart/usr/bin/dockerd -H fd:// --registry-mirror=http://8a2e319e.m.daocloud.io

我使用了 daocloud.io 的加速鏡像, 速度還是可以的

7. 安裝啟動 rancher:

docker run -d --restart=unless-stopped -p 8080:8080 rancher/server:stable

?

OK, 華麗麗的安裝完了。

現在可以打開瀏覽器,瀏覽下 Rancher 的后臺有什么好玩的東西了。

我用的是 Virtualbox 虛機安裝的 Kylin os, 網絡方式使用的是橋接,所有在瀏覽器里,輸入我虛機的ip加端口 8080

“http://192.168.1.105:8080”

?

ok, 出現了。

8. 設置 Rancher

我稍微設置下,把這個后臺設置為中文的,發現右下角有可以選擇語言的下拉菜單。

?

9. 添加主機

我們添加一臺主機,先將 rancher server 所在的主機管理起來吧,
對于由于宿主機是 Ubuntu 的, 所以主機需要先做一些小設置:

編輯 /etc/NetworkManager/NetworkManager.conf 文件,用 # 注釋掉 dns=dnsmasq 配置

# dns=dnsmasq

然后執行

systemctl daemon-reload
systemctl restart network-manager
systemctl restart docker

點擊 “基礎架構-> 主機” ,點“添加主機”
復制并執行第 5 步的命令

sudo docker run --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.10 http://192.168.1.105:8080/v1/scripts/92F5CBEF0C5FB30FD585:1514678400000:bX9W8TYjrDEJAQudb85zapRAww

現在再回到主機界面,可以看到,本機已經被管理起來了:

?

好的,Rancher 的安裝就完成了,其余的功能,后面再慢慢探索。

轉載請注明:大后端 » Rancher之旅(一) ——Ubuntu kylin 4.0.2 部署 Rancher

]]>
http://www.kfnqmlhs.com/2018/07/22/ubuntu-kylin-402-deploy-rancher-20/feed/ 0
Nginx 用 Lua 控制 Fastcgi cache 緩存實現服務優雅降級 http://www.kfnqmlhs.com/2018/06/12/nginx-lua-fastcgi-cache/ http://www.kfnqmlhs.com/2018/06/12/nginx-lua-fastcgi-cache/#respond Tue, 12 Jun 2018 12:09:14 +0000 http://www.kfnqmlhs.com/?p=720 如果服務都是動態頁面沒有做靜態化,當某個頁面轉發很高,訪問量很大,可能會有很高的瞬時并發請求進到php-fpm 中,導致數據庫和 php-fpm 崩潰。

這種情況下要不就是加服務器提升并發,要不就是優化程序性能,但都是事后手段了。

這里我們提供一種彈性的可以根據用戶并發請求量來觸發的服務降級方式,請求正常時,緩存并部啟用,當并發請求量高時,Nginx 自帶的 Fastcgi cache 將被觸發啟用,將 php-fpm 返回的內容緩存,后續的請求如果是已經被緩存過的請求地址可以將緩存中的內容直接返回,避免了請求進入到 php-fpm 中導致 數據庫 和 php-fpm 崩潰。

下面是實現方式:

首先 nginx 要先安裝 lua 模塊: lua-nginx-module
或者你已經使用了 openresty 也可以

1.創建 nginx 緩存目錄

mkdir /tmp/ngx_cache

2.打開 nginx.conf

http 塊定義一個緩存塊,

log_format fs '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$upstream_cache_status"';
lua_shared_dict reqqs 10m;
lua_shared_dict cachemap 10m;
fastcgi_cache_path 
    /tmp/ngx_cache
    levels=1:2
    keys_zone=mcontent:1000m
    inactive=20m
    max_size=1g;

log_format 指令用于自定義一個nginx access log 的日志格式,方便我們統計Fastcgi cache的命中率等
lua_shared_dict 用于定義一塊共享內存字典,這個字典是在 nginx 的所有worker 都可以共享的, 這里定義了兩個共享內存字典,”reqqs” 用于計數單個請求在指定時間段內的請求次數, “cachemap” 用于標記哪些請求地址是要走緩存的

關于 fastcgi_cache_path 指令參考: Nginx 開啟Fastcgi 緩存

3. 在 Nginx 的配置中找到解析 php 腳本的 location 塊加入以下代碼 :

        set $cache_bypass "1";
        set_by_lua $use_cache '
           local function getextension(filename)
                return filename:match(".+%.(%w+)")
           end
           local function stripfilename(filename)
                return string.match(filename, "(.+)%??.*$")
           end

           local reqqs = ngx.shared.reqqs
           local cachemap = ngx.shared.cachemap
           local uri = stripfilename(ngx.var.request_uri)

           -- if request method is not "GET" then bypass
           if ngx.var.request_method ~= "GET" then
                return "1"
           end

           -- check request uri and extension
           local ext = getextension(uri)
           if ext ~= "html" and ext ~= "shtml" and ext ~= "htm" then
                return "1"
           end

           -- if in cache then use cache
           local cached = cachemap:get(uri)
           if cached then
               return "0"
           end

           -- requested 2 times in 1 sec then cache 3 min
           local num = reqqs:get(uri)
           if num then 
                if num &gt;= 2 then
                    cachemap:set(uri, 1, 180)
                    return "0"
                else
                    reqqs:incr(uri,1)
                    return "1"
                end
           else
                reqqs:set(uri,1,2)
                return "1"
           end
    ';

        fastcgi_cache mcontent;
        fastcgi_cache_valid 200 301 302 3m;
        fastcgi_cache_min_uses 1;
        fastcgi_cache_lock on;
        fastcgi_cache_lock_timeout 3s;
        fastcgi_cache_use_stale
            error
            timeout
            invalid_header
            updating
            http_500
            http_503;
        fastcgi_cache_key $request_method://$host$request_uri;
        fastcgi_cache_bypass $use_cache;
        fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
        add_header X-Cache-Status $upstream_cache_status;

        access_log /var/log/server/tengine/user.{{domain}}.fs.log fs;

以上腳本實現了所有以 htmlhtmshtml后綴結尾的請求,如果被1秒內請求了兩次,則啟用該請求的 fastcgi 緩存 3分鐘。

其中比較重要的參數有 fastcgi_cache_lock , 這個參數設為 “on”, 如果多個瞬時并發請求,如果緩存還沒有生成,則只有第一個請求會進到 php-fpm 中, 當緩存生成后其他請求再會被響應,這樣可以避免緩存失效時,并發請求將php-fpm 壓垮。

fastcgi_cache_bypass 用于決定請求是否要走 Fastcgi 緩存, 如果為非0的值則不走緩存。

向春哥的 openresty 致敬.

轉載請注明:大后端 » Nginx 用 Lua 控制 Fastcgi cache 緩存實現服務優雅降級

]]>
http://www.kfnqmlhs.com/2018/06/12/nginx-lua-fastcgi-cache/feed/ 0
Nginx 開啟 Fastcgi 緩存以及 rewrite 去掉請求參數Query string http://www.kfnqmlhs.com/2018/06/06/nginx-skills-fastcgi-cache-rewrite-querystring/ http://www.kfnqmlhs.com/2018/06/06/nginx-skills-fastcgi-cache-rewrite-querystring/#respond Wed, 06 Jun 2018 15:37:10 +0000 http://www.kfnqmlhs.com/?p=715 開啟 fastcgi 緩存

打開 nginx 的配置

首先要在 server{} 外定義緩存區塊

fastcgi_cache_path /data/cache levels=1:2 keys_zone=content:1000m inactive=20m;
fastcgi_cache_key $request_method://$host$request_uri;
fastcgi_cache_use_stale error timeout invalid_header http_500;

fastcgi_cache_path 用于定義一個緩存區塊, /data/cache 表示將緩存存儲在此目錄,
levels=1:2 表示在緩存目錄中創建2層目錄,第一層目錄名用1個字符,第二層目錄名用2個字符
keys_zone=content:1000m 表示將緩存區塊命名為”content”, 大小為 “1000MB”
inactive=20m 表示如果緩存在 20分鐘內沒有被訪問則刪除

fastcgi_cache_key 用于設置緩存的 Key 值,用一組變量拼接而成。
fastcgi_cache_use_stale 用于定義在哪些情況下使用過期的緩存

然后我們可以在動態請求 php 的 location 中, 添加 fastcgi cache的緩存配置

    location ~ .*\.php$ {
# --- 增加的 fastcgi cache
       fastcgi_cache content;
       fastcgi_cache_valid 200 302 5m;
       fastcgi_cache_valid 404 1d;
       fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
# --- fastcgi ended
        fastcgi_pass 127.0.0.1:9001;
        fastcgi_index index.php;
        include fastcgi.conf;
        access_log /var/log/server/tengine/user.jnnews.tv_access.fs.log fs;
    }

其中 fastcgi_cache 表示使用名稱為 “content” 的緩存塊(我們剛剛在 server 外定義的)

fastcgi_cache_valid 200 302 5m
fastcgi_cache_valid 404 1d;

表示將php-fpm響應為 “200” 和 “302” 的狀態碼緩存 5分鐘, 將 “404” 的狀態響應緩存 1天

fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

表示忽略php-fpm 響應中的 “Cache-Control“ “Expires” “Set-Cookie” 頭,如果沒有這個指令,開啟了 Session的 請求是不會被 fastcgi 緩存的

rewrite 請求去掉 Query String 查詢參數

參考以下示例配置,以下配置表示,如果首頁請求的 Query String 不為空則 Rewrite 到首頁,并去掉 Query string:

  location = / { 
        if ($query_string != "") {   
            rewrite ^/$ /? permanent;
        }   
        try_files $uri $uri/ /index.php?$query_string;
    }  

配置的關鍵點在 rewrite 到的目標地址后加了一個 “?” 就去掉了查詢參數,
例如現在訪問 “/?xxx” 將被 301 重定向到 “/”

轉載請注明:大后端 » Nginx 開啟 Fastcgi 緩存以及 rewrite 去掉請求參數Query string

]]>
http://www.kfnqmlhs.com/2018/06/06/nginx-skills-fastcgi-cache-rewrite-querystring/feed/ 0
Nginx 訪問日志分析工具 GoAccess 使用簡單教程 http://www.kfnqmlhs.com/2018/05/31/nginx-goaccess/ http://www.kfnqmlhs.com/2018/05/31/nginx-goaccess/#respond Thu, 31 May 2018 13:16:53 +0000 http://www.kfnqmlhs.com/?p=713 正常運行的網站如果發生崩潰,一般都是由于某些事件導致流量劇增,服務器無法承受導致的。這時候首先要通過 Nginx的訪問日志來確認下是那個請求接口流量過高,這時候就用到了 GoAccess。

GoAccess 是一款 Nginx 訪問日志分析工具,通過 GoAccess 分析 Nginx 訪問日志生成的報表可以幫助我們找到網站高峰的訪問時段,找到請求量最高的接口,從而著手進行優化處理。

安裝 GoAccess

下面就來講下如何使用 GoAccess,go access 安裝很簡單,
如果是 Mac os 可以直接通過 brew install goaccess安裝。
如果是 Centos 系統可以執行 yum -y install goaccess 安裝。
各系統下的安裝方法參考: GoAccess 下載安裝

使用 GoAccess

假如我已經從服務器拿到了一個 Nginx 訪問日志文件 access.log,

可以執行以下命令生成分析報表:

goaccess  -f  access.log -o  result.html
  • -f: 指定日志文件
  • -o: 指定報表路徑

執行此命令會默認讀取/usr/local/Cellar/goaccess/1.2/etc/goaccess.conf, Mac os 下默認文件在此路徑,其他操作系統各不相同,

執行以上命令默認一般會報錯:

Fatal error has occurred
Error occured at: src/parser.c - parse_log - 2705
No time format was found on your conf file.

提示沒有 time format, 即我們需要配置日志的時間格式,

打開默認的配置文件 goaccess.conf, 開啟這兩個配置:

time-format %H:%M:%S
date-format %d/%b/%Y

以上配置分別配置了 access.log 中請求時間所用的時間格式和日期格式。

修改保存后重新執行 goaccess -f access.log -o result.html, 用瀏覽器打開 result.html, 我們便得到了分析結果:

“Request Files” 顯示了請求地址的訪問量排名,一般都是訪問量最高的地址導致的系統崩潰:

goaccess 報表

“Time Distribution” 可以看到不同時間端的請求量分布:

goaccess 報表時間分布

如何根據時間切割日志?

另外如果想只分析 access log 中指定時段的訪問日志,可以將指定時段的日志單獨提取到一個文件中,再用 GoAccess 進行分析:

sed -n "/31\/May\/2018:09:00:00/,/31\/May\/2018:11:00:00/"p access.log > access1.log  

以上命令表示將 5.31 日 9點到 11 點的請求日志提取到 access1.log

轉載請注明:大后端 » Nginx 訪問日志分析工具 GoAccess 使用簡單教程

]]>
http://www.kfnqmlhs.com/2018/05/31/nginx-goaccess/feed/ 0
Laravel 項目加速指南 http://www.kfnqmlhs.com/2018/03/18/laravel-speed-up/ http://www.kfnqmlhs.com/2018/03/18/laravel-speed-up/#comments Sun, 18 Mar 2018 09:32:49 +0000 http://www.kfnqmlhs.com/?p=707 很多人都說用 Laravel 做開發很好但是性能太差,我曾經也一度這么認為,最近圍繞 composer 做一些行項目 ,研究了 composer 的自動加載機制,順便研究了下 Laravel 項目,發現,事實上 Laravel 并不慢,只不過還是我們沒有用好它罷了。

PHP 項目慢的幾個重要原因

首先想到的導致 PHP 項目慢的一個首要原因就是 IO 問題, 因為php是解釋型語言,所以每次請求都要讀取源代碼并進行語法解析,解決這個問題要從兩方面下手:

  • 一是將解析過的文件的結果都緩存起來,下次直接讀取,這方面目前已經有了非常成熟的方案,比如 Xcache, Opcache 等,選擇官方的 Opcache就好, 你會發現只要開了 Opcache 并且配置得當, 程序性能馬上提升 10 倍是不成問題的
  • 其次是減少文件不必要的文件引入,現在大家都用 composer 組織項目,往往會引入很多不必要的類庫,導致項目變的臃腫。

基本上解決了 IO 問題, PHP 項目性能就會有極大的提升, 因為大多數 PHP 項目都不是計算密集型項目,CPU并不會成為它的性能瓶頸。

針對 Laravel 項目的加速

以下內容在 php7.1.9 , Laravel 5.6 下測試通過。

開啟 Opcache

這一條對所有 PHP 項目都適用, 很人多說自己已經開啟了 Opcache, 事實上往往沒有,因為 Opache 是否已經開啟是肉眼不可見的, 所以可以使用如下命令確認:

php -r "var_dump(function_exists('opcache_get_status'));"

如果返回 bool(true) 則說明 Opacahe 已經安裝成功了

開啟Opcache 是最重要的一環。

composer 加速

事實上這條對所有使用 composer 項目都適用,就是執行 composer dump-autload -o, 它的主要作用是將通過 PSR0/PSR4 加載的文件轉化為 classmap 方式的加載,從而減少少IO次數
對于此命令的詳細說明請參考:
composer 自動加載優化

執行 Laravel 自帶的cache 命令

Laravel 提供了兩個預緩存命令:

php artisan config:cache 
php artisan route:cache 

執行這兩個命令可以將配置以及路由的解析結果緩存起來, 至于如何查看單個請求引入了哪些文件,可以參考文章結尾的附加內容。

如何查看某個請求加載了多少個文件

查看某個特定請求引入了哪些文件,有一個方法就是借助 opcache 的統計功能,
安裝此開源項目 https://github.com/rlerdorf/opcache-status

安裝后,首先將 php-fpm 重啟,保證 opcache 是空的,然后向目標地址發送一次請求
瀏覽器打開 opcache-status, 例如 : http://localhost/opcache-status/opcache.php
可以看到,此次請求在 opcache 中緩存了多少個文件就是本次請求引入了哪些文件

結尾

結論,Laravel 項目優化主要還是兩點:一是開啟opcache, 二是減少文件引入, 減少文件引入的方法這里提供的可能并不全面,可以自己去研究,我的研究發現,當Laravel 某個接口 的引入文件達到 26 時,并發量可以達到 6k 左右。

轉載請注明:大后端 » Laravel 項目加速指南

]]>
http://www.kfnqmlhs.com/2018/03/18/laravel-speed-up/feed/ 2
春梓美 种子,av全裸挂历,日本女护士mm裸照写真,超碰地址发布页 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>