问题:单位只给windows server,部署环境被迫使用 jruby trinidad + nginx + mongodb,每次启动app需要开4个窗口(2个jruby)。共用的服务器经常被人关窗口,服务器重启后需手动启动。
解决办法:写windows 服务。
1. 使用win32-service gem。
需要本地编译。
gem install win32-service。
文档见http://win32utils.rubyforge.org/
2.编写服务
服务分为两个部分,一是service 安装和卸载的部分。另一部分为服务内容部分。
可参照
http://stackoverflow.com/questions/163497/running-a-ruby-program-as-a-windows-service
简化版的service 安装部分如下:
require "win32/service" include Win32 class String; def to_dos() self.tr('/','\\') end end class String; def from_dos() self.tr('\\','/') end end #override to support utf8 class String; def strip() self end end rubyexe="C:/bin/ruby.exe".to_dos SERVICE_FILE= (File.expand_path(File.dirname(File.dirname(__FILE__)))+ '/service.rb').to_dos SERVICE_NAME="Test Service" if ARGV[0] case ARGV[0] when "install" Service.new( :service_name => SERVICE_NAME, :service_type => Service::WIN32_OWN_PROCESS, :start_type => Service::AUTO_START, :error_control => Service::ERROR_NORMAL, :binary_path_name => "#{rubyexe} #{SERVICE_FILE}", :description => 'Run nginx, jruby all in one' ) when "uninstall" Service.delete(SERVICE_NAME) end end
注意:为何重载String.strip
原因在于中文版windows在安装服务过程中调用get_last_error会返回utf-8的字符,此时win32-service gem的error.rb会报invalidate byte sequence的错误。
原因是对字符串进行了strip
如果不进行strip则没有任何问题。
服务部分的代码如下:
#service.rb require 'win32/daemon' include Win32 SERVICE_LOG = File.expand_path(File.dirname(File.dirname(__FILE__)))+ '/services.log' JR_PATH = 'c:\jruby-1.7.0\bin' JR_LOG = File.expand_path(File.dirname(File.dirname(__FILE__)))+ '/jruby.log' class Daemon def service_main while running? if @pid.nil? @pid = Process.spawn('c:\nginx-1.2.1\nginx.exe', chdir: 'c:\nginx-1.2.1', out: SERVICE_LOG, err: :out) Process.detach @pid if @pid_jruby.nil? @pid_jruby = [] start_jruby end Process.waitpid(@pid) else sleep(3) end end end def service_stop if @pid pid_kill = Process.spawn('c:\nginx-1.2.1\nginx.exe -s stop', chdir: 'c:\nginx-1.2.1', out: SERVICE_LOG, err: :out) Process.waitpid(pid_kill) end if @pid_jruby.size > 0 @pid_jruby.each do |pid| pid_kill = Process.kill(9, pid) end end end def start_jruby if @pid_jruby.empty? [3000, 4000].each do |port| cmd = "#{JR_PATH}\\jruby.exe -S trinidad -e production -p #{port}" pid = Process.spawn(cmd, chdir: 'C:\app\', out:JR_LOG, err: :out) @pid_jruby << pid Process.detach pid end end end end Daemon.mainloop
结果:
以上代码在ruby 1.9.3 win7 上通过
如在win7上报安装权限不足,请使用administrator 启动cmd console。
代码尚有refactory的空间,时间仓促,敬请谅解。
相关推荐
windows启动nginx脚本
nginx开机自启动配置文件,在[CentOS 7.6 64位]系统下运行正常。 编译安装nginx后,将该配置文件放在服务器的/usr/lib/systemd/system/目录下,然后启动nginx服务。
NULL 博文链接:https://xml.iteye.com/blog/1608347
利用强大的nginx进行多个端口转发服务,并集成到windows service里面
::通过本管理器可以实现nginx系统服务的安装卸载,启动和关闭 ::xiangyuecn编写,学习nginx之用,还没弄懂怎么配置nginx,先把安装问题先解决了,不然服务器一注销nginx也自动关掉了 ::...
windows 下nginx 日志切割 结合windows任务计划,实现每天备份日志,并reopen nginx
Windows Service Wrapper nginx windows 注册服务 放在nginx根目录下面(与nginx.exe平级,配置文件不用改), 管理员cmd , nginx-service install 即可,服务就注册好了
Windows下Nginx配置SSL实现Https访问(包含证书生成)
使用Windows Service Wrapper为nginx添加服务。 将wsw.exe 和wsw.xml放到nginx根目录下,必须同名。
这里只是最基本nginx配置,Windows版本nginx,支持RTMP模块已经配置完成,并建立live实例,下载完把nginx-1.7.11.3-Gryphon放入一个没有中文的路径中。
ubuntu开机自启动nginx服务
启动nginx命令说明:需要注意,由于nginx默认端口也是80端口,如果此时你的机器上开启了Apache或者IIS服务,切忌在启动nginx之前务必关闭IIS或Apache服务,否则nginx启动命令不会成功。 nginx命令:停止nginx ...
此文档详细介绍了Windows下Nginx的安装与配置,可以让用户在最短的时间内完全配置好nginx!
把nginx 变成Windows服务来启动,做到开机自动启动,关闭、启动服务直接控制nginx的关闭、启动,方便快捷
tengine以service方式进行启动,默认安装。直接make&& make install后默认路径启动安装,如果路径有变动,请自行修改
Windows Service Wrapper用于把Nginx配置成服务,详细操作见博客
windows系统下将nginx作为系统服务启动,教程加资源,我在windows server 2008r上亲测布署nginx-1.12.2,可以使用
windows下带fancyindex的nginx
(1)首先修改nginx-service.xml,把里面nginx的位置信息改为你的nginx信息,我这里nginx是直接解压到D盘,如果放在其他位置,替换掉D:\nginx为相应的位置即可,共5处。 <service> <id>nginx <name>Nginx Service ...
windows下 php+nginx配置详解,经整理修改测试通过,希望和大家一起分享!