「PHP」以nginx、php-cgi为例,把nginx、php-cgi安装为Windows系统服务
在上文中,我们使用了nginx + php-cgi 来配置thinkphp的运行环境,项目已成功运行,可以很开心的开发php项目了。
以Nginx、php-cgi为例,为Windows安装系统服务
但是也并不是高枕无忧了,此时的项目环境存在着以下几个问题:
- 每次开机,都要把所有的软件环境重新运行一遍,因为软件的运行在关机后就停止了,重新开机的时候并没随操作系统的启动重新启动起来;
- 每次都要把重新这些软件运行一遍,过于繁琐;如果在本地开发,尚且可以忍忍,但是部署到服务器上,还能忍?显然是不能的。
- 项目运行中一旦发生异常,就会导致php-cgi停止运行;这对无论是开发中的,还是上线运行中的项目,都是一个阻碍,必须要克服;
- 对于php.ini修改无法平滑重启,每次修改php配置,都得重启php-cgi;
解决方案
如果把nginx 和 php-cgi注册为windows系统服务,设置开机启动;这样nginx和php-cgi便能作为系统服务,持续运行,并且在开机时就能随系统一起启动;然后在windows任务管理器中就能对nginx 服务和php-cgi服务进行管理。
把nginx 和 php-cgi注册为windows系统服务需要WinSW和xxfpm的支持;所以,我们首先要来下载这两个程序,下载地址如下:
WinSW和xxfpm 下载地址
下载WinSW和xxfpm
下载选择的时候根据自己的操作系统,选择对应的安装包即可;对于xxfpm,直接下载就好,因为只有windows版;
下载 xxfpm
对于WinSW,针对不同的.net版本,提供了不同的安装包,这里选择.NET4版本的就好;
下载 WinSW
然后,把下载好的文件解压,以待下一步使用。
WinSW
WinSW是一个可用于包装和管理作为Windows服务的自定义进程的工具,可以对windows中的服务程序进行管理(注册、卸载、启动、停止、重启等操作),其本质上就是一个可执行的二进制文件,运行于windows系统下。
WinSW对系统服务的管理功能和在windows任务管理器中的操作是一样的;从2.x开始WinSW 托管于github平台;在下载完成解压后,其可执行的操作命令如下所示:
- install将服务安装到Windows服务控制器中;
- uninstallWindows服务控制器中卸载服务;
- start启动已经安装的服务;
- stop停止已经启动的服务;
- restart重新启动服务;如果该服务当前未运行,则此命令会将服务启动;
- status检查服务的当前状态;
命令的运行格式
命令需要在WinSW.exe 所在的目录下才能执行,由于WinSW初始的名称是WinSW.exe,所以要在命令前加上进程名称,比如:安装服务的完整命令就是:winsw install;(后缀.exe是可以省略的)
支持修改名称
WinSW.exe 支持修改名称,比如在nginx中,其名称可修改为:nginx-service.exe; 在php中,名称则可修改为php-cgi-service.exe;
xml 配置文件
WinSW 的服务管理的配置功能需要xml文件来完成,每个进程的xml文件的名称需要和WinSW 进程的名称一样;如果WinSW.exe 修改成了nginx-service.exe,对应的xml文件名称就要修改为nginx-service.xml。
WinSW 提供了初始的xml文件示例,有mini版和完整版,名称分别是sample-minimal.xml和sample-allOptions.xml;WinSW xml的示例文件如下:
WinSW xml的示例文件
xml 配置条目
- id 用于标识Windows内服务的ID,这个值在系统中安装的所有服务中必须是唯一的,并且应完全由字母数字字符组成。
- name 服务的显示名称,可以包含空格和其他字符,不过名称不宜太长。
- description 服务的介绍描述,它会将显示在Windows服务管理器中。
- executable 指定要启动的可执行文件,文件路径可以是绝对路径,也可以只指定可执行文件名称并从中搜索PATH
- startmode 该元素指定Windows服务的启动模式,默认值是Automatic,它可以是以下值之一:Boot,System,Automatic或Manual。
- delayedAutoStart 如果Automatic定义了启动模式,则此布尔选项启用延迟启动模式。请注意,此启动模式将不适用于早于Windows 7和Windows Server 2008的旧Windows版本。
- depend 指定此服务依赖的其他服务的ID,可以使用多个元素来指定多个依赖项。比如:<depend>Eventlog</depend><depend>W32Time</depend>
- logging 此项是可选的,可用于设置日志路径, 比如:<logpath>日志路径</logpath>
- argument 指定要传递给可执行文件的参数,Winsw会在必要时用引号将每个引号<argument>引起来,因此请勿在引号中加引号,以避免产生双引号。
- stopargument/stopexecutable 用于指定停止参数和停止时执行的操作。
注册nginx服务
在对WinSW有了足够的了解之后,就可以开始着手开始把nginx注册为Windows服务。以下是详细步骤:
1.把下载的WinSW.exe复制到Nginx根目录下,并重命名为nginx-service.exe;
2.在同级目录下,新建一个xml文件,命名为nginx-service.xml,在nginx-service.xml文件中输入以下内容,并保存;
nginx-service.xml 文件内容
3.在nginx-service.exe所在的目录下运行cmd,依次输入命令:
- nginx-service.exe install
- net start nginx-service.exe
至此,nginx-service.exe 不仅成功注册,还能成功运行。
注册php-cgi服务
注册php-cgi服务不仅需要WinSW.exe的支持,还需要xxfpm的支持。因此,之前下载的xxfpm便是在这里使用的;注册php-cgi服务详细步骤如下:
1.在下载的xxfpm的bin目录下,有三个文件,分别是pthreadGC2.dll、xxfpm和xxfpm.exe,需要的是pthreadGC2.dll、xxfpm.exe;
xxfpm 目录
2.把pthreadGC2.dll、xxfpm.exe复制到php语言的根目录下,与php-cgi.exe 同级;
3.把下载的WinSW.exe复制到Nginx根目录下,并重命名为php-cgi-service.exe;
4.在同级目录下,新建一个xml文件,命名为php-cgi-service.xml,在php-cgi-service.xml文件中输入以下内容,并保存;
php-cgi-service.xml 文件内容
3.在php-cgi-service.exe所在的目录下运行cmd,依次输入命令:
- php-cgi-service.exe install
- net start php-cgi-service.exe
至此,php-cgi-service.exe
不仅成功注册,还能成功运行。对于nginx,也可作类似的操作,将其安装系统服务,实现开机自启动。
完结,老夫虽不正经,但老夫一身的才华!关注我,获取更多编程科技知识。
- MySQL快速入门
- SQL学习之联结表的使用
- 快速入门系列--WCF--07传输安全、授权与审核
- JavaScript之面向对象学习四原型对象的动态性
- Apache顶级开源项目——机器学习库MADlib简介与应用实例
- 快速入门系列--WCF--06并发限流、可靠会话和队列服务
- 以太坊创始人或将卖掉所有以太坊,以太经典ETC才是未来
- SQL学习之HAVING过滤分组
- 快速入门系列--WCF--04元数据和异常处理
- linq to sql中慎用Where<T>(Func<TSource, bool> predicate),小心被Linq给"骗"了!
- 快速入门系列--WCF--03RESTFUL服务与示例
- SQL练习之不破坏应用程序现有查询的修改模式
- 快速入门系列--WCF--02消息、会话与服务寄宿
- JavaScript之面向对象学习二(原型属性对象与in操作符)获取对象中所有属性的方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用dig/nslookup命令查看dns解析的方法步骤
- Go 数据存储篇(七):GORM 使用入门
- 在 Linux 上使用 Multitail命令的教程
- 深入理解linux执行文件提示No such file or directory的背后原因
- Laravel 控制器:从 MVC 模式聊起
- 基于yolo5工地安全帽和禁入危险区域识别系统,附数据集
- Go 常见并发模式实现(一):调度后台处理任务的作业程序
- 路由使用进阶(二)
- linux No space left on device由索引节点(inode)爆满引发500问题
- linux中批量添加文件前缀的操作方法
- Go 常见并发模式实现(二):通过缓冲通道实现共享资源池
- 在 Linux 终端中查找域名 IP 地址的命令(五种方法)
- Laravel 表单方法伪造与 CSRF 攻击防护
- Java图形验证码支持gif、中文、算术等
- Go 常见并发模式实现(三):通过无缓冲通道创建协程池