three学习路线(二)
1.第一个3D案例—透视投影相机Threejs如果想把三维场景Scene渲染到web网页上,还需要定义一个虚拟相机Camera,就像你生活中想获得一张照片,需要一台用来拍照的相机。a.透视投影相机PerspectiveCameraThreejs提供了正投影相机OrthographicCamera (opens new window)和透视投影相机PerspectiveCamera (opens new window)。本节课先给大家比较常用的透视投影相机PerspectiveCamera。透视投影相机PerspectiveCamera本质上就是在模拟人眼观察这个世界的规律。// 实例化一个透视投影相机对象 const camera = new THREE.PerspectiveCamera();b.相机位置.posiiotn生活中用相机拍照,你相机位置不同,拍照结果也不同,threejs中虚拟相机同样如此。比如有一间房子,你拿着相机站在房间里面,看到的是房间内部,站在房子外面看到的是房子外面效果。相机对象Camera具有位置属性.posiiotn,通过位置属性.posiiotn可以设置相机的位置。//相机在Three.js三维坐标系中的位置 // 根据需要设置相机位置具体值 camera.position.set(200, 200, 200); c.相机观察目标.lookAt()你用相机拍照你需要控制相机的拍照目标,具体说相机镜头对准哪个物体或说哪个坐标。对于threejs相机而言,就是设置.lookAt()方法的参数,指定一个3D坐标。//相机观察目标指向Threejs 3D空间中某个位置 camera.lookAt(0, 0, 0); //坐标原点 camera.lookAt(0, 10, 0); //y轴上位置10 camera.lookAt(mesh.position);//指向mesh对应的位置d.判断相机相对三维场景中长方体位置你可以把三维场景中长方体mesh想象为一个房间,然后根据相机位置和长方体位置尺寸对比,判断两者相对位置。你可以发现设置相机坐标(200, 200, 200),位于长方体外面一处位置。// 长方体尺寸100, 100, 100 const geometry = new THREE.BoxGeometry( 100, 100, 100 ); const mesh = new THREE.Mesh(geometry,material); // 相机位置xyz坐标:0,10,0 mesh.position.set(0,10,0); // 相机位置xyz坐标:200, 200, 200 camera.position.set(200, 200, 200); e.定义相机渲染输出的画布尺寸你生活中相机拍照的照片是有大小的,对于threejs而言一样,需要定义相机在网页上输出的Canvas画布(照片)尺寸,大小可以根据需要定义,这里先随机定义一个尺寸。Canvas画布:课程中会把threejs虚拟相机渲染三维场景在浏览器网页上呈现的结果称为Canvas画布。// 定义相机输出画布的尺寸(单位:像素px) const width = 800; //宽度 const height = 500; //高度f.透视投影相机PerspectiveCamera:视锥体透视投影相机的四个参数fov, aspect, near, far构成一个四棱台3D空间,被称为视锥体,只有视锥体之内的物体,才会渲染出来,视锥体范围之外的物体不会显示在Canvas画布上。// width和height用来设置Three.js输出的Canvas画布尺寸(像素px) const width = 800; //宽度 const height = 500; //高度 // 30:视场角度, width / height:Canvas画布宽高比, 1:近裁截面, 3000:远裁截面 const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);PerspectiveCamera参数介绍:PerspectiveCamera( fov, aspect, near, far )参数含义默认值fov相机视锥体竖直方向视野角度50aspect相机视锥体水平方向和竖直方向长度比,一般设置为Canvas画布宽高比width / height1near相机视锥体近裁截面相对相机距离0.1far相机视锥体远裁截面相对相机距离,far-near构成了视锥体高度方向2000
查看详情点赞评论收藏浏览432023-03-10 15:05:41JS 表单弹出键盘兼容性处理
在我们日常前端开发或者工作中,经常会遇到HTML页面提交表单,弹出手机键盘出现各种各样的兼容性问题。android终端还是ios终端弹出异常等。下面总结了基础的处理弹出键盘的兼容性问题,以供参考。//判断是android终端还是ios终端 $("document").ready(function () { var m = navigator.userAgent; var isAndroid = m.indexOf('Android') > -1 || m.indexOf('Adr') > -1; //android终端 var isIos = !!m.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 var timer; if (isIos) { // ios 弹出与收起软键盘执行事件 document.body.addEventListener('focusin', () => { //软键盘弹起事件 $(".footer").css('position', 'relative'); $('.mask').css({'height':'200%','top':'-50%'}); window.addEventListener("touchmove", () => { $("input").blur(); }); }) document.body.addEventListener('focusout', () => { //软键盘关闭事件 $(".footer").css('position', 'fixed'); $('.mask').css('height','100%'); // 解決ios端用微信打开页面,收起软键盘后,底部出现空白问题 setTimeout(() => { const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0; window.scrollTo(0, Math.max(scrollHeight - 1, 0)); }, 100); }) } if (isAndroid) { // android 弹出与收起软键盘执行事件 const innerHeight = window.innerHeight; window.addEventListener('resize', () => { const newInnerHeight = window.innerHeight; if (innerHeight > newInnerHeight) { // 键盘弹出事件处理 $(".footer").hide(); } else { // 键盘收起事件处理 $(".footer").show(); } }); } });
查看详情点赞评论收藏浏览282023-03-10 13:07:43three学习路线(一)
安装three官网包引入three.js<script type="module"> // 现在浏览器支持ES6语法,自然包括import方式引入js文件 import * as THREE from './build/three.module.js'; </script>three.js三个基本概念:场景Scene、相机Camera、渲染器Renderer1.三维场景Scene你可以把三维场景Scene (opens new window)对象理解为虚拟的3D场景,用来表示模拟生活中的真实三维场景,或者说三维世界。创建3D场景对象Sceneconst scene = new THREE.Scene();2.物体形状:几何体Geometry Three.js提供了各种各样的几何体API,用来表示三维物体的几何形状{ 长方体(BoxGeomentry) 圆柱体(CylinderGeometry) 球体(SphereGeometry) 圆锥(ConeGeometry) 矩形平面(PlaneGeometry) 圆面图(CircleGeometry)}//创建一个长方体几何对象Geometryconst geometry = new THREE.BoxGeometry(100, 100, 100); 3.物体外观:材质Material如果你想定义物体的外观效果,比如颜色,就需要通过材质Material相关的API实现。threejs不同材质渲染效果不同,下面就以threejs最简单的网格基础材质MeshBasicMaterial (opens new window)为例给大家实现一个红色材质效果。{ 网格基础材质(MeshBasicMaterial) 网格漫反射材质(MeshLamberMaterial) 网格高光材质(MeshPhongMaterial) 物理材质(MeshStanderMaterial)(MeshPhysicalMaterial) 点材质(PointsMaterial) 线基础材质(LineBasicMaterial) 精灵材质(SpriteMaterial)}//创建一个材质对象Materialconst material = new THREE.MeshBasicMaterial({ color: 0xff0000,//0xff0000设置材质颜色为红色 }); 4.物体:网格模型Mesh实际生活中有各种各样的物体,在threejs中可以通过网格模型Mesh (opens new window)表示一个虚拟的物体,比如一个箱子、一个鼠标。// 两个参数分别为几何体geometry、材质materialconst mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh5.模型位置:position实际生活中,一个物体往往是有位置的,对于threejs而言也是一样的,你可以通过位置属性position定义网格模型Mesh在三维场景Scene中的位置。const mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh //设置网格模型在三维空间中的位置坐标,默认是坐标原点 mesh.position.set(0,10,0);6.add()方法在threejs中你创建了一个表示物体的虚拟对象Mesh,需要通过.add()方法,把网格模型mesh添加到三维场景scene中。scene.add(mesh); 代码小结<script type="module"> // es6引入three.js import * as THREE from "../build/three.module.js"; // 创建场景 const scene = new THREE.Scene(); // 创建物体形状(几何体) const geomeyry = new THREE.BoxGeometry(100, 100, 100); // 添加物体外观(材质) const material = new THREE.MeshBasicMaterial({ color: 0xff0000, }); // 创建网格模型 把形状外观放入模型中 const mesh = new THREE.Mesh(geomeyry, material); // 设置模型所在场景(Scene)中的位置 mesh.position.set(0, 10, 0); // 把模型添加到场景(Scene)中 scene.add(mesh); </script>
查看详情点赞1评论1收藏浏览612023-03-07 15:11:28go 发送邮件功能
上一篇 go-zero 数字图形验证码功能 之后,接下来我们要开发一个发送邮件的功能。框架还是go-zero,好吧,我们开始撸!1、引包:我们用到的是这个包(github.com/jordan-wright/email)github.com/jordan-wright/email2、新建一个邮件发送的工具:新建一个utils文件加,然后创建mail.go文件直接撸代码:我用的是163邮箱,开干之前。需要在邮箱进行配置。具体步骤百度一下或者联系我沟通。package utils import ( "crypto/tls" "fmt" "net/smtp" "strings" "github.com/jordan-wright/email" ) func Email(To, subject string, body string) error { to := strings.Split(To, ",") return send(to, subject, body) } func send(to []string, subject string, body string) error { from := "这里是发件人邮箱地址,需要自己配置" nickname := "这里是名称" secret := "秘钥" host := "smtp.163.com" port := 465 isSSL := true auth := smtp.PlainAuth("", from, secret, host) e := email.NewEmail() if nickname != "" { e.From = fmt.Sprintf("%s <%s>", nickname, from) } else { e.From = from } e.To = to e.Subject = subject e.HTML = []byte(body) var err error hostAddr := fmt.Sprintf("%s:%d", host, port) if isSSL { err = e.SendWithTLS(hostAddr, auth, &tls.Config{ServerName: host}) } else { err = e.Send(hostAddr, auth) } return err } OK,工具方法已经好了。我们开始引用:utils.Email(in.Email, "xxx", "您好,欢迎加入xxxxx!邮箱已发送,祝您使用愉快!")
查看详情点赞1评论收藏1浏览752023-03-03 16:22:48go 数字图形验证码功能
最近在开发一个项目,需要用到验证码,很久没有用到验证码的项目还不习惯;在网上参考了一些资料,简单用Go语言开发了一个数字验证码功能;用到的框架是最近比较火的一款 go-zero 微服务框架;首先,应用包,我用的是常用的包,验证码用的默认数字图形验证码;引入包:github.com/mojocn/base64Captchaetc yaml配置文件配置如下:Captcha: KeyLong: 6 ImgWidth: 240 ImgHeight: 80Config 文件验证码结构体:KeyLong int64 ImgWidth int64 ImgHeight int64 }到此,配置完成了,最后直接调用包new一个验证码// 获取验证码 func (l *GetCaptchaCodeLogic) GetCaptchaCode(in *member.GetCaptchaReq) (*member.GetCaptchaResp, error) { // 验证码 driver := base64Captcha.NewDriverDigit(int(l.svcCtx.Config.Captcha.ImgHeight), int(l.svcCtx.Config.Captcha.ImgWidth), int(l.svcCtx.Config.Captcha.KeyLong), 0.7, 80) cp := base64Captcha.NewCaptcha(driver, storeBlog) id, b64s, err := cp.Generate() fmt.Println(err) if err != nil { return &member.GetCaptchaResp{ Code: 500, Msg: "获取验证码失败", }, nil } return &member.GetCaptchaResp{ Code: 200, Msg: "获取成功", CaptchaId: id, PicPath: b64s, }, nil }用go-zero完成的简单的图形数字验证码功能就OK了。如果想要了解go-zero的api和protobuf文件,可以点击下面链接进行跳转。 go-zero微服务框架 api 案例 go-zero微服务框架 proto 案例
查看详情点赞评论收藏浏览372023-03-03 15:52:41流程引擎在Java中的使用
流程引擎是指一种用于定义、执行和管理业务流程的软件工具。在Java中,常用的流程引擎有Activiti、Camunda、jBPM等。这些流程引擎提供了一套标准的流程定义语言、流程执行引擎和流程管理工具,可以帮助开发人员快速地设计、实现和优化业务流程。以下是使用流程引擎的基本步骤:引入流程引擎库:根据具体的流程引擎选择相应的库文件,并将其引入项目中。定义流程模型:使用流程引擎提供的图形化工具或者XML文件定义业务流程模型。流程模型包括流程节点、流程变量、流程条件等。部署流程模型:将定义好的流程模型部署到流程引擎中,可以使用API接口或者管理界面实现。启动流程实例:根据流程模型创建流程实例,可以使用API接口或者管理界面实现。执行流程任务:根据流程模型执行流程任务,每个任务对应一个流程节点,可以使用API接口或者管理界面实现。处理流程事件:流程引擎支持各种事件(如流程开始、结束、节点执行等),可以通过注册事件监听器的方式进行处理。监控流程状态:流程引擎提供了流程监控工具,可以实时查看流程状态和性能指标。总之,在Java中使用流程引擎可以帮助开发人员快速实现业务流程,并提高流程的可控性和可管理性。但是需要注意,流程引擎并不是银弹,需要根据具体场景选择合适的解决方案。
查看详情点赞2评论1收藏1浏览972023-03-02 11:44:54分布式事务控制
分布式事务是指在分布式系统中跨多个节点和多个数据库执行的事务。由于分布式事务存在网络延迟、节点故障、数据同步等问题,因此需要采用一些控制方法来保证事务的正确性和一致性。以下是一些常用的分布式事务控制方法:两阶段提交(2PC):2PC 是一种经典的分布式事务协议,通过协调器(Coordinator)和参与者(Participant)两个角色来实现分布式事务的提交和回滚。2PC 分为投票阶段和提交阶段两个阶段,其中在投票阶段,协调器向所有参与者发送提交请求,参与者返回同意或者拒绝,如果所有参与者都同意,则进入提交阶段,否则回滚事务。2PC 算法能够保证事务的一致性,但是会带来性能和可扩展性的问题。三阶段提交(3PC):3PC 是在 2PC 的基础上发展而来,通过增加准备阶段来避免了 2PC 中的两阶段问题。3PC 分为准备阶段、提交阶段和确认阶段,其中在准备阶段,协调器会向参与者发送准备请求,参与者返回准备就绪或者失败,如果所有参与者都准备就绪,则进入提交阶段,否则回滚事务。在提交阶段,协调器向所有参与者发送提交请求,参与者返回提交就绪或者失败,如果所有参与者都提交就绪,则进入确认阶段,否则回滚事务。3PC 算法相对于 2PC 可以减少一次网络通信,但是仍然存在性能和可扩展性问题。补偿事务(Compensating Transaction):补偿事务是一种更加灵活的分布式事务处理方法,它通过记录操作的逆向操作,来实现事务的回滚和恢复。当发生异常时,通过执行补偿操作来回滚事务,从而保证数据的一致性。补偿事务相对于 2PC 和 3PC 更加灵活,但是需要开发者手动实现补偿逻辑,并且可能会引入一些数据不一致性的问题。消息队列(Message Queue):消息队列是一种异步处理和解耦的分布式消息传递机制,可以用于实现分布式事务的处理。通过将需要提交的事务操作封装成消息,将消息发送到消息队列中,然后由消费者节点异步处理消息,最终完成事务操作。消息队列相对于传统的分布式事务控制方法的优点是可以解耦和提高系统的可扩展性和可靠性。但是也存在一些缺点,比如性能、可靠性、一致性和复杂性等问题。因此,在实际应用中需要根据具体的场景和需求来选择合适的分布式事务控制方法。另外,除了以上提到的控制方法,还有一些其他的分布式事务控制方法,比如 TCC(Try-Confirm-Cancel)事务、本地消息表(Local Message Table)等。这些方法都有各自的优缺点和适用场景,需要根据实际情况进行选择。总的来说,分布式事务的控制是一个比较复杂和关键的问题,需要考虑各种因素,包括性能、可靠性、一致性和复杂性等。在实际应用中需要根据具体的场景和需求来选择合适的控制方法,并且需要注意分布式事务的设计和实现,以保证事务的正确性和一致性。
查看详情点赞13评论收藏浏览512023-03-02 11:43:09软件开发设计模式
根据参考书《Design Patterns - Elements of Reusable Object-Oriented Software》中所提到的,总共有23种设计模式。这些模式可以分为三大类:1. 创建型模式(Creational Patterns):用来描述如何创建对象,它的主要特点是“将对象的创建与使用分离”。包括以下5种:* 工厂方法模式(Factory Method Pattern)* 抽象工厂模式(Abstract Factory Pattern)* 单例模式(Singleton Pattern)* 建造者模式(Builder Pattern)* 原型模式(Prototype Pattern)2. 结构型模式(Structural Patterns):用来描述如何将类或对象按某种布局组成更大的结构。包括以下7种:* 适配器模式(Adapter Pattern)* 桥接模式(Bridge Pattern)* 组合模式(Composite Pattern)* 装饰器模式(Decorator Pattern)* 外观模式(Facade Pattern)* 享元模式(Flyweight Pattern)* 代理模式(Proxy Pattern)3. 行为型模式(Behavioral Patterns):用来描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责。包括以下11种:* 职责链模式(Chain of Responsibility Pattern)* 命令模式(Command Pattern)* 解释器模式(Interpreter Pattern)* 迭代器模式(Iterator Pattern)* 中介者模式(Mediator Pattern)* 备忘录模式(Memento Pattern)* 观察者模式(Observer Pattern)* 状态模式(State Pattern)* 策略模式(Strategy Pattern)* 模板方法模式(Template Method Pattern)* 访问者模式(Visitor Pattern)有以下中文记忆口诀可以帮助记忆这些设计模式:* SOLID原则:SOLID CD(稳固的CD)。* 创建型模式五种:创工原单建抽(创公园,但见愁)。* 结构型模式七种:结享外组适代装桥(姐想外租,世代装桥)。* 行为型模式十一种:行状责中模访解备观策命迭(形状折中模仿,戒备观测鸣笛)。可以用以下编程语言来示例设计模式的代码:* Java* C#* C++* Go* PHP* Python* Ruby* Swift
查看详情点赞评论收藏浏览412023-03-02 11:39:07Nginx config配置文件基本配置示例
nginx的基本配置,需要注意的有以下几点:1、1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址; 2.$remote_user :用来记录客户端用户名称; 3.$time_local : 用来记录访问时间与时区;4.$request : 用来记录请求的url与http协议;5.$status : 用来记录请求状态;成功是200, 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;7.$http_referer :用来记录从那个页面链接访问过来的; 8.$http_user_agent :记录客户端浏览器的相关信息;2、惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。3、每个指令必须有分号结束。示例:upstream xxx.com { server 192.168.136.130:3000 weight=5 fail_timeout=30s; } server { listen 80; server_name xxx.com; rewrite ^(.*)$ https://$host$1 permanent; location / { proxy_pass http://xxx.com; proxy_buffering off; proxy_http_version 1.1; proxy_request_buffering off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 180; proxy_read_timeout 180; proxy_send_timeout 180; } location /api { proxy_pass http://192.168.136.130:31900/; proxy_buffering off; proxy_http_version 1.1; proxy_request_buffering off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 180; proxy_read_timeout 180; proxy_send_timeout 180; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } server { listen 443 ssl; server_name xxx.com; client_max_body_size 200m; ssl_certificate /www/wdlinux/nginx/cert/xxx.com.pem; ssl_certificate_key /www/wdlinux/nginx/cert/xxx.com.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { proxy_pass http://xxx.com; proxy_buffering off; proxy_http_version 1.1; proxy_request_buffering off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 180; proxy_read_timeout 180; proxy_send_timeout 180; # add_header 'Access-Control-Allow-Origin' '*'; # add_header 'Access-Control-Allow-Methods' '*'; # add_header 'Access-Control-Allow-Credentials' 'true'; # add_header 'Access-Control-Allow-Headers' 'X-Requested-With'; } location /api { proxy_pass http://192.168.136.130:31900/; proxy_buffering off; proxy_http_version 1.1; proxy_request_buffering off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 180; proxy_read_timeout 180; proxy_send_timeout 180; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } user nginx nginx ;Nginx用户及组:用户 组。window下不指定worker_processes 8;工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。error_log logs/error.log; error_log logs/error.log notice; error_log logs/error.log info; 错误日志:存放路径。pid logs/nginx.pid; pid(进程标识符):存放路径。 worker_rlimit_nofile 204800;指定进程可以打开的最大描述符:数目。这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。现在在Linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。events{use epoll;使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。补充说明:与apache相类,nginx针对不同的操作系统,有不同的事件模型A)标准事件模型Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或pollB)高效事件模型Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。Epoll:使用于Linux内核2.6版本及以后的系统。/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。worker_connections 204800;没个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。worker_processes*worker_connectionskeepalive_timeout 60;keepalive超时时间。client_header_buffer_size 4k;客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE 取得。[root@web001 ~]# getconf PAGESIZE4096但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。 open_file_cache max=65535 inactive=60s;这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。open_file_cache_valid 80s;这个是指多长时间检查一次缓存的有效信息。open_file_cache_min_uses 1;open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。}##设定http服务器,利用它的反向代理功能提供负载均衡支持http{include mime.types;设定mime类型,类型由mime.type文件定义 default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';日志格式设置。$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址; $remote_user:用来记录客户端用户名称; $time_local: 用来记录访问时间与时区; $request: 用来记录请求的url与http协议; $status: 用来记录请求状态;成功是200, $body_bytes_sent :记录发送给客户端文件主体内容大小; $http_referer:用来记录从那个页面链接访问过来的; $http_user_agent:记录客户浏览器的相关信息;通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。access_log logs/host.access.log main; access_log logs/host.access.404.log log404;用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径;server_names_hash_bucket_size 128;#保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.client_header_buffer_size 4k;客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。large_client_header_buffers 8 128k;客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。open_file_cache max=102400 inactive=20s;这个指令指定缓存是否启用。例: open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; open_file_cache_errors语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件是记录cache错误.open_file_cache_min_uses语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 使用字段:http, server, location 这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态.open_file_cache_valid语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息. client_max_body_size 300m;设定通过nginx上传文件的大小sendfile on;sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。tcp_nopush on;此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用proxy_connect_timeout 90; 后端服务器连接的超时时间_发起握手等候响应超时时间proxy_read_timeout 180;连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)proxy_send_timeout 180;后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据proxy_buffer_size 256k;设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小proxy_buffers 4 256k;设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8kproxy_busy_buffers_size 256k;proxy_temp_file_write_size 256k;设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长proxy_temp_path /data0/proxy_temp_dir; proxy_temp_path和proxy_cache_path指定的路径必须在同一分区 proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;#设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。keepalive_timeout 120;keepalive超时时间。tcp_nodelay on;client_body_buffer_size 512k;如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误proxy_intercept_errors on;表示使nginx阻止HTTP应答代码为400或者更高的应答。upstream bakend {server 127.0.0.1:8027;server 127.0.0.1:8028;server 127.0.0.1:8029;hash $request_uri;}nginx的upstream目前支持4种方式的分配1、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。2、weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。例如:upstream bakend {server 192.168.0.14 weight=10;server 192.168.0.15 weight=10;}2、ip_hash每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。例如:upstream bakend {ip_hash;server 192.168.0.14:88;server 192.168.0.15:80;}3、fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。upstream backend {server server1;server server2;fair;}4、url_hash(第三方)按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法upstream backend {server squid1:3128;server squid2:3128;hash $request_uri;hash_method crc32;}tips:upstream bakend{#定义负载均衡设备的Ip及设备状态}{ip_hash;server 127.0.0.1:9090 down;server 127.0.0.1:8080 weight=2;server 127.0.0.1:6060;server 127.0.0.1:7070 backup;}在需要使用负载均衡的server中增加proxy_pass http://bakend/;每个设备的状态设置为:1.down表示单前的server暂时不参与负载2.weight为weight越大,负载的权重就越大。3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误4.fail_timeout:max_fails次失败后,暂停的时间。5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。nginx支持同时设置多组的负载均衡,用来给不用的server来使用。client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debugclient_body_temp_path设置记录文件的目录 可以设置最多3层目录location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡##配置虚拟机server { listen 80; #配置监听端口 server_name image.***.com; #配置访问域名 location ~* \.(mp3|exe)$ { #对以“mp3或exe”结尾的地址进行负载均衡 proxy_pass http://img_relay$request_uri; #设置被代理服务器的端口或套接字,以及URL proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #以上三行,目的是将代理服务器收到的用户的信息传到真实服务器上 }##其他举例server { listen 80; server_name *.***.com *.***.cn; location ~* \.(mp3|exe)$ { proxy_pass http://img_relay$request_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { if ($http_user_agent ~* "xnp") { rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect; } proxy_pass http://img_relay$request_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #error_page 404 http://i1.***img.com/help/noimg.gif; error_page 404 502 = @fetch; } location @fetch { access_log /data/logs/baijiaqi.log log404; rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect; } } server { listen 80; server_name *.***img.com; location ~* \.(mp3|exe)$ { proxy_pass http://img_relay$request_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { if ($http_user_agent ~* "xnp") { rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif; } proxy_pass http://img_relay$request_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #error_page 404 http://i1.***img.com/help/noimg.gif; error_page 404 = @fetch; } #access_log off; location @fetch { access_log /data/logs/baijiaqi.log log404; rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect; } } server { listen 8080; server_name ngx-ha.***img.com; location / { stub_status on; access_log off; } } server { listen 80; server_name imgsrc1.***.net; root html; } server { listen 80; server_name ***.com w.***.com; # access_log /usr/local/nginx/logs/access_log main; location / { rewrite ^(.*)$ http://www.***.com/ ; } } server { listen 80; server_name *******.com w.*******.com; # access_log /usr/local/nginx/logs/access_log main; location / { rewrite ^(.*)$ http://www.*******.com/; } } server { listen 80; server_name ******.com; # access_log /usr/local/nginx/logs/access_log main; location / { rewrite ^(.*)$ http://www.******.com/; } } location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file conf/htpasswd; }#设定查看Nginx状态的地址location ~ /\.ht { deny all; } #禁止访问.htxxx文件 }注释:变量Ngx_http_core_module模块支持内置变量,他们的名字和apache的内置变量是一致的。首先是说明客户请求title中的行,例如$http_user_agent,$http_cookie等等。此外还有其它的一些变量$args此变量与请求行中的参数相等 $content_length等于请求行的“Content_Length”的值。 $content_type等同与请求头部的”Content_Type”的值 $document_root等同于当前请求的root指令指定的值 $document_uri与$uri一样 $host与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样 $limit_rate允许限制的连接速率 $request_method等同于request的method,通常是“GET”或“POST” $remote_addr客户端ip $remote_port客户端port $remote_user等同于用户名,由ngx_http_auth_basic_module认证 $request_filename当前请求的文件的路径名,由root或alias和URI request组合而成 $request_body_file $request_uri含有参数的完整的初始URI $query_string与$args一样 $sheeme http模式(http,https)尽在要求是评估例如 Rewrite ^(.+)$ $sheme://example.com$; Redirect; $server_protocol等同于request的协议,使用“HTTP/或“HTTP/ $server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。 $server_name请求到达的服务器名 $server_port请求到达的服务器的端口号 $uri等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index
查看详情点赞评论收藏浏览592023-03-02 11:25:39导弹制造流程
导弹制造流程主要分为研制和生产两个阶段,每个阶段都包含了多个步骤,如下所示:研制阶段: 设计阶段:根据任务需求和技术要求,进行导弹的总体设计和方案确定。* 技术研究阶段:包括弹体外形设计、材料选型、动力系统研制、制导系统研制、试验测试等。 试验验证阶段:对导弹进行多项试验验证,包括静态试验、动态试验、环境适应性试验、系统一体性试验等。生产阶段: 毛坯制造:将所需材料加工成相应的毛坯。 零件加工:对毛坯进行加工,制造出各个零部件。 部件组装:将各个零部件组装成部件。 全弹总装:将所有部件组装成完整的导弹。 试验测试:对导弹进行各项试验测试,如静态试验、动态试验、全弹试验等。 导弹制造厂主要负责弹体的制造和全弹的总装,弹上安装的发动机、控制仪器及各种装置均由专业厂所提供。不同类型的导弹可能有不同的制导方式,常见的制导方式包括: 激光制导:需要激光指示器照射目标。* 雷达制导:通过雷达头持续照射目标。 红外制导:通过红外引导头照射辐射源。* 电视制导:通过摄像头观察目标校准。 GPS制导:将目标坐标预先输入导弹电脑中规划路线有发射后不管的能力。 有线制导:多用于反坦克导弹后面拖着一根线。 惯性制导:多用于弹道弹道速度较快。弹道导弹的制造主要分为三步:造弹头、造弹身、造弹尾。其中,造弹头和造弹身相对简单,而造弹尾则是重点。弹尾需要喷,因此需要先做一个药柱箱,然后将药装进去。弹头、弹身、弹尾装在一起,就可以制造出一枚地道的弹道导弹了。
查看详情点赞1评论1收藏1浏览972023-03-02 11:13:55