还是少不了虚拟机
最后更新于:2022-04-02 04:30:41
## 还是少不了虚拟机
> 虚拟机有使用麻烦,性能不佳等缺点,现在 win10 系统使用 linux 子系统也挺好的:
> https://www.jianshu.com/p/fcf21d45ea74
> https://www.cnblogs.com/skyshalo/p/7724072.html
> https://segmentfault.com/a/1190000022059895
![](http://cdn.aipin100.cn/18-3-22/98005862.jpg)
开发习惯于`win`了,但是`win`下总有各种不方便,比如不支持`PCNTL`。
> 需要提前说明的是,由于涉及到进程的开辟与管理,php-resque使用了php的PCNTL函数,所以只能在Linux下运行,并且需要php编译PCNTL函数。如果希望用Windows做同样的工作,那么可以去找找Resque的其他语言版本,php在Windows下非常不适合做后台任务。[PHP的轻量消息队列php-resque使用说明](https://avnpc.com/pages/run-background-task-by-php-resque)
* * * * *
#### 代码运行方式
代码在虚拟机中运行就跟之前在本地运行一样,无须作任何调整,因为代码就是运行在虚拟机中的。
运行环境在虚拟机中(取代`wamp`),代码编写在`win`中。
`D:\wamp64\www` 挂在到虚拟机 `/mnt/www` 目录
虚拟机开着小窗不动就可以了,`Xshell` 可以连接虚拟机,和服务器环境一直,使用体验一致。以下说【服务器】就是此虚拟机了。
无需`FTP`使用连接服务器了,`www`目录直接在`win`中操作就可以了。
`宿主host文件`中指向虚拟机的地址 `192.168.1.110`(而不再是`127.0.0.1`了,因为`wamp`已经不用了) **就相当于是\[域名解析\]了**(解析到服务器地址)。(虚拟主机的对外开放IP通过在虚拟机中执行命令`ifconfig`查看inet字段)
服务器中创建nginx虚拟主机,设置网站根目录:`/mnt/www/XXX`**(其实目录实际指向了`宿主 D:\wamp64\www\XXX`)**,并设置绑定域名(**相当于是\[域名绑定\]了**)。所有体验与服务器环境一致。
服务器无需再`git pull`拉代码了,因为`www`是直接挂载的,实时在`win`中编辑,在服务器环境中生效的。
#### 开发方式的转变
代码开发模式不变,还是在`win`中,与之前一致,对于原来的开发方式没有任何改变,只是代码的运行环境在本地的服务器中了,这样就能有强大的完整`Linux`了,能获得与服务器一致的运行环境了。
代码还是那一套代码,只不过运行环境,可以在服务器中(虚拟机),因为服务器把`D:\wamp64\www`挂载过去了,只要你愿意,本地还是可以打开`wamp`的,这样一套代码就可以同时运行在两个生产环境中了(宿主`wamp`中和虚拟机服务器中同时运行),只不过这样没必要。
#### 域名重定向设置
为了约束和规范,我们把虚拟机服务器中的域名都设置为 `xxx-v.com`,`宿主host`中也这样指向:`192.168.1.110 aipin-v.com` ,而本地`宿主host`指向不变还是 `127.0.0.1 aipin.com`,这样就能和原来的宿主环境区分开了,并且不影响原来的`wamp`,这样就能同时两个域名访问同一个网站了,但是两个网站只是文件完全相同,而运行在两个独立不同的环境中。**注意:代码还是同一套代码,都是对应的同一个文件。**(这种模式下,唯一可能爱出的问题是,文件权限问题,不能两个环境都同时拥有文件的独占权限,出现权限问题时肯定是因为冲突造成的)
在不改变,不侵入原来的开发过程,而实现与服务器端一致的运行环境。
>[danger] 开发环境不变,以后的运行环境就在虚拟机服务器中了,不再打开wamp而是开着VirtualBox虚拟机了。这样能得到和服务器一致的生产和部署环境。代码部署时就是无缝的了,并且拥有服务器强大的功能环境,不受win下各种限制了。
(可能写得比较啰嗦,但是这里面的东西确实比较绕,不啰嗦的话是很容易搞混淆的)
>[tip] 注意:开启科学上网的代理时可能会导致修改host的域名重定向网站无法正常访问!(不要设置为“代理全部流量”就可以了)
>[tip] 不知道怎么回事,最近在我的win10上面,虚拟机网络有时会慢的要死(宿主本机访问和虚拟机内访问都是这样,重启nginx也不行),但也不是不通,找不到原因,每次遇到这种情况时重启一次马上又好了,看来重启能解决80%的问题啊。
* * * * *
### 为了方便测试
修改 `/usr/local/nginx/nginx.conf` 文件:
```
location / {
root /data/wwwroot/default;
}
#将test url指向已经挂在的目录,方便操作
location ^~ /test/ {
root /mnt/www/;
index index.html index.htm index.php;
}
```
```conf
root /data/wwwroot/default;
index index.html index.htm index.php;
location /www {
internal;
alias /mnt/www/;
}
```
这样虚拟机内访问 `http://127.0.0.1/www` 就是映射到 `/mnt/www/` 目录了
>[tip] 上面的配置还有问题,望熟悉nginx别名配置的朋友告知。
* * * * *
### 开发环境优化
>[tip] **使用穿透时,为了内外环境区分,所以要做好标记:**
1. 本地虚拟机 `/usr/local/nginx/nginx.conf` 最后添加
```
#标记web服务由本地虚拟主机提供
add_header WebServer-Powered-By 'Local VirtualBox';
```
2. 本地虚拟机 `/usr/local/nginx/conf/vhost/www.xxx.cn.conf` 最后也同样添加:
```
#标记web服务由本地虚拟主机提供
add_header WebServer-Powered-By 'Local VirtualBox';
```
同样的,服务器环境也添加此响应头,值为`Server`:
```
#标记web服务由服务器提供
add_header WebServer-Powered-By 'Server';
```
3. 框架入口文件`www/xxx/public/index.php`标记:
```php
// 运行环境标记:本地虚拟主机 or 线上服务器环境
if (stripos($_SERVER['SCRIPT_FILENAME'], 'mnt') !== false) {
define('RUNTIME_ENVIRONMENT', 'Local VirtualBox');
} else {
define('RUNTIME_ENVIRONMENT', 'Server');
}
header('Runtime-Environment: ' . RUNTIME_ENVIRONMENT);
```
这样一来,所有web请求都有标记了,即使非动态文件也有`WebServer-Powered-By` 头标记。
> 另外frp中也可以添加header [设置-http-请求的-header](https://github.com/fatedier/frp/blob/master/README_zh.md#设置-http-请求的-header)
**详细配置以及代理设置参见:**[Nginx · web开发最佳实践 · 看云](https://www.kancloud.cn/xiak/web-dev-best-practice/708061)
[linux - nginx添加add_header能启动,但不生效,也不报错 - SegmentFault 思否](https://segmentfault.com/q/1010000009576840)
[nginx添加自定义header - CSDN博客](https://blog.csdn.net/albertfly/article/details/51702556)
[通过Nginx定义Header头信息 - CSDN博客](https://blog.csdn.net/u014743697/article/details/54375252)
* * * * *
### 扩展
> 虚拟机要安装 `虚拟增强功能` ,鼠标、复制才能设置正常。
[ubuntu中vi不能正常使用方向键与退格键的问题_百度经验](https://jingyan.baidu.com/article/a3a3f811d194378da2eb8af8.html)
[怎样在VirtualBox中创建共享文件夹_百度经验](https://jingyan.baidu.com/article/656db918cca831e381249cce.html)
[分享Virtualbox Ubuntu 共享文件夹、自动挂载的一些问题 - CSDN博客](http://blog.csdn.net/skylake_/article/details/53132499)
> 当我自己满怀希望的去测试了第四种方法之后,我发现,系统不会再出错了,我真的真的特别激动啊。。。。。但是,并没有实现自动挂载啊啊啊啊啊啊啊~闹心死我了 / 我的这种方法成功了,哈哈!
[Ubuntu下设置开机自动挂载硬盘 - 在路上 - CSDN博客](https://blog.csdn.net/qwfys200/article/details/79737780)(上面如果不灵试下这种方式,另外打开VirtualBox的自挂载)
[virtualbox下面安装ubuntu后外网如何远程ssh访问 - 黄锋 - 博客园](https://www.cnblogs.com/tonyibm/p/5622349.html)
[Xshell5连接VirtualBox虚拟机中的Ubuntu_Linux教程_Linux公社-Linux系统门户网站](https://www.linuxidc.com/Linux/2016-08/134086.htm)
[【Linux学习】配置环境:实现【VirtualBox + ubuntu】+【开启ssh服务】+【putty远程连接到虚拟机】 - 蔡諝 - 博客园](https://www.cnblogs.com/caixu/archive/2012/09/12/2682630.html)
[ubuntu开启SSH服务远程登录 - jackghq的博客 - CSDN博客](https://blog.csdn.net/jackghq/article/details/54974141)
[windows下virtualbox中Ubuntu与主机通过ssh建立连接的方法 - CSDN博客](http://blog.csdn.net/aristolto/article/details/50542463)
[VirtualBox如何扩展虚拟机Ubuntu的硬盘容量? - CSDN博客](http://blog.csdn.net/ouyang_peng/article/details/53261599)
[\[Linux\] VirtualBox - 主机与虚拟机互通 - CentOS - 横渡 - 博客园](https://www.cnblogs.com/HD/p/4011323.html)
[VirtualBox网络环境配置,宿主机与虚拟机互联,同时虚拟机也可以使用互联网-张玉禄的博客-51CTO博客](http://blog.51cto.com/11156310/2159893)
> 配置网卡1:仅主机网络;网卡2:网络地址转换
[lnmp、lamp、lnmpa一键安装包(Updated: 2018-03-18) | Linux运维笔记](https://blog.linuxeye.cn/31.html)
[LNMP环境镜像使用手册](https://oneinstack.com/docs/lnmpstack-image-guide/)
多个虚拟机可能存在冲突,建议不开同时多开多个虚拟机软件,尤其是不同的软件。`夜神模拟器` 可能利用了 `VirtualBox` 的一些东西,在它的声音输入输出IO能看到 `VirtualBox` 的身影(它播放音乐时,win扬声器->合成器那里看到的),并且运行 `夜神模拟器` 时,安装 `VirtualBox` 时报严重错误,安装失败过。
* * * * *
### 内网穿透
>[nice] Ngrok:世界上最遥远的距离就是你在外网请求,我在内网测试。
[ngrok安装使用 - CSDN博客](https://blog.csdn.net/linshichen/article/details/52670385)
[10分钟教你搭建自己的ngrok服务器 - CSDN博客](https://blog.csdn.net/yjc_1111/article/details/79353718)
[Sunny-Ngrok内网转发](https://www.ngrok.cc/)
[ngrok国内服务器 | ITTUN](https://www.ittun.com/#)
[铂金ngrok(https://ngrok.bob.kim)原理浅析 - CSDN博客](https://blog.csdn.net/lyb3290/article/details/80239890)
[铂金ngrok 如何让外网访问到本地内网-ngrok内网穿透免费服务器 - Boblog](https://ngrok.bob.kim/)
[FRP内网穿透工具](http://diannaobos.com/frp/)(简单、免费、好用的内网穿透工具)
[frp内网穿透搭建,超级简单实用 - CSDN博客](https://blog.csdn.net/qq_25351621/article/details/78947477)
[shadowsocks](https://github.com/shadowsocks)
[Search · goprox](https://github.com/search?o=desc&q=goprox&s=stars&type=Repositories)
[snail007/goproxy: Proxy is a high performance HTTP(S), websocket, TCP, UDP,Secure DNS, Socks5 proxy server implemented by golang. Now, it supports chain-style proxies,nat forwarding in different lan,TCP/UDP port forwarding, SSH forwarding.Proxy是golang实现的高性能http,https,websocket,tcp,防污染DNS,socks5代理服务器,支持内网穿透,链式代理,通讯加密,智能HTTP,SOCKS5代理,域名黑白名单,跨平台,KCP协议支持,集成外部API。](https://github.com/snail007/goproxy)
[fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.](https://github.com/fatedier/frp)
* * * * *
last update:2018-7-30 18:24:48
';