欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

nginx for windows

程序员文章站 2022-03-18 14:07:46
一.介绍安装 公司由于linux云服务器还没批下来,暂时先在windows服务器上测试。Windows版nginx使用本地Win32 API(而非Cygwin仿真层)。当前仅使用select()和poll()(1.15.9)连接处理方法(事件驱动模型),因此不应期望高性能和可伸缩性(在linux上支 ......

一.介绍安装

  公司由于linux云服务器还没批下来,暂时先在windows服务器上测试。windows版nginx使用本地win32 api(而非cygwin仿真层)。当前仅使用select()和poll()(1.15.9)连接处理方法(事件驱动模型),因此不应期望高性能和可伸缩性(在linux上支持epoll,它是性能最高的一种)。由于这个原因和其他一些已知问题,适用于windows的nginx版本被认为是beta版本。目前,除了xslt过滤器,图像过滤器,geoip模块和嵌入式perl语言之外,它提供的功能几乎与unix版本的nginx相同。

  1.1下载安装

    windows下载安装包1.17.7 

    

    启动nginx, 没有找到nginx.exe进程,

  c:\users\administrator>cd c:\nginx-1.17.7
  c:\nginx-1.17.7>start nginx

   查看日志c:\nginx-1.17.7\logs 

   2020/01/03 13:55:53 [emerg] 11992#35328: bind() to 0.0.0.0:80 failed (10013: an attempt was made to access a socket in a way forbidden by its access permissions)

 

 1.2 查看谁占用了80端口   

  c:\nginx-1.17.7>netstat -ano|findstr "80"
  tcp 0.0.0.0:80 0.0.0.0:0 listening 4

  nginx for windows

       可能是http,查看下http服务状态:

   c:\nginx-1.17.7>netsh http show servicestate 

       发现6468占用了,再查看任务管理器,是iis占用了,如下所示:

    nginx for windows

   

  1.3 解决windows 80端口被iis占用

   方法1,启动栏输入regedit

     hkey_local_machine\system\currentcontrolset\services\http

     将start 的3改为0 

       重启服务器,

   方法2:直接关闭iis中的默认站点 default web site

     再次启动 查看进程状态 tasklist /fi "imagename eq nginx.exe"

  nginx for windows

   一个是主进程(守护进程),另一个工作进程

     访问,查看nginx首页

   nginx for windows

  1.4 nginx 命令管理

    nginx -s stop    快速结束服务

      nginx -s quit     正常结束服务

              nginx -s reload 更改配置,使用新配置启动新工作进程,正常关闭旧工作进程

    nginx -s reopen 重新打开日志文件

    nginx/win32是运行在一个控制台程序,而非windows服务方式的。

 

   1.5其它事项

    日志文件,如果是debug级别,日志文件会增长的比较快。需要更大的磁盘目录空间。

    

 二. windows下nginx.conf配置示例

#默认所有用户都能启动nginx进程
#user  nobody; 

#worker进程数,配置对应cpu核心数
worker_processes  1;


#服务器错误日志
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;



#主进程,也叫守护进程pid存放路径
#pid        logs/nginx.pid;

#有默认的事件驱动模型
events {
    #每个worker进程的最大连接数
    worker_connections  1024;
    accept_mutex on;  #默认为on,解决"惊群"问题
}


http {
    #识别web资源类型,引入外部 mime.types文件,路径在conf/mime.types下
    include       mime.types;
    #默认资源类型
    default_type  application/octet-stream;

    #自定义服务日志,这里记录前端请求的日志,而不是全局中nginx进程运行的常规日志
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

    #访问日志,main是log_format格式字符串
    #access_log  logs/access.log  main;

    #方式转输方式,转输的数据最大量不能超过sendfile_max_chunk 128k
    sendfile        on;
    #tcp_nopush     on;

    #设置格式
    charset  utf-8;   

    #配置连接超时时间
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #默认开启gzip压缩
    #gzip  on;


     # 缓存设置,基于proxy_cache机制
     #path缓存目录
     #levels相对于path指定目录的第几级hash目录中缓存数据文件,目录层级2级,
     #keys_zone索引内存区域名称 10m是大小
     #max_size硬盘中缓存数据的大小限制(超过启动nginx自己的淘汰规则),
     #inactive在60分钟的时间内没有被访问就会被清理,存放临时文件
     #use_temp_path 关闭
     proxy_cache_path  cache levels=1:2 keys_zone=abc_cache:10m max_size=5g inactive=60m use_temp_path=off;



    # http server   监听 www.abc.com
    server {
        listen   80; #监听端口
        server_name  www.abc.com; 
        
        #创建独立的日志,重点:手动在logs下创建www.abc.com文件夹
        access_log  logs/www.abc.com/access.log;
        error_log  logs/www.abc.com/error.log;
        #charset koi8-r;
        location / {
             #root   html;
             #index  index.html index.htm;

             #缓存设置
            proxy_cache abc_cache;
            proxy_cache_methods get head post;
            proxy_cache_valid 200 304 60m; #200和304头信息过期时间
            proxy_cache_valid 404 1m;
            proxy_cache_valid any 10m;  #其他过期时间10分钟
            expires 2h;
            proxy_pass http://abcservers;
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
        { 
            #目录是本机web服务器静态资源目录
            root  d:\\www\www.abc.com\wwwroot;
            index  index.html index.htm;
        } 
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
       }
    }


    # https server 监听apicms.abc.com端口
    server {
        listen       443 ssl;
        server_name  apicms.abc.com;

        #创建独立的日志,重点:手动在logs下创建apicms.abc.com文件夹
        access_log  logs/apicms.abc.com/access.log;
        error_log  logs/apicms.abc.com/error.log;

        ssl_certificate      ./ssl/apicms.abc.com.crt;
        ssl_certificate_key  ./ssl/apicms.abc.com.rsa;

        ssl_session_cache    shared:ssl:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  high:!anull:!md5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass https://apicmsservers;
            proxy_set_header connection keep-alive;
            proxy_set_header host $host;
            #web服务器端获得用户的真实ip request.getattribute("x-real-ip")
            proxy_set_header x-real-ip $remote_addr;
            proxy_set_header x-real-port $remote_port;
            proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
        }
    }

      #apicms后端服务器组,如果一个服务器处理请求出错,会顺次交给组内下一个服务器进行处理,以此类推
      upstream  apicmsservers{
          #当某个server请求二次失败后,10分钟以不会把请求发往已检查出标记为不可用的服务器
          server 127.0.0.1:44301  max_fails=2 fail_timeout=600s weight=5;
          server 192.168.0.125:44301 max_fails=2 fail_timeout=600s weight=5;
       }
  
        #官网后端服务器组
       upstream  abcservers{
          server 127.0.0.1:8081 max_fails=2 fail_timeout=600s weight=5;
          server 192.168.0.125:8081 max_fails=2 fail_timeout=600s weight=5;
       }
}

  (1) https协议需要证书, 将申请的.pfx证书使用openssl工具,将转换成crt和rsa文件。再放在nginx目录的ssl文件夹下,转换示例如下:
    openssl >pkcs12 -in d:\ssl\1717704_apicms.abc.com.pfx -clcerts -nokeys -out d:\ssl\apicms.abc.com.crt

    openssl >pkcs12 -in d:\ssl\1717704_apicms.abc.com.pfx -nocerts -nodes -out d:\ssl\apicms.abc.com.rsa

  (2)配置中所有相对路径,都是nginx目录下的。 比如:logs/  , proxy_cache_path cache ,  ./ssl

  (3) 如果没有购买域名绑定当前nginx服务器ip, 那么测试需要在nginx服务器上使用hosts文件。才能监听server块的虚拟主机名,hosts绑定如下所示:

    127.0.0.1  apicms.abc.com

    127.0.0.1  www.abc.com

    再ping下确认,hosts文件是否生效

nginx for windows

 

   

 参考资料