把 Nginx 创建为 Windows 的一个服务

译序 :Nginx 不是为 Windows 而写。Nginx 是用在软件的工作环境中的。但软件开发环境一般都是 Windows,有时调试的需要也要装 Nginx,但 Nginx 并没给 Windows 提供服务支持。如何把 Nginx 创建为 Windows 的一个服务呢?百度一下,搜索结果的前几页基本都是同一篇文章,只是网址不同作者不同。根本分不清谁是原创,谁是转载。我想,如果先写那篇文章的人搞错了一点事情(但不能是影响使用的错误),那么这点错误的观点会被第二个,第三个...一直复制错下去。喟叹国内某些程序员们做事不够严谨哈。相对来说,印度程序员做事就相当较真了,如果读者有兴趣的话,可以去看一下印度人写的博客。比如安装 JDK,他们会先给你介绍 JDK 和 JRE 的区别,然后才介绍下载安装。中国软件为什么不如印度软件发达,程序员们做事不够严谨,许是其中一个重要的原因吧。——扯远了,反正看着那么多雷同的文章,我没有觉得它们有多么高的参考价值。索性去看老外的了。当然,老外写的也未必就是对的。但冲着他们的那份严谨,我看到了一种敬业的精神。敬业者的文章值得每一位读者仔细品读。
         把 Nginx 创建为 Windows 的一个服务,比较流行的一个做法就是用微软提供的 instsrv/servany。本文没有使用这种做法,并说明理由
         引言
        Nginx 是一个 web 服务器。它类似于 Lighttpd,作为轻量级的 web server,可以替代重量级的 Apache/IIS。Nginx 专为性能优化而开发,是一个快速且能经受高负载考验的 web server。它来自于 Linux 世界但同样可以运行在 Windows 上面(由本地语言构建)。唯一的问题就是它不支持 Windows Services。
        注
        尽管 Nginx 以快速和提供高性能而具有很大的声誉,但并非是在 Windows 平台上。访问官方网址  http://nginx.org/en/docs/windows.html ,你会发现,对于 Windows 平台的支持被认为是测试版,根据 Nginx 的实现来看它并不提供(和 Linux 平台)相同的性能水平。
        也许你都没有意识到,WordPress 就是一个 Nginx 的用户,使用它提供大量的静态内容服务,并负载平衡请求到其他服务器。如果你想了解更多关于 Nginx 的内容请看本文底部的链接。
         Nginx 对比 Windows 服务
        Nginx 是绿色免安装的。这里我不去介绍它的管理配置,官方已经提供了一个很棒的 wiki,上面有丰富的服务器相关信息(参考文后链接)。可以使用默认的配置,它会使用 Nginx 目录下的 html 文件夹服务于端口 80。

        只需简单地执行 nginx.exe 即可启动 Nginx。但你想要停止它的时候问题来了,你需要执行以下命令:

[plain]  view plain  copy
 print ?
  1. nginx.exe -s stop  

        虽然这很简单,但是如果它能够像 apache 或 IIS 那样作为一个服务工作的话会更漂亮。那样的话,我们就可以设置机器启动时 Nginx 自动启动,还可以方便地启动、停止或者重启服务,设置恢复选项、依赖的服务,等等。
         为什么不使用 instsrv/servany、FireDaemon 或者其他办法呢
        已经有介绍如何通过 FireDaemon 使用 Nginx,但它有一个很重要的问题。Nginx 启动以后,它会创建一个次级进程。所以会有两个 nginx.exe 在运行。对于这个官方可能有一个很合理的理由,但你最好到 Nginx 论坛去问为什么:-)
        通过 instsrv/srvany(微软官方创建服务的方法) 或者 FireDaemon 的方式(来创建 Nginx 为服务),只是启动进程,当你想要停止它时,将关闭这个进程。但这些方式都无法关闭多余的那个 nginx.exe 进程。所以每次你停止/启动/重启服务都会产生一个多余的 nginx.exe 进程。不怎么好!
         把 Nginx 创建为 Windows 的一个服务(一个较好的做法)
        多亏了一个叫做 " Windows Service Wrapper " 的小项目,我们有了一个办法来恰当地启动和停止 Nginx。首先从 http://download.java.net/maven/2/com/sun/winsw/winsw/  下载最新的 exe 程序(Misterdai 写本文时最新的是 "winsw-1.8-bin.exe"。译者已经上传了一个 winsw-1.8-bin.exe 到 CSDN 资源,下载地址: http://download.csdn.net/detail/defonds/4517957 )。
        得到该程序后,将其放在 Nginx 安装目录下,并重命名为 myapp.exe。
        然后是告诉 WinSw 我们想要它做什么。这将使用一个 XML 配置文件,我们将在文件中指出 Nginx 需要一个 shutdown 命令。

        (在 Nginx 安装目录下)新建一个名为 myapp.xml 的文件,编辑其内容如下:

[html]  view plain  copy
 print ?
  1. <service>  
  2.  <id>nginx</id>  
  3.  <name>nginx</name>  
  4.  <description>nginx</description>  
  5.  <executable>c:\nginx\nginx.exe</executable>  
  6.  <logpath>c:\nginx\</logpath>  
  7.  <logmode>roll</logmode>  
  8.  <depend></depend>  
  9.  <startargument>-p c:\nginx</startargument>  
  10.  <stopargument>-p c:\nginx -s stop</stopargument>  
  11. </service>  

        很明显,你应该稍微更改文件,这取决于你自己的文件路径。对于有更多技术需求的朋友,你也可以在该文件中设置 Nginx 依赖的服务。

        最后,我们要安装服务了。只需要简单地执行以下语句,你将在你的服务列表里找到 "Nginx" 服务:

[plain]  view plain  copy
 print ?
  1. c:\nginx\myapp.exe install  

        就这些!
         结束语
        根据我的经验,到目前为止这种做法的效果很完美。你得到了 Windows 服务的支持,而且在服务重启时没有遗留孤立的 "nginx.exe"。两全其美。
        如果 Nginx 自己可以做到这样的话会更好,但 Nginx 的作者当下正在专注于其他更重要的开发。我敢肯定还有其他人有足够的编程知识来贡献这块所需的代码,所以,如果你是这样的一个人,请尽力来帮助大家。
         资料链接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在你的Windows电脑上安装好Docker。可以在官网上下载并安装。 接下来,我们需要创建一个Dockerfile,用于构建我们的镜像。在一个空白目录下创建一个名为Dockerfile的文件,文件内容如下: ``` # 使用python官方镜像作为基础镜像 FROM python:3 # 设置工作目录 WORKDIR /app # 将当前目录下的所有文件都拷贝到镜像的/app目录下 COPY . /app # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 暴露80端口 EXPOSE 80 # 启动命令,执行python app.py CMD ["python", "app.py"] ``` 接下来,在该目录下创建一个名为requirements.txt的文件,用于存放Python依赖库: ``` Flask ``` 然后,我们需要创建一个名为app.py的Python文件,用于启动web服务: ``` from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=80) ``` 最后,我们需要创建一个NGINX配置文件,用于将HTTP请求转发到我们的web服务。在该目录下创建一个名为nginx.conf的文件,文件内容如下: ``` worker_processes 1; events { worker_connections 1024; } http { upstream app { server web:80; } server { listen 80; location / { proxy_pass http://app; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } } ``` 现在,我们已经准备好了所有的文件,接下来就是构建镜像并启动容器了。在该目录下打开终端,输入以下命令: ``` # 构建镜像 docker build -t web . # 启动容器 docker run -d -p 80:80 --name my_web --network my_network web ``` 解释一下这个命令: - docker build:用于构建镜像,-t参数用于指定镜像名称,.表示Dockerfile所在的目录。 - docker run:用于启动容器,-d参数表示后台运行,-p参数用于将容器的80端口映射到主机的80端口,--name参数用于指定容器名称,--network参数用于指定容器所在的网络,最后是镜像名称。 现在,你就可以在浏览器中访问http://localhost,就可以看到Hello, World!了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值