本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或從新修改使用,但須要註明來源。 署名 4.0 國際 (CC BY 4.0)php
本文做者: 蘇洋html
建立時間: 2019年08月23日 統計字數: 5748字 閱讀時間: 12分鐘閱讀 本文連接: soulteary.com/2019/08/23/…nginx
最近在完善一個基於 Composer 管理的開源軟件:Flarum 。git
Flarum 是一款能夠說是徹底基於插件構成的社區系統,在須要對其頻繁修改更新的開發過程當中,咱們須要頻繁修改 composer
配置文件,在不斷 composer install
的狀況下,較慢的依賴下載會嚴重影響開發調試效率。github
你可能會說,使用有良好網絡質量的服務器進行初始化、或者使用企業商業網絡高速網絡通道、或者阿里雲之類的公網鏡像不就行了。然而這樣作也僅僅只能保障分鐘級別的部署安裝。而且很是不利於多人多環境部署調試。web
本文將試着提出一個更簡單的解決方案,來解決這個問題。redis
提升安裝效率的手段其實並很少:docker
考慮購買成本、開發、維護成本,一上來就購置頂級的專線、優化改進構建腳本使用緩存、將程序徹底打包成鏡像是不合理的,由於除了帶來鉅額成本外,還會帶來一些意想不到的問題:緩存內容狀態是否「健康」、緩存文件一致性如何保障、代碼資源類容器的後續管理?編程
因此「替換訪問速度比較慢的資源」無疑是低成本改善問題的不二之選。簡單的使用公網資源,流量幾經流轉時間花費的比較多,內容穩定性也很差保障,故搭建私有鏡像是一個比較好的解決方案。json
下面就來說講私有鏡像的搭建。
使用鏡像以前,composer 會從各類來源安裝軟件包,好比 GitHub、SVN、GitLab、Zip、tarball… 下載軟件包時的網絡訪問質量是一個很難保障的事情,尤爲是當咱們須要同時訪問不一樣服務商分佈在天南海北的服務器的時候。
這個過程每每會持續幾分鐘甚至十幾分鍾,有的時候還會更多。最難過的是,若是咱們須要屢次部署安裝,或者在新的服務器上進行安裝時,這個時間損耗會不斷放大,並且還不可以保障多臺服務器安裝結果一致,由於不肯定軟件包是否被完整下載。
而若是咱們使用一個鏡像服務將上述從各類地方獲取的軟件包提早獲取,部署在距離咱們須要安裝軟件包比較近的服務器上,時間損耗將能夠有效控制在分鐘級別之內,好比十幾秒~幾十秒。
國內國外有很多開發者提供了 composer 的鏡像工具,本文將使用官方出品的工具:satis 。
相比較國內外其餘社區/團隊出品的工具,這個工具更加的小巧,配合 CI 使用也很是簡單,只須要修改 json 文件就可以完成軟件包的管理。
搭配 Nginx 使用能夠實現高性能的私有包倉庫。
compose 配置以下:
version: '3'
services:
# 官方沒有打 TAG,用 latest
# https://hub.docker.com/r/composer/satis/tags
composer:
image: composer/satis:latest
command: -vvv build /satis.json /wwwroot
links:
- nginx:nginx
networks:
- traefik
volumes:
- ./wwwroot:/wwwroot
- ./composer:/composer
- ./satis.json:/satis.json:ro
depends_on:
- nginx
# repo web server
nginx:
image: nginx:1.15.10-alpine
restart: always
networks:
- traefik
expose:
- 80
volumes:
- ./wwwroot:/var/www/html:ro
- ./conf:/etc/nginx/conf.d:ro
- ./logs:/var/log/nginx
labels:
- "traefik.enable=true"
- "traefik.frontend.rule=Host:composer.lab.com"
- "traefik.frontend.entryPoints=http,https"
healthcheck:
test: ["CMD-SHELL", "wget -q --spider --proxy off http://localhost || exit 1"]
interval: 5s
retries: 12
networks:
traefik:
external: true
複製代碼
能夠看到我仍是一如既往的選擇了 Traefik 做爲了服務網關,提供證書掛載和服務發現,若是你還不瞭解 Traefik,能夠查看歷史文章。
固然,若是你不但願使用 Traefik ,上面的配置中的 nginx 部分能夠修改成下面這樣(安裝軟件包時使用訪問地址也要酌情修改哦):
# repo web server
nginx:
image: nginx:1.15.10-alpine
restart: always
networks:
- traefik
ports:
- 80:80
volumes:
- ./wwwroot:/var/www/html:ro
- ./conf:/etc/nginx/conf.d:ro
- ./logs:/var/log/nginx
複製代碼
上面配置中的 nginx.conf
配置,能夠寫的佛系一些,由於原本它也就只須要提供 Web 服務而已:
server {
listen 80;
root /var/www/html;
index index.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location /favicon.ico {
access_log off;
}
}
複製代碼
最後,參考下面的 satis.json
文件的內容,修改其中的 「url」 和 require
字段中的軟件包,生成屬於你的配置文件。
{
"name": "repo/dev",
"homepage": "https://composer.lab.com",
"repositories": [
{
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
}
],
"archive": {
"directory": "dist",
"format": "tar",
"prefix-url": "https://composer.lab.com",
"skip-dev": true
},
"require": {
"php": ">=7.1",
"flarum/approval": "^0.1.0",
"flarum/auth-facebook": "^0.1.0",
"flarum/auth-github": "^0.1.0",
"flarum/auth-twitter": "^0.1.0",
"flarum/tags": "^0.1.0",
"flarum/core": "^0.1.0-beta.9",
"predis/predis": "^1.1",
"league/oauth2-client": "^2.4.1",
"ramsey/uuid": "^3.5.2",
"league/flysystem": "^1.0.32"
},
"require-dependencies": true,
"require-dev-dependencies": true
}
複製代碼
接着使用 docker-compose up
啓動服務,等待軟件包被緩存完畢就能夠正式使用了。
若是你的請求量很高,可使用 docker-compose scale nginx=4
水平擴展幾個實例,達到極高性能的需求:
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting runner-prod-composer_nginx_1 ... done
Creating runner-prod-composer_nginx_2 ... done
...
複製代碼
若是你不知足只鏡像你的項目依賴的包,但願進行全網全量軟件包鏡像,能夠刪除配置文件中的 require
字段。
{
"name": "repo/dev",
"homepage": "https://composer.lab.com",
"repositories": [
{
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
}
],
"archive": {
"directory": "dist",
"format": "tar",
"prefix-url": "https://composer.lab.com",
"skip-dev": true
},
"require-dependencies": true,
"require-dev-dependencies": true
}
複製代碼
使用 docker-compose up
啓動服務,第一次啓動時間會長一些,畢竟要從天南海北將軟件包進行下載,若是一切順利的話,你將看到相似下面的日誌:
Creating runner-composer_nginx_1 ... done
Creating runner-composer_composer_1 ... done
Attaching to prod-composer_nginx_1, prod-composer_composer_1
composer_1 | Scanning packages
composer_1 | The php >=7.1 requirement did not match any package
composer_1 | Creating local downloads in '/wwwroot/dist'
composer_1 | Dumping package 'phpdocumentor/reflection-docblock' in version '2.0.0'.
...
...
composer_1 | - Installing phpdocumentor/reflection-docblock (4.3.1): Downloading (100%)
composer_1 | Dumping package 'phpunit/phpunit' in version '4.8.36'.
composer_1 | Dumping package 'sebastian/recursion-context' in version '1.0.0'.
composer_1 | Dumping package 'doctrine/instantiator' in version '1.2.0'.
composer_1 | - Installing doctrine/instantiator (1.2.0): Downloading (100%)
composer_1 | Dumping package 'phpdocumentor/reflection-docblock' in version '2.0.5'.
composer_1 | wrote packages to /wwwroot/include/all$20dc965137ca8bd578a65dbc0eb7138e6dfed6bc.json
composer_1 | Writing packages.json
composer_1 | Pruning include directories
composer_1 | Writing web view
prod-composer_composer_1 exited with code 0
複製代碼
固然,若是你使用的是全量軟件包鏡像模式,日誌會相似下面這樣:
Creating prod-composer_nginx_1 ... done
Creating prod-composer_composer_1 ... done
Attaching to prod-composer_nginx_1, prod-composer_composer_1
composer_1 | No explicit requires defined, enabling require-all
composer_1 | Scanning packages
...
...
prod-composer_composer_1 exited with code 0
複製代碼
一旦看到 exited with code 0
,就說明軟件包鏡像完成,能夠正式使用了。
若是你已經按照上文進行的配置,訪問你定義的私有鏡像倉庫地址:https://composer.lab.com
,你會看到相似下面的界面。
實際使用起來,仍是很簡單的,只須要在項目的 composer.json
的 repositories
字段中添加:
{
...
"repositories": [
{
"type": "composer",
"url": "https://composer.lab.com",
"options": {
"ssl": {
"verify_peer": false,
"verify_peer_name": false,
"allow_self_signed": true
}
}
},
{
"packagist.org": false
}
]
}
複製代碼
上面的配置禁用了來自公網官方倉庫的軟件包獲取,容許使用標準CA證書和自簽名證書。
最後執行 composer install
進行軟件包下載&安裝便可。
下一篇文章聊聊如何搭配 CI 系統,使用 composer
。
—EOF
我如今有一個小小的折騰羣,裏面彙集了一些喜歡折騰的小夥伴。
在不發廣告的狀況下,咱們在裏面會一塊兒聊聊軟件、HomeLab、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。
喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)