Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
化率高的網(wǎng)站著陸頁是指用戶在搜索相差產(chǎn)品信息關(guān)鍵詞時(shí),進(jìn)到你的網(wǎng)站并且發(fā)起咨詢,那么怎樣的著陸頁能夠吸引用戶呢?下面就讓珠海建站杰作科技小編帶大家來了解一下。
1、導(dǎo)航清晰簡單 導(dǎo)航一定要清晰簡單,如果客戶來到網(wǎng)站,卻因?yàn)閷?dǎo)航復(fù)雜而不能快速找到需要的信息或產(chǎn)品,這必然會(huì)流失很大一部分潛在客戶。另外網(wǎng)站除了在視覺上吸引客戶外,還需要保證網(wǎng)站的穩(wěn)定性、功能性和易用性。
2、突出產(chǎn)品的價(jià)值 大多數(shù)用戶訪問網(wǎng)站是帶著需求的,希望網(wǎng)站能幫助他們解決一定的問題,這就需要網(wǎng)站突出產(chǎn)品或服務(wù)能解決哪些問題,用戶購買后有些什么好處,這樣的信息才能抓住用戶眼球。也許你會(huì)問,如何知道網(wǎng)站的信息是否滿足客戶的需求,最簡單的方法是做在線調(diào)查。
3、網(wǎng)頁設(shè)計(jì)大氣美觀 網(wǎng)頁大氣美觀的網(wǎng)站能提升企業(yè)的形象,顯得更專業(yè),給用戶一種“高大上”感覺。這個(gè)需要UI設(shè)計(jì)師根據(jù)企業(yè)的情況用心設(shè)計(jì),打造出既符合企業(yè)氣質(zhì)又能提升企業(yè)形象的網(wǎng)頁效果。
4、分享用戶評(píng)價(jià) 產(chǎn)品好不好,除了本身質(zhì)量之外,還要看產(chǎn)品的口碑好不好。網(wǎng)站上的用戶評(píng)價(jià)是體現(xiàn)口碑最直接的一種方式,如果網(wǎng)站分享出客戶的綜合評(píng)價(jià)或評(píng)分,一方面能幫助新客戶直觀的了解產(chǎn)品在別的客戶那里的使用情況,另一方面大大促進(jìn)產(chǎn)品銷售機(jī)會(huì)。 5、持續(xù)改進(jìn) 為了持續(xù)提升用戶體驗(yàn),還需要不斷改進(jìn)完善網(wǎng)站設(shè)計(jì),嘗試新的方法和技術(shù),減少客戶流失,提升轉(zhuǎn)化率。
了解更多網(wǎng)絡(luò)營銷請(qǐng)關(guān)注珠海網(wǎng)站建設(shè)-杰作科技:
www.jiezuo.org
www.jiezuo.net
www.jzuo.cn
ww.zhjiezuo.com
珠海網(wǎng)站建設(shè).com
原文鏈接:http://www.jiezuo.net/yingxiaodongtai/857.html
者:等你歸去來
出處:https://www.cnblogs.com/yougewe/p/13865184.html
使是最小的側(cè)項(xiàng)目也值得它的CI/CD管道
前言
使用當(dāng)今的工具,建立一個(gè)簡單的CI/CD管道并不困難。即使是做一個(gè)小項(xiàng)目,這樣做也是學(xué)習(xí)很多東西的好方法。Docker、GitLab和Portainer是用于此設(shè)置的一些很棒的組件。
這里我們以https://sophia.events/為案例,我們保證頁面的event為最新的。頁面的events在這里[1]
免責(zé)聲明:這是一個(gè)簡單的項(xiàng)目,但是項(xiàng)目的復(fù)雜性在這里并不重要。我們將詳細(xì)介紹的CI/CD管道的組件可以以幾乎相同的方式用于更復(fù)雜的項(xiàng)目。不過,它們非常適合微服務(wù)。
廢話不說,直接上代碼
{ "events": [ { "title": "All Day DevOps 2018", "desc": "We're back with 100, 30-minute practitioner-led sessions and live Q&A on Slack. Our 5 tracks include CI/CD, Cloud-Native Infrastructure, DevSecOps, Cultural Transformations, and Site Reliability Engineering. 24 hours. 112 speakers. Free online.", "date": "17 octobre 2018, online event", "ts": "20181017T000000", "link": "https://www.alldaydevops.com/", "sponsors": [{"name": "all-day-devops"}] }, { "title": "Création d'une Blockchain d'entreprise (lab) & introduction aux smart contracts", "desc": "Venez avec votre laptop ! Nous vous proposons de nous rejoindre pour réaliser la création d'un premier prototype d'une Blockchain d'entreprise (Lab) et avoir une introduction aux smart contracts.", "ts": "20181004T181500", "date": "4 octobre à 18h15 au CEEI", "link": "https://www.meetup.com/fr-FR/IBM-Cloud-Cote-d-Azur-Meetup/events/254472667/", "sponsors": [{"name": "ibm"}] }, … ] }
將mustache[2]模板應(yīng)用于此文件,以生成最終的web頁面。
生成web 頁面之后,將它們復(fù)制到nginx image中——部署在目標(biāo)機(jī)器上的image。
然后構(gòu)建完成了兩個(gè)部分,由于多階段構(gòu)建:
· 資產(chǎn)的生成
· 創(chuàng)建包含資產(chǎn)的最終映像
這是Dockerfile用于構(gòu)建:
# Generate the assets FROM node:8.12.0-alpine AS build COPY . /build WORKDIR /build RUN npm i RUN node clean.js RUN ./node_modules/mustache/bin/mustache events.json index.mustache > index.html# Build the final image used to serve them FROM nginx:1.14.0 COPY --from=build /build/*.html /usr/share/nginx/html/ COPY events.json /usr/share/nginx/html/ COPY css /usr/share/nginx/html/css COPY js /usr/share/nginx/html/js COPY img /usr/share/nginx/html/img
測(cè)試目的:只需要clone repo 然后在運(yùn)行test.sh。test.sh 會(huì)創(chuàng)建一個(gè)image然后運(yùn)行。
$ git clone :lucj/sophia.events.git$ cd sophia.events$ ./test.sh Sending build context to Docker daemon 2.588MB Step 1/12 : FROM node:8.12.0-alpine AS build ---> df48b68da02a Step 2/12 : COPY . /build ---> f4005274aadf Step 3/12 : WORKDIR /build ---> Running in 5222c3b6cf12Removing intermediate container 5222c3b6cf12 ---> 81947306e4af Step 4/12 : RUN npm i ---> Running in de4e6182036bnpm notice created a lockfile as package-lock.json. You should commit this file.npm WARN www@1.0.0 No repository field.added 2 packages from 3 contributors and audited 2 packages in 1.675sfound 0 vulnerabilitiesRemoving intermediate container de4e6182036b ---> d0eb4627e01f Step 5/12 : RUN node clean.js ---> Running in f4d3c4745901Removing intermediate container f4d3c4745901 ---> 602987ce7162 Step 6/12 : RUN ./node_modules/mustache/bin/mustache events.json index.mustache > index.html ---> Running in 05b5ebd73b89Removing intermediate container 05b5ebd73b89 ---> d982ff9cc61c Step 7/12 : FROM nginx:1.14.0 ---> 86898218889a Step 8/12 : COPY --from=build /build/*.html /usr/share/nginx/html/ ---> Using cache ---> e0c25127223f Step 9/12 : COPY events.json /usr/share/nginx/html/ ---> Using cache ---> 64e8a1c5e79d Step 10/12 : COPY css /usr/share/nginx/html/css ---> Using cache ---> e524c31b64c2 Step 11/12 : COPY js /usr/share/nginx/html/js ---> Using cache ---> 1ef9dece9bb4 Step 12/12 : COPY img /usr/share/nginx/html/img ---> e50bf7836d2fSuccessfully built e50bf7836d2fSuccessfully tagged registry.gitlab.com/lucj/sophia.events:latest=> web site available on http://localhost:32768
在輸出的信息下面有一個(gè)網(wǎng)址 http://localhost:32768
我們打開網(wǎng)址:
在swarm中運(yùn)行docker
在這里我們用swarm來管理docker。而不是用K8s,swarm稍微簡單些, 也便于大家通過這篇文章來自己實(shí)現(xiàn)CI/CD。
讓應(yīng)用程序運(yùn)行在docker中
docker compose 如下
version: "3.7" services: www: image: registry.gitlab.com/lucj/sophia.events networks: - proxy deploy: mode: replicated replicas: 2 update_config: parallelism: 1 delay: 10s restart_policy: condition: on-failurenetworks: proxy: external: true
簡單說明:
· image被放在了gitlab.com私有倉庫中
· 服務(wù)處于具有兩個(gè)副本的復(fù)制模式,這意味著服務(wù)的兩個(gè)任務(wù)/容器同時(shí)運(yùn)行。VIP(虛擬IP地址)通過集群與服務(wù)相關(guān)聯(lián),因此每個(gè)針對(duì)服務(wù)的請(qǐng)求都在兩個(gè)副本之間實(shí)現(xiàn)負(fù)載平衡。
· 每次更新服務(wù)(部署web站點(diǎn)的新版本)時(shí),更新一個(gè)副本,10秒后更新第二個(gè)副本。這確保在更新過程中web站點(diǎn)仍然可用。我們也可以使用回滾策略,但是現(xiàn)在還不需要。
· 該服務(wù)附加到外部代理網(wǎng)絡(luò),因此TLS終端(運(yùn)行于部署在集群上的另一個(gè)服務(wù)中,但不在此項(xiàng)目中)可以向www服務(wù)發(fā)送請(qǐng)求。
我們通過如下命令運(yùn)行docker服務(wù):
docker stack deploy -c sophia.yml sophia_events
Docker管理平臺(tái)portainer.io
Portainer平臺(tái)有一個(gè)很棒的web UI界面,它允許用戶非常容易地管理Docker主機(jī)和Docker集群。下面是Portainer界面的截圖,它列出了集群中可用的應(yīng)用。
我們看到有三個(gè)實(shí)例
· portainer自己
· Sophia_events
· TLS
下面列出位于Sophia_events中的www服務(wù)的詳細(xì)信息,我們可以看到服務(wù)webhook已被激活。自從Portainer 1.19.2(到目前為止的最后一個(gè)版本)以來,這個(gè)特性就可用了,它允許我們定義一個(gè)HTTP Post端點(diǎn),可以調(diào)用它來觸發(fā)服務(wù)的更新。稍后我們將看到,GitLab運(yùn)行器負(fù)責(zé)調(diào)用這個(gè)webhook。
注意:從屏幕截圖中可以看到,我從localhost:8888訪問Portainer UI。由于我不想將Portainer實(shí)例暴露給外部世界,所以通過ssh隧道進(jìn)行訪問,使用以下命令打開ssh隧道:
ssh -i ~/.docker/machine/machines/labs/id_rsa -NL 8888:localhost:9000 $USER@$HOST
然后,所有針對(duì)端口8888上的本地機(jī)器的請(qǐng)求都通過ssh發(fā)送到虛擬機(jī)上的端口9000。9000是Portainer在VM上運(yùn)行的端口,但是這個(gè)端口不對(duì)外開放,所以是相對(duì)安全的。
注意:在上面的命令中,用于連接VM的ssh密鑰是Docker機(jī)器在創(chuàng)建VM期間生成的密鑰。
GitLab runner 是一個(gè)負(fù)責(zé)執(zhí)行. GitLab –ci.yml 文件的驅(qū)動(dòng) ,當(dāng)代碼被push到主分支的時(shí)候,會(huì)自動(dòng)執(zhí)行預(yù)先寫好的腳本,從而實(shí)現(xiàn)自動(dòng)化。對(duì)于這個(gè)項(xiàng)目,我們將自己的GitLab runner定義為VM上的docker服務(wù)。
下面是配置腳本:
docker run — rm -t -i \ -v $CONFIG_FOLDER:/etc/gitlab-runner \ gitlab/gitlab-runner register \ --non-interactive \ --executor "docker" \ --docker-image docker:stable \ --url "" \ --registration-token "$PROJECT_TOKEN" \ --description "Exoscale Docker Runner" \ --tag-list "docker" \ --run-untagged \ --locked="false" \ --docker-privileged
可以使用PROJECT_TOKEN在gitlab上注冊(cè)額外的runners
注冊(cè)后,我們直接start
CONFIG_FOLDER=/tmp/gitlab-runner-configdocker run -d \ --name gitlab-runner \ --restart always \ -v $CONFIG_FOLDER:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest
一旦start成功,我們就會(huì)在gitlab上看到項(xiàng)目的信息:
當(dāng)研發(fā)把代碼提交到gitlab上,runners會(huì)一次執(zhí)行:測(cè)試、構(gòu)建、部署等在.gitlab-ci.yml里面定義好的操作。
· 測(cè)試階段運(yùn)行一些預(yù)檢查以確保events. json文件格式正確并且images完整 。
· 構(gòu)建階段構(gòu)建image并將其推送到GitLab registry 。
· deploy階段通過發(fā)送到Portainer的webhook觸發(fā)服務(wù)的更新。WWW_WEBHOOK變量在GitLab.com項(xiàng)目頁面的CI/CD設(shè)置中定義。
注:
這個(gè)runners在swarm的容器中運(yùn)行。我們可以使用一個(gè)共享的runner——他們可以在托管的主機(jī)上共享資源——但是,runner需要訪問Portainer endpoint (發(fā)送webhook),因?yàn)槲也幌M鸓ortainer被玩不訪問。
此外,因?yàn)檫\(yùn)行器在容器中運(yùn)行,所以它將webhook發(fā)送到Docker0橋接網(wǎng)絡(luò)的IP地址,以便通過它在主機(jī)上公開的端口9000與Portainer聯(lián)系。因此,webhook的格式如下:http://172.17.0.1:9000/api[…]a7-4af2-a95b-b748d92f1b3b
網(wǎng)站新版本的更新工作流程如下:
1. 開發(fā)人員將一些更改推給GitLab。這些更改基本上涉及事件中的一個(gè)或多個(gè)新事件。json文件加上一些額外的贊助商的標(biāo)志。
2. GitLab運(yùn)行器執(zhí)行. GitLab -ci.yml中定義的操作。
3. GitLab運(yùn)行器調(diào)用Portainer中定義的webhook。
4. 在webhook接收端,Portainer部署了www服務(wù)的新版本。它這樣做,調(diào)用Docker Swarm API。Portainer可以作為套接字/var/run/ dockerr訪問API。襪子啟動(dòng)時(shí)是綁定安裝的
5. 然后用戶就可以在web上看到最新的信息了。
小案例
修改一些配置,然后push到gitlab。
$ git commit -m 'Fix image'$ git push origin master
下面的截圖顯示了GitLab.com項(xiàng)目頁面中的提交觸發(fā)的信息
在Portainer端,接收webhook并執(zhí)行服務(wù)更新。我們無法在這里清楚地看到它,但是已經(jīng)更新了一個(gè)副本,使web站點(diǎn)可以通過第二個(gè)副本訪問。然后,幾秒鐘后,第二個(gè)副本被更新。
總結(jié)
即使對(duì)于這個(gè)小項(xiàng)目,設(shè)置一個(gè)CI/CD管道也是一個(gè)很好的練習(xí),尤其是要更加熟悉GitLab。這是一個(gè)優(yōu)秀的產(chǎn)品。這也是使用期待已久的Portainer(1.19.2)最新版本的webhook特性的好機(jī)會(huì)。另外,對(duì)于像這樣的一個(gè)小項(xiàng)目,使用Docker Swarm是很簡單的——它很酷,而且很容易使用!
[1]:https://gitlab.com/lucj/sophia.events
[2]:https://gitlab.com/lucj/sophia.events/blob/master/index.mustache
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。