文章目录
nginx入门介绍
nginx架构
- 官方地址:http://www.aosabook.org/en/nginx.html
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$";
负载均衡
- 官方地址:http://nginx.org/en/docs/http/load_balancing.html
负载均衡模式
- 循环:循环分发请求给服务器,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
- 官方地址:http://nginx.org/en/docs/http/configuring_https_servers.html
配置
- 要配置为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