63月/180
Vagrant-安装教程及常见问题
前言:
Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。
它的主要意义是让所有开发人员都使用和线上服务器一样的环境,本质上和你新建一个虚拟机。
那最常见的,正常我们是怎么开发呢,大部分童鞋应该是在windows下搭建开发环境,敲代码,运行程序,达到效果git或svn提交,发布linux环境再看效果。
而vagrant virtualBox实现了把代码同步共享到linux虚拟机,而这个虚拟机你可以配成和你生产环境一样的,
说白了,通过共享文件到虚拟机,在类生产环境下运行。【让你在windows下体验到在linux开发的效果。】
还有一种共享方式,可以借助IDE的develop功能通过sftp上传到服务器,然后访问服务器
三种方式总结:
【1】原始windows开发模式:windows开发-本地访问调试(与生产环境毕竟不同)-发布到linux运行
【2】vagrant virtualBox模式: windows开发 - 文件本地共享 -- 直接访问虚拟机(linux环境与生产一致)
【3】IDE develop 模式: windows开发 - 文件远程上传 -- 访问远程开发机(linux环境与生产一致)
其实【1】,与【2,3】的区别就在于,程序是在哪里运行的,windows本地?or Linux仿生产环境
(能在仿生产的环境直接开发肯定比在windows开发在放到linux更好些,开发方便避免一些环境上等的麻烦)
【2】与【3】的区别就在于文件是如何同步的:【2】是通过虚拟机文件共享实现同步;【3】直接利用sftp远程上传实现同步。
缺点:
【1】毫无疑问,它的弊端就是开发时不能模拟生产环境,可能会有衔接问题,环境有了问题不像虚拟机重安一台立刻搞定。
【3】存在的问题,比如:当切换开发分支后改动了文件a和b,当前ide选中的是a文件,ok他会自动上传更新,但是b文件不会,因为窗口你没在b文件下呀,没有那么智能不会自动触发上传更新,这点就坑了造成代码不同步,需要你自己手动触发一下相关文件的上传,尤其是依赖一些包的时候会发生丢失,得全项目上传一次;
【2】因为是本地和虚拟机的文件共享嘛,没有文件上传遗漏一说,所以还是很推荐用
目录:
一。安装虚拟机
二。Vagrantfile配置文件详解
三。连接虚拟机
四。碰到问题
一。安装虚拟机
1.添加box
vagrant box add base your_box_addres
注意:base是默认名称,主要用来标识一下你添加的box,后面的命令都是基于这个标识来操作的,你也可以用其他名称【但是用了其他名字记得在第二步用此名字init】
2.初始化
vagrant init
vagrant init box_name
如果你添加的box名称不是[base],那么需要在初始化的时候指定名称
3.启动虚拟机
vagrant up
启动过程可能比较长,耐心等待
图一.运行过程总图
图二
相关指令:
- vagrant up (启动虚拟机)
- vagrant halt (关闭虚拟机——对应就是关机)
- vagrant suspend (暂停虚拟机——只是暂停,虚拟机内存等信息将以状态文件的方式保存在本地,可以执行恢复操作后继续使用)
- vagrant resume (恢复虚拟机—— 与前面的暂停相对应)
- vagrant destroy (删除虚拟机,删除后在当前虚拟机所做进行的除开Vagrantfile中的配置都不会保留)
二.Vagrantfile配置文件详解
在我们的开发目录下有一个文件Vagrantfile,里面包含有大量的配置信息,主要包括三个方面的配置,虚拟机的配置、SSH配置、Vagrant的一些基础配置。(它的配置语法也是Ruby的)【修改配置文件,记得完后重启vagrant才能生效哦】
在我们的开发目录下有一个文件Vagrantfile
,里面包含有大量的配置信息,主要包括三个方面的配置,虚拟机的配置、SSH配置、Vagrant的一些基础配置。Vagrant是使用Ruby开发的,所以它的配置语法也是Ruby的,但是我们没有学过Ruby的人还是可以跟着它的注释知道怎么配置一些基本项的配置。
具体介绍,参考:http://blog.csdn.net/chajinglong/article/details/52805915
- # -*- mode: ruby -*-
- # vi: set ft=ruby :
- # All Vagrant configuration is done below. The "2" in Vagrant.configure
- # configures the configuration version (we support older styles for
- # backwards compatibility). Please don\'t change it unless you know what
- # you\'re doing.
- Vagrant.configure(2) do |config|
- # The most common configuration options are documented and commented below.
- # For a complete reference, please see the online documentation at
- # https://docs.vagrantup.com.
- # Every Vagrant development environment requires a box. You can search for
- # boxes at https://atlas.hashicorp.com/search.
- config.vm.box = "base"
- # Disable automatic box update checking. If you disable this, then
- # boxes will only be checked for updates when the user runs
- # `vagrant box outdated`. This is not recommended.
- # config.vm.box_check_update = false
- # Create a forwarded port mapping which allows access to a specific port
- # within the machine from a port on the host machine. In the example below,
- # accessing "localhost:8080" will access port 80 on the guest machine.
- # config.vm.network "forwarded_port", guest: 80, host: 80
- # Create a private network, which allows host-only access to the machine
- # using a specific IP.
- config.vm.network "private_network", ip: "192.168.33.10"
- # Create a public network, which generally matched to bridged network.
- # Bridged networks make the machine appear as another physical device on
- # your network.
- # config.vm.network "public_network"
- # Share an additional folder to the guest VM. The first argument is
- # the path on the host to the actual folder. The second argument is
- # the path on the guest to mount the folder. And the optional third
- # argument is a set of non-required options.
- config.vm.synced_folder "D:/all_code/", "/home/www"
- # Provider-specific configuration so you can fine-tune various
- # backing providers for Vagrant. These expose provider-specific options.
- # Example for VirtualBox:
- #
- # config.vm.provider "virtualbox" do |vb|
- # # Display the VirtualBox GUI when booting the machine
- # vb.gui = true
- #
- # # Customize the amount of memory on the VM:
- # vb.memory = "1024"
- # end
- #
- # View the documentation for the provider you are using for more
- # information on available options.
- # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
- # such as FTP and Heroku are also available. See the documentation at
- # https://docs.vagrantup.com/v2/push/atlas.html for more information.
- # config.push.define "atlas" do |push|
- # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
- # end
- # Enable provisioning with a shell script. Additional provisioners such as
- # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
- # documentation for more information about their specific syntax and use.
- # config.vm.provision "shell", inline: <
- # sudo apt-get update
- # sudo apt-get install -y apache2
- # SHELL
- end
三.连接虚拟机
1.虚拟机相关登录信息
vagrant ssh
这样我们就可以像连接到一台服务器一样进行操作了。
图三
2.ssh登录
window机器不支持这样的命令,必须使用第三方客户端来进行连接,例如xmoba、putty、Xshell等.
- ssh: 127.0.0.1
- 端口: 2222
- 用户名: vagrant
- 密码: vagrant
图四.xshell登陆举例
图五.xmoba登陆举例
3.系统信息
df -h
/vagrant这个目录是自动映射的,被映射到你刚刚建立的文件夹,这样就方便我们以后在开发机中进行开发,在虚拟机中进行运行效果测试了。
四。碰到问题:
1.vagrant up 时提示错误 cound not open file 问题
如果init指定了 add的名称test,那么init时也要说明,少了这一步
如下边错误演示与正确演示。
图六.错误演示
图七.正确演示
2.vagrant up 时提示错误:
- The guest machine entered an invalid state while waiting for it
- to boot. Valid states are \'starting, running\'. The machine is in the
- \'poweroff\' state. Please verify everything is configured
- properly and try again.
- If the provider you\'re using has a GUI that comes with it,
- it is often helpful to open that and watch the machine, since the
- GUI often has more helpful error messages than Vagrant can retrieve.
- For example, if you\'re using VirtualBox, run `vagrant up` while the
- VirtualBox GUI is open.
- The primary issue for this error is that the provider you\'re using
- is not properly configured. This is very rarely a Vagrant issue.
打开虚拟机启动,也会提示报错:
- Unable to load R3 module D:\virtualBox/VBoxDD.DLL (VBoxDD): GetLastError=1790 (VERR_UNRESOLVED_ERROR).
原因:
本目录中的以下三个文件是原始的未被破解的WIN7 64位系统主题文件:
themeservice.dll , themeui.dll ,uxtheme.dll
为了使用工具UniversalThemePatcher-x64.exe恢复主题,特地将以上3个文件,
各拷贝了一份,并重新命名如下:
themeservice.dll.backup ,themeui.dll.backup ,uxtheme.dll.backup
解决方法:
我们只须把重命名后的3个文件:
themeservice.dll.backup ,themeui.dll.backup ,uxtheme.dll.backup
拷贝到C:\Windows\System32目录下面,
然后运行工具UniversalThemePatcher-x64.exe进行恢复即可。
下载地址:http://download.csdn.net/download/ty_hf/10013443【里边有使用说明】
3.虚拟机一切正常,文件代码也映射到虚拟机,但就是不能正常访问。
a).配置文件需要删除
- sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
问题就处在在持久网络设备udev规则(persistent network device udev rules)是被原VM设置好的,再用box生成新VM时,这些rules需要被更新。而这和Vagrantfile里对新VM设置private network的指令发生冲突。删除就好了。
b).如果设置了host,虚拟机里也要设置一次
- vi /etc/hosts
3.问题 default: Warning: Authentication failure. Retrying...
- Bringing machine \'default\' up with \'virtualbox\' provider...
- ==> default: Clearing any previously set forwarded ports...
- ==> default: Clearing any previously set network interfaces...
- ==> default: Preparing network interfaces based on configuration...
- default: Adapter 1: nat
- default: Adapter 2: hostonly
- ==> default: Forwarding ports...
- default: 22 (guest) => 2222 (host) (adapter 1)
- ==> default: Booting VM...
- ==> default: Waiting for machine to boot. This may take a few minute
- default: SSH address: 127.0.0.1:2222
- default: SSH username: vagrant
- default: SSH auth method: private key
- default: Warning: Remote connection disconnect. Retrying...
- default: Warning: Authentication failure. Retrying...
- default: Warning: Authentication failure. Retrying...
- default: Warning: Authentication failure. Retrying...
- Timed out while waiting for the machine to boot. This means that
- Vagrant was unable to communicate with the guest machine within
- the configured ("config.vm.boot_timeout" value) time period.
- If you look above, you should be able to see the error(s) that
- Vagrant had when attempting to connect to the machine. These errors
- are usually good hints as to what may be wrong.
- If you\'re using a custom box, make sure that networking is properly
- working and you\'re able to connect to the machine. It is a common
- problem that networking isn\'t setup properly in these boxes.
- Verify that authentication configurations are also setup properly,
- as well.
- If the box appears to be booting properly, you may want to increase
- the timeout ("config.vm.boot_timeout") value.
解决:
编辑Vagrantfile ,添加如下文件
- config.ssh.username = "vagrant"
- config.ssh.password = "vagrant"
然后重启vagrant 重新加载配置文件
- vagrant halt
- vagrant up
注意登陆的时候看下 vagrant ssh 看下你的登录信息,端口号
4.报错问题:
- Bringing machine \'default\' up with \'virtualbox\' provider...
- Your VM has become "inaccessible." Unfortunately, this is a critical error
- with VirtualBox that Vagrant can not cleanly recover from. Please open VirtualBox
- and clear out your inaccessible virtual machines or find a way to fix
解决:
http://doodlebobbers.com/vagrant-error-your-vm-has-become-inaccessible/
其实就是删除.vagrant文件夹,然后重启vagrant
5.vagrant 启动的时候报错
- A Vagrant environment or target machine is required to run this
- command. Run vagrant init to create a new Vagrant environment. Or,
- get an ID of a target machine from vagrant global-status to run
- this command on. A final option is to change to a directory with a
- Vagrantfile and to try again.
少前边步骤了,比如vagrant init;或者没有进入对应vagrant init的文件夹
6.vagrant dns解析异常,访问接口特别慢,在Vagrantfile 配置文件中添加下边代码:
- config.vm.provider :virtualbox do |vb|
- vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
- vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
7.vagrant up 又提示新报错!
- D:\vcode>vagrant up
- Bringing machine \'default\' up with \'virtualbox\' provider...
- Your VM has become "inaccessible." Unfortunately, this is a critical error
- with VirtualBox that Vagrant can not cleanly recover from. Please open VirtualBo
- x
- and clear out your inaccessible virtual machines or find a way to fix
- them.
相关资源:
虚拟机等相关安装包: 链接:http://pan.baidu.com/s/1dEWSnEL 密码:ajaq
235月/160
微信开发常见报错及解决方法
小技巧:可能过ctrl+f 进行查找您遇到的问题。
支付方式 | 报错提示 | 解决方法 | |
热点问题 | 支付返回签名错误 | 注意签名参数的大小写,支付密钥key要到商户平台设置,设置的规则是32位数字与字母大小写的组合。以下链接为签名过程。 (https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=3_1) |
|
支付回调 | 认证后的服务号之间支持跨号支付。 | ||
支付失败 | 请检查商户号是否错误或支付密钥key设置错误。 | ||
redirect——uri参数错误 | 请进入公众平台-开发者中心,找到填写商户的支付授权域名,填写的就是商户支付授权目录上的域名。 | ||
paysinkey如何获取? | 新版的微信支付是没有这个paysignkey参数的,具体的参数请查看文档 | ||
(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=3_1) | |||
mchid是指什么? | MCHID参数指的是商户号 | ||
openid的获取请参考文档 | openid的获取请参考文档详细介绍 | ||
(http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html) | |||
openid如何获取? | openid的获取请参考文档查看详细介绍: | ||
(http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html) | |||
Appsecret如何获取? | APPsecret参数可进入公众平台(https://mp.weixin.qq.com)开发者中心查看。 | ||
调用报错 get_brand_wcpay_request:fail |
签名错误,请仔细检查签名。 | ||
spbill_create_ip 是指什么? | spbill_create_ip 指的是终端ip,在APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。 | ||
网页支付(JSAPI) | “当前公众号没有权限支付本次交易“ | 检查该公众帐号是否已经获取了支付资格。 | |
“公众帐号支付使用了无效的商户号,无法发起该笔交易” | 检查商户号使用错误。 | ||
“该公众号支付签名无效,无法发起该笔交易” | 调起支付MD5签名的MD5签名错误,请检查相关签名。 | ||
“Args Error” | 提交JS时,josn传递参数必须与文档中名字一致,大小写匹配。 | ||
“access:not_allow” | 未设置白名单,添加位置:微信公众平台=》微信支付=》开发配置 | ||
点击支付无反应 | 支付授权目录是否正确,如果使用的是支付测试目录,是否设置了白名单,需白名单帐号进行支付测试。 | ||
ios系统可以正常支付,android系统支付失败 | timestamp字段值需要加上“”,传递数据必须为字符串类型。 | ||
调用报错 get_brand_wcpay_request:fail |
签名错误,请仔细检查签名。 | ||
调用报错: zhgj-2014+中涵国际分销商城及“订单满送红包无法送” |
商户设置有问题。 | ||
IOS系统调用支付JSAPI报错 缺少参数:$key0$,android 没问题 |
提交的参数有问题,注意全部参数都得是字符串类型。 | ||
支付验证签名失败 | 签名错误,仔细检查签名。 | ||
jsapi 缺少参数 key0 | 问题出在网页端调起支付API接口中timeStamp参数,必须是string类型,但是php默认生成的时间戳是int类型。 解决方法:修改下lib/Wxpay.Data.php约2731行处SetTimeStamp方法,修改为$this->values['timestamp'] = (string)$value; |
||
安卓手机可以收到满送红包 苹果的不行 红包虽然已经显示发送了红包但是实质资金流水没有扣除资金 | 参数错误,请仔细检查。 | ||
调用报错: 传输参数错误 |
推测为提交的支付请求参数不正确;以下文档有详细的参考。https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7 | ||
调用报错: 没有获取到微信支付预支付ID,请管理员检查微信支付配置项 |
需要按照文档要求 ,先获取prepay_id。 | ||
支付权限检查失败 | 商户所用的参数对应的APPID是APP支付;如果商户想要JSAPI支付,需要在公众平台申请公众号,公众号支付中才有此参数。 | ||
原生支付(扫码支付) | “获取商户数据失败” | 请检查申请native支付时的回调URL地址是否正确,是否可以外网访问获取数据。 | |
“商户返回数据错误” | native回调返回数据格式错误,非XML格式数据。 | ||
“签名错误” | 检查MD5签名中参数格式及值是否正确。 | ||
调用报错: 获取商户订单信息超时或商户返回httpcode非200 |
签名错误,请仔细检查签名。 | ||
错误返回:错误码:60 | 错误通过修改文件:WxPay.Api.php解决,具体如下: 第537行 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TURE); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,2);//严格校验 to curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);//严格校验2 微信支付错误两个问题的解决:curl出错,错误码:60 |
||
APP支付 | 错误返回“-1” | 开放平台配置的报名和应用签名是否一致:(android);确认是否使用正式的keystore打包apk并安装调试;(android);提交订单部分需要在服务器端完成。 | |
下单报{"errcode":62621014,"errmsg":""} | Package数据MD5签名错误,请参照文档检查。 | ||
下单报"1001"错误 | package里缺少必要参数;金额类型为证书,单位是分。 | ||
android签名正常,ios签名错误 | 需要注意body如果是中文,需要编码,编码格式统一为“UTF-8”。 | ||
支付授权地址没有经过ICP验证 | 域名需要是英文备案域名方可。(此情况针对备案域名中包含中文字符或其他) | ||
ios系统:订单成功,无法跳转到支付界面 | 请仔细查阅参考开发文档步骤。 | ||
支付结果报错:errStr=null,code=-1 | 请检查开放平台配置的包名和签名是否跟APK安装后的包名签名一致,一致才会调用的。 | ||
支付无法调起 | 请检查开放平台配置的包名和签名是否跟你的APK安装后的包名签名一致,一致才会调用的。 | ||
需要V3版的app支付服务端demo,因获取prepayId失败,找不到app_key | 新版的微信支付是没有这个参数的,请查看最新版文档。 | ||
请求prepayid发生错误: errcode":268497023,"errmsg |
请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。 | ||
支付返回报错: :"errcode":268497023,"errmsg":"您已完成交易接口升级,老接口交易权限已关闭,请使用新接口进行交易。如有疑问请联系微信支付客服咨询" |
请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。 | ||
请求prepayid发生错误: 信息[{"errcode":268497023,"errmsg":"鎮ㄥ凡瀹屾垚浜ゆ槗鎺ュ彛鍗囩骇锛岃 鎺ュ彛浜ゆ槗鏉冮檺宸插叧闂紝璇蜂娇鐢ㄦ柊鎺ュ彛杩涜浜ゆ槗銆傚鏈夌枒闂鑱旂郴寰俊鏀粯瀹㈡湇鍜ㄨ"}] |
请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。 | ||
根据文档下订单,调用微信支付失败。调用微信支付的时候,微信为登录状态则无反应;微信未登录状态,会调用微信登录界面。 | 请将商户的APPID和商户号以及报错截图+请求参数详情,发送至wepayTS@tencent.com,进行深入了解。 | ||
常见问题 | 申请正在审核中,如何可以提前调试测试? | 只需要资料审核通过,收到通知邮件即可通过配置测试目录进行联调测试。未审核通过可下载文档进行开发,但不能联调测试。 | |
支付授权目录是什么? | 支付授权目录是支付功能正式上线后,商户后台发起支付请求的页面所在的目录。 | ||
支付测试目录是什么? | 支付测试目录提供给开发者,在开发测试期间使用的临时目录。 | ||
支付测试目录和授权目录有何区别? | 支付授权目录将会在产品上线审核时,以及上线后长期使用的正式目录;测试目录只能配置白名单,才可以在公众号内发起支付。 | ||
如何配置支付目录(授权、测试)? | 登录微信公众平台-微信支付-开发配置-修改 | ||
支付目录有什么规则? | 头部需要包含http或https,须细化到二级或三级目录,字母小写,以左斜杠“/”结尾。 | ||
如何配置授权回调页面域名? | 登录微信公众平台=》开发者中心=》网页授权获取用户基本信息=》修改 | ||
微信支付接口的签名规则是如何的? | MD5签名,订单数据签名,所有传输的字段均需要参与签名,使用商户密钥key在签名字段排序后放入在最后组包签名。 | ||
“订单数据签名验证失败”如何解决? | 检查参数是否一致;是否含有特殊字符;中文编码类型是否与所传参数一致;body参数是否含空格,若有空格URLencode的时需要转为%20。 | ||
报40001错误,如何解决? | accesstoken失效或者过期,accesstoken有效期为2小时,如果有系统或者人为重新获取,前一个accesstoken也会自动消失。请保证accesstoken为全局管理,避免重复获取。 | ||
签名正常,却提示fail_invalid appid | 查看支付授权目录是否设置正确,所支付页面路径是否在支付授权目录下。 | ||
公众号是否可以跨号支付? | 两个具有支付权限的服务号之间可以跨号支付,但不可混淆appid。 | ||
支付完成,Notify URL无法接收回调通知 | 需要绝对路径,外网可访问,不支持非80端口,同时注意不要被防火墙拦截;可自行用fiddler模拟post访问是否正常。 | ||
查询订单接口报“errcode":49001,"errmsg": | 检查accesstoken是否为同一APPID获取;POST数据必须为JSON格式, | ||
"not same appid with appid of access_token"错误如何解决? | 避免格式不对导致获取APPID不一致。 | ||
支付提示“系统繁忙,请稍后再试” | 检查签名及传入参数是否与文档要求一致;尤其是MD5签名部门的正确性。 | ||
调用支付报错【特殊】 | 调用报错: “chooseWXPay:fail” |
此情况需要商户将提交的签名过程发送至邮箱:wepayTS@tencent.com,进行深入了解。 | |
调用报错: “{return_msg=支付权限检查失败, return_code=FAIL}” |
此情况需要将提交的xml发送至邮箱:wepayTS@tencent.com,进行深入了解。 | ||
zhgj-2014+中涵国际分销商城及“订单满送红包无法送” | 请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。 | ||
微信支付完成后不能执行回调 | 请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。 | ||
报错:不允许跨号支付 ios上没这个问题,android上有些商品有这个问题 |
是否通过订阅号发出此请求,请将APPID,商户号,报错截图及请求参数发送至wepayTS@tencent.com,进行深入了解。 |