nginx入门介绍

nginx入门介绍

nginx架构

nginx安装

  • 官方地址:http://nginx.org/en/docs/install.html

  • 在windows下执行 start nginx后,我们可以在任务管理器中看到两个nginx进程,其中一个为master进程,一个为worker进程,master主要目的是读取和评估配置以及维护worker,worker就做实际的请求处理。
    同时start nginx启动后会在logs文件夹下产生nginx.pid文件,里面放置master进程id
    NGIX采用基于事件的模型和依赖于OS的机制来有效地在工人进程之间分配请求
    默认配置nginx.conf中 worker_processes 1; 表示只有一条工作进程,可以进行手动配置或根据cpu核数情况自动配置

# 默认配置
worker_processes  1;
# 根据cpu核数自动配置
worker_processes  auto;

nginx命令

nginx -s <signal>

  • 其中signal可以是以下:

    • stop — 快速退出
    • quit — 优雅退出,即会完成当前请求后再退出
    • reload — 重新加载配置文件,执行后master启动新的worker进程同时发送消息请求旧的worker关闭,如果失败则会回滚继续用旧的配置工作
    • reopen — 重新打开日志文件
  • 更详细的nginx命令可以通过nginx -h获取。

    D:\nginx-1.14.0>nginx -h
    nginx version: nginx/1.14.0
    Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
    
    Options:
      -?,-h         : this help
      -v            : show version and exit
      -V            : show version and configure options then exit
      -t            : test configuration and exit
      -T            : test configuration, dump it and exit
      -q            : suppress non-error messages during configuration testing
      -s signal     : send signal to a master process: stop, quit, reopen, reload
      -p prefix     : set prefix path (default: NONE)
      -c filename   : set configuration file (default: conf/nginx.conf)
      -g directives : set global directives out of configuration file
    
  • 其中-t是测试配置文件是否配置正确的非常好用的参数

  • -V 则可以得到配置参数,nginx是有非常多的模块的,可以根据实际需求定制自己的nginx,加载相关的模块,这个命令则可以知道当前nginx配置了哪些模块。

正向反向代理理解

  • 正向代理则是资源服务器不知道访问它的是哪个客户端,因为请求都是从代理服务器过来的,也就是资源服务器只知道访问它的代理服务器
  • 反向代理则是客户端不知道它实际访问的资源服务器,对于客户端来说,它只知道反向代理服务器而已,真正访问哪个资源服务器是由反向代理服务器控制的

配置文件结构

  • 基本结构
    # 这是注释
    worker_processes  auto;
    events {
    worker_connections  65535;
    }
    http {
    	server {
    		location / {
    		}
    	}
    }
    

server_name

  • 官方介绍:http://nginx.org/en/docs/http/server_names.html
    server {
        listen       80;
        server_name  example.org  www.example.org "" 192.168.1.1;
        ...
    }
    
    server {
        listen       80;
        server_name  *.example.org;
        ...
    }
    
    server {
        listen       80;
        server_name  mail.*;
        ...
    }
    
    server {
        listen       80;
        server_name  ~^(?<user>.+)\.example\.net$;
        ...
    }
    
  • server_name支持精确匹配,通配符和正则表达式,优先级是精确>通配>正则,到了正则还匹配到多个的话则按顺序取第一个。
  • 注意通配符只能用在首尾,像“www.*.example.org” and “w*.example.org”是无效的
  • 正则表达式则必须以波浪号开头,否则会被当作精确名称匹配,同时别忘记^和$,如
    server_name ~^www\d+\.example\.net$;
  • 如果正则表达式中出现了{}符号,则需要加上“”,否则将会报错,如
    server_name "~^(?<name>\w\d{1,3}+)\.example\.net$";

负载均衡

负载均衡模式

  • 循环:循环分发请求给服务器,nginx默认采用的模式
  • 最少连接:将请求派给最少连接的那个,使用least_conn指令
  • 哈希:根据客户端的ip地址哈希计算请求的服务器

注意第一二种模式客户端访问的服务器都是不确定的,而第三种模式客户端相当于与服务器绑定了

健康检查

  • 健康检查是nginx提供的在服务器响应失败时暂时避免将请求分发到此服务的机制
  • max_fails默认为1,当被设为0表示禁用健康检查
  • 最简单示例
http {
    upstream myapp1 {
    	 least_conn; #加上这个则表示采用最少连接模式
    	 ip_hash; #加上这个表示采用哈希模式
        server srv1.example.com weight=3;#加权模式在最新版本中才开始支持在最少连接和哈希模式中使用,不写默认1
        server srv2.example.com max_fails=3;
        server srv3.example.com max_fails=3 fail_timeout=20s; #默认10s,表示在fail_timeout时间之后用之前的客户端请求进行服务器探测,成功则将服务器标识为正常
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

https servers

配置

  • 要配置为https服务,则需要启用ssl,并指定证书和密钥。
    server {
        listen              443 ssl;
        server_name         www.example.com;
        ssl_certificate     www.example.com.crt;
        ssl_certificate_key www.example.com.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;#这是nginx的默认配置,一般不用显式写出来
        ssl_ciphers         HIGH:!aNULL:!MD5;#这是nginx的默认配置,一般不用显式写出来
        ...
    }
    
  • 服务器证书是公共实体。它被发送到连接到服务器的每个客户端。私钥是安全实体,应该存储在具有受限访问的文件中,但是,它必须可由nginx的master进程读取。
  • 私钥也可以存储在证书中,如下:
    	ssl_certificate     www.example.com.cert;
        ssl_certificate_key www.example.com.cert;
    
  • 在这种情况下,文件访问权限也应该受到限制,虽然证书和密钥存储在一个文件中,但仅将证书发送到客户端

优化

  • 注意到使用ssl后将会消耗更多cpu资源,因此worker线程一般要不少于cpu核数。
  • 优化的方式一般为两种,第一种方法是保持活动连接使得能够通过一个连接发送多个请求,第二种方法是重用SSL会话参数以避免对并行和后续连接的SSL握手
  • 以下是一个优化的例子:
    worker_processes auto;
    
    http {
        ssl_session_cache   shared:SSL:10m;# 表示会话缓存空间为10M,1M大约可以缓存4000个会话
        ssl_session_timeout 10m; # 表示会话缓存时间10分钟,默认5分钟
    
        server {
            listen              443 ssl;
            server_name         www.example.com;
            keepalive_timeout   70;
    
            ssl_certificate     www.example.com.crt;
            ssl_certificate_key www.example.com.key;
            ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers         HIGH:!aNULL:!MD5;
            ...
    
  • http和https是可以共存的
    server {
        listen              80;
        listen              443 ssl;
        server_name         www.example.com;
        ssl_certificate     www.example.com.crt;
        ssl_certificate_key www.example.com.key;
        ...
    }
    

文件服务

  • 最简单的图片下载服务

    server {
    	listen       8083;
    
    	location /data {
    		charset utf-8; # 避免中文乱码
    		root  D:/nginx-1.14.0; #显示的根索引目录,注意这里要改成你自己的,目录要存在
    	     autoindex on;       #开启索引功能 
    	     autoindex_exact_size off; # 关闭计算文件确切大小(单位bytes),只显示大概大小(单位kb、mb、gb) 
    	     autoindex_localtime on;  # 显示本机时间而非 GMT 时间 
    	    }
    	    
    	location / {
    		#root /data/www;
    		root D:/nginx-1.14.0/data/www;
    		}
    		
    	location /images/ { #最后的"/"加不加都可以
    		#root /data;  # 即在“盘符:/data”下
    		#root data;  # 表示在配置文件nginx.conf同级目录下的data文件夹
    		root D:/nginx-1.14.0/data; # 注意上面的匹配路径/images/会增加到root后面,因此可以不在root后再加images,当然要加也是可以的
    		}
    		
    	location ~ \.(gif|jpg|png)$ { # 前面的~ 表示正则表达式
        	root D:/nginx-1.14.0/data/images;
    		}
    	}
    
  • 在windows下配置/data即为nginx.exe所在的盘符,比如是在d盘,则/data表示d:/data,如果你不清楚那就直接绝对路径也可以,以上配置

  • 访问http://localhost:8083/data即可显示data目录下的文件

  • 访问http://localhost:8083/xxx.html即可拿到放置在D:/nginx-1.14.0/data/www/xxx.html

  • 访问http://localhost:8083/images/xxx.jpg即可拿到放置在D:/nginx-1.14.0/data/images/xxx.jpg

  • 访问http://localhost:8083/xxx.jpg即可拿到放置在D:/nginx-1.14.0/data/images/xxx.jpg

代理服务

  • 代理服务通过proxy_pass指定
    server {
    	listen       8083;
    
    	location / {
    		#root /data/www;
    		root D:/nginx-1.14.0/data/www;
    		}
    	location /images {
    		#root /data;
    		root D:/nginx-1.14.0/data;
    		}
    	}
    	
    	# 代理服务,代理8083的服务
    	server {
    	listen       8084;
    
    	location / {
            proxy_pass http://localhost:8083;
        }
    
    	}
    

问答

  • 在windows下用了nginx代理后访问图片速度反而变慢了怎么办

  • 引起这个问题的可能原因之一为代理的地址使用了localhost,比如"proxy_pass http://localhost;",将localhost改为实际ip即可


  • 服务中的端口冲突了怎么办?

  • 如果配置了多个相同端口的服务,那么nginx默认会采用第一个,可以通过default_server设置你自定义的。

    server {
        listen      80 default_server;
        server_name example.net www.example.net;
        ...
    }
    

  • server块中的listen和server_name匹配顺序?
    当一个请求到达时,nginx会先匹配listen,再匹配server_name(即请求中的“Host”)

    server {
        listen      192.168.1.1:80;
        server_name example.org www.example.org;
        ...
    }
    
    server {
        listen      192.168.1.1:80;
        server_name example.net www.example.net;
        ...
    }
    
    server {
        listen      192.168.1.2:80;
        server_name example.com www.example.com;
        ...
    }
    

例如,当收到www.example.com的在192.168.1.1:80上的请求时,会交给第一个服务处理。

参考

Beginner’s Guide
http://nginx.org/en/docs/beginners_guide.html
How nginx processes a request
http://nginx.org/en/docs/http/request_processing.html
Server names
http://nginx.org/en/docs/http/server_names.html
Nginx 相关介绍(Nginx是什么?能干嘛?) - 蔷薇Nina - 博客园
https://www.cnblogs.com/wcwnina/p/8728391.html
如何优雅地在Windows上使用Nginx - 一行代码一行泪 - 开源中国
https://my.oschina.net/codingDog/blog/1483905
kohsuke/winsw: A wrapper executable that can be used to host any executable as an Windows service, in a liberal license
https://github.com/kohsuke/winsw

发布了126 篇原创文章 · 获赞 37 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/huweijian5/article/details/83655344