前言
nginx的使用真的是非常简单,下载下来解压运行就可以,配置都是再conf文件夹的里的nginx.conf文件里配置,所以对于nginx的上手使用,nginx.conf文件里字段的含义是需要掌握的,然后就是一些nginx的常见问题
nginx核心知识详解-可以当作使用nginx的操作手册
1 完整nginx.conf文件注解版
#user nobody;
#是否是守护进程运行 如防止ctrl+c杀死
daemon off;
# 配置启动几个进程
worker_processes 1;
# 配置pid文件的路径
#pid logs/nginx.pid;
#配置nginx与用户连接的属性
events {
#单个工作进程可以允许同时建立外部连接的数量
worker_connections 1024;
}
# 配置nginx的业务功能,除了http外还有email
http {
#文件扩展名与文件类型映射表
# MIME——Multipurpose Internet Mail Extension(多用途因特网邮件扩展)最初是为了满足电子邮件支持多字符集及附件而出现的。
# 通过MIME,我们可以写一封既含有英文,又含有中文,再加上一个文件作为附件的邮件。这种含有多种类型数据的文件被称为多部分对象集合(Multipart messages)。
# HTTP服务器在发送一份报文主体时,在HTTP报文头部插入解释自身数据类型的MIME头部信息(Content-Type)。
# MIME-type和Content-Type的关系:
# 当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME Type,再根据MIME Type设置HTTP Response的Content-Type,然后客户端如浏览器根据Content-Type的值处理文件。
include mime.types;
# /mime.type文件内容如下:
# types {
# text/html html htm shtml;
# text/css css;
# text/xml xml;
# image/gif gif;
# image/jpeg jpeg jpg;
# application/javascript js;
# application/atom+xml atom;
# application/rss+xml rss;
#
# text/mathml mml;
# text/plain txt;
# text/vnd.sun.j2me.app-descriptor jad;
# text/vnd.wap.wml wml;
# text/x-component htc;
#
# image/png png;
# image/svg+xml svg svgz;
# image/tiff tif tiff;
# image/vnd.wap.wbmp wbmp;
# image/webp webp;
# image/x-icon ico;
# image/x-jng jng;
# image/x-ms-bmp bmp;
#
# application/font-woff woff;
# application/java-archive jar war ear;
# application/json json;
# application/mac-binhex40 hqx;
# ...
#默认文件类型,默认为text/plain
# 如果Web程序没设置,Nginx也没找到对应文件的扩展名的话,就使用默认的Type,这个在Nginx 里用 default_type定义: default_type application/octet-stream,这是应用程序文件类型的默认值。
# application/octet-stream
# 是HTTP规范中Content-Type的一种,意思是 未知的应用程序文件 ,浏览器一般不会自动执行或询问执行。
# 只能提交一个二进制,如果提交文件的话,只能提交一个文件,后台接收参数只能有一个,而且只能是流(或者字节数组)。
default_type application/octet-stream;
#性能优化-开启高效文件传输模式sendfile on
sendfile on;
#当有数据时,不会直接发送,确保数据包已经装满数据,避免了网的拥塞
#tcp_nopush on;
# http是一种无状态协议,客户端向服务器发送了请求,服务器响应之后就断开了连接。如果短时间内发出多个请求会影响性能
#http有一个keepAlive模式,它可以告诉webService处理完一个请求后,保持这个tcp打开状态,如果收到客户端的其它请求,会使用这个连接,而不会新建连接
#在tcp打开的这段时间内,也是占用资源的,所以占用过多就会影响性能
#nginx的keepalive_timeout 就是来指定KeepAlive的超时时间,默认是75
#keepalive_timeout 0;
keepalive_timeout 65;
# 设置日志格式
# log_format语法格式及参数语法说明如下:
# log_format <NAME> <String>;
#
# 关键字 格式标签 日志格式
#
# 关键字:其中关键字error_log不能改变
# 格式标签:格式标签是给一套日志格式设置一个独特的名字
# 日志格式:给日志设置格式
#
# 作用域 : http
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# log_format格式变量:
# 参数 说明 示例
# $remote_addr 客户端地址 211.28.65.253
# $remote_user 客户端用户名称 --
# $time_local 访问时间和时区 18/Jul/2012:17:00:01 +0800
# $request 请求的URI和HTTP协议 "GET /article-10000.html HTTP/1.1"
# $http_host 请求地址,即浏览器中你输入的地址(IP或域名) www.wang.com 192.168.100.100
# $status HTTP请求状态 200
# $upstream_status upstream状态 200
# $body_bytes_sent 发送给客户端文件内容大小 1547
# $http_referer url跳转来源 https://www.baidu.com/
# $http_user_agent 用户终端浏览器等信息 "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
# $ssl_protocol SSL协议版本 TLSv1
# $ssl_cipher 交换数据中的算法 RC4-SHA
# $upstream_addr 后台upstream的地址,即真正提供服务的主机地址 10.10.10.100:80
# $request_time 整个请求的总时间 0.205
# $upstream_response_time 请求过程中,upstream响应时间 0.002
#取消服务日志
#access_log off;
#用来指定日至文件的路径及使用的何种日志格式记录日志
#access_log logs/access.log main;
# 配置普通请求日志的输出路径
access_log logs/access.log;
# 配置错误日志的输出路径
error_log logs/error.log;
#设定实际的服务器列表
upstream zp_server1 {
server 127.0.0.1:8080;
}
# upstream后面是你当前配置的名称,在后面的proxy_pass参数中要对应
# upstream abc {
#ip_hash表示负载均衡配置,ip_hash的设置可以使每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,
#可以解决session的问题,
#备选为url_hash,指按用户的访问URL来进行分配,这样访问相同的URL时会指向同一台服务器,主要用于下载站点之类的,可以节略带宽资源。
# ip_hash;
# server 127.0.0.10:8080 weight=6;
# server 127.0.0.11:8080 weight=4;
# server 127.0.0.12:8080 down;
# }
# server {
# listen 80;
# server_name www.99cd.top 99cd.top;
# index index.html index.htm index.php;
# location / {
# proxy_pass http://abc;
# }
# }
# 打开或关闭压缩
#gzip on;
# service 位于http内部,用于配置nginx的主机
# server {
# # 指定监听的端口
# listen 80;
# # 主机名,ip地址或者域名
# server_name localhost;
#
# #charset 添加指定字符集到Context-Type头部,它不是定义响应本身的字符集,而是告诉浏览器如何解析响应
# #charset koi8-r;
# # 如果访问不同的域名或不同的服务器,最好设置不同的日志文件,这样便于查错,如果不使用则是使用Nginx统一的日志,这样查起来太麻烦。
# #access_log logs/host.access.log main;
#
# #
# location / {
# root html;
# #当用户请求 / 地址时,Nginx 就会自动在 root 配置指令指定的文件系统目录下依次寻找 index.htm 和index.html 这两个文件。
# #如果 index.htm 文件存在,则直接发起“内部跳转”到 /index.htm 这个新的地址;
# #而如果 index.htm 文件不存在,则继续检查 index.html 是否存在。如果存在,同样发起“内部跳转”到/index.html;
# #如果 index.html 文件仍然不存在,则放弃处理权给 content 阶段的下一个模块
# index index.htm index.html;
# }
#
# # location /img/ {
# # alias /var/www/image/;
# # }
# #若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件
#
#
# # location /img/ {
# # root /var/www/image;
# # }
# #若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。
#
# # 还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。。。而root则可有可无~
#
#
# #error_page 404 /404.html;
#
# # redirect server error pages to the static page /50x.html
#
# # 配置错误页面,可以在nginx中统一配置,也可以在项目中单独配置
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# root html;
# }
#
# # proxy the PHP scripts to Apache listening on 127.0.0.1:80
# #
# #location ~ \.php$ {
# # proxy_pass http://127.0.0.1;
# #}
#
# # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# #
# #location ~ \.php$ {
# # root html;
# # fastcgi_pass 127.0.0.1:9000;
# # fastcgi_index index.php;
# # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# # include fastcgi_params;
# #}
#
# # deny access to .htaccess files, if Apache's document root
# # concurs with nginx's one
# #
# #location ~ /\.ht {
# # deny all;
# #}
# }
server {
#监听端口
listen 80;
#编码格式
charset utf-8;
# 主机名,ip地址或域名中间用逗号分割
server_name 39.99.224.141 app.maschinerobot.com;
# 读取大型客户端请求头的缓冲区的最大数量和大小
large_client_header_buffers 4 16k;
#设置nginx能处理的最大请求主体大小。
client_max_body_size 1024m;
#请求主体的缓冲区大小。
client_body_buffer_size 128k;
#nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_connect_timeout 600;
#nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_read_timeout 600;
#nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 600;
#设置代理服务器(nginx)保存用户头信息的缓冲区大小
#设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
proxy_buffer_size 64k;
#proxy_buffers缓冲区,网页平均在32k以下的设置
#设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
proxy_buffers 4 32k;
#高负荷下缓冲大小(proxy_buffers*2
proxy_busy_buffers_size 64k;
#设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_file_write_size 64k;
# Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真实服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
#X_Forward_For字段表示该条http请求是由谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Origin "";
#用户请求的最终结果是要返回数据,当响应文件在 Nginx 服务器本地时,需要进行本地文件位置、读或写、返回执行结果的操作。Nginx 中的 root 指令可以设定请求 URL 的本地文件根目录,如下表所示。
root /opt/muti_wearables/obu-frontend;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ /index.html;
add_header Cache-Control "no-cache,no-store";
}
# location ~ (^/safetyBrain).* {
# proxy_pass http://127.0.0.1:8666;
#proxy_set_header Host $host:$server_port;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Forwarded-Proto $scheme;
#proxy_set_header X-Forwarded-Port $server_port;
#}
# 在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走
# 假设下面四种情况分别用 http://127.0.0.1/proxy/test.html 进行访问。
# location /proxy/ {
# proxy_pass http://127.0.0.1/;
# }
# 代理到URL:http://127.0.0.1/test.html
# 第二种(相对于第一种,最后少一个 / )
# location /proxy/ {
# proxy_pass http://127.0.0.1;
# }
# 代理到URL:http://127.0.0.1/proxy/test.html
# 第三种:
# location /proxy/ {
# proxy_pass http://127.0.0.1/abc/;
# }
# 代理到URL:http://127.0.0.1/abc/test.html
# 第四种(相对于第三种,最后少一个 / )
# location /proxy/ {
# proxy_pass http://127.0.0.1/abc;
# }
# 代理到URL:http://127.0.0.1/abctest.html
location ~ (^/health).* {
proxy_pass http://127.0.0.1:8866;
#proxy_set_header Host $host:$server_port;
}
location ~ (^/xxl-job-admin).* {
proxy_pass http://127.0.0.1:8867;
#proxy_set_header Host $host:$server_port;
}
location ~ (^/jenkin-s).* {
proxy_pass http://127.0.0.1:8899;
#proxy_set_header Host $host:$server_port;
}
location ~ (^/).* {
proxy_pass http://127.0.0.1:8899;
#proxy_set_header Host $host:$server_port;
}
}
# server {
# listen 80;
# server_name somename alias another.alias;
#
# location ~ (^/xxl-job-admin).* {
# proxy_pass http://127.0.0.1:8867;
# #proxy_set_header Host $host:$server_port;
# }
# }
server {
listen 15672;
server_name somename alias another.alias;
location / {
proxy_pass http://localhost:15672/;
# proxy_pass http://localhost:15672/;
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# 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;
# }
#}
}
2 请解释一下什么是Nginx?
nginx是一个免费的,开源的,高性能http服务器和反向代理服务器,nginx以其高性能,稳定性,丰富的功能和简单的配置而闻名,nginx解决了c10k的问题(一秒内连接客户端一万),nginx也可以作为负载均衡器。内部没有使用线程而是使用一种更高级的方式 事务驱动机制,是一种异步事件驱动结构。
3 请列举Nginx的一些特性
- 跨平台:可以在大多数Unix like 系统编译运行。而且也有Windows的移植版本。 配置异常简单:非常的简单,易上手。
- 非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能支持5万并发连接,实际生产中能跑2~3万并发连接数(得益于Nginx采用了最新的epoll事件处理模型(消息队列)。
- Nginx代理和后端Web服务器间无需长连接;
- Nginx接收用户请求是异步的,即先将用户请求全部接收下来,再一次性发送到后端Web服务器,极大减轻后端Web服务器的压力。 发送响应报文时,是边接收来自后端Web服务器的数据,边发送给客户端。
- 网络依赖性低,理论上只要能够ping通就可以实施负载均衡,而且可以有效区分内网、外网流量。
- 支持内置服务器检测。Nginx能够根据应用服务器处理页面返回的状态码、超时信息等检测服务器是否出现故障,并及时返回错误的请求重新提交到其它节点上。
- 此外还有内存消耗小、成本低廉(比F5硬件负载均衡器廉价太多)、节省带宽、稳定性高等特点。
4 请解释Nginx如何处理HTTP请求。
多进程机制和异步机制
异步机制使用的是异步非阻塞方式 ,接下来就给大家介绍一下 Nginx 的多线程机制和异步非阻塞机制 。
1、多进程机制服务器每当收到一个客户端时,就有 服务器主进程 ( master process )生成一个 子进程( worker process )出来和客户端建立连接进行交互,直到连接断开,该子进程就结束了。使用进程的好处是各个进程之间相互独立,不需要加锁,减少了使用锁对性能造成影响,同时降低编程的复杂度,降低开发成本。其次,采用独立的进程,可以让进程互相之间不会影响 ,如果一个进程发生异常退出时,其它进程正常工作, master 进程则很快启动新的 worker 进程,确保服务不会中断,从而将风险降到最低。缺点是操作系统生成一个子进程需要进行 内存复制等操作,在资源和时间上会产生一定的开销。当有大量请求时,会导致系统性能下降 。
2、异步非阻塞机制每个工作进程 使用 异步非阻塞方式 ,可以处理 多个客户端请求 。当某个 工作进程 接收到客户端的请求以后,调用 IO 进行处理,如果不能立即得到结果,就去 处理其他请求 (即为 非阻塞 );而 客户端 在此期间也 无需等待响应 ,可以去处理其他事情(即为 异步 )。当 IO 返回时,就会通知此 工作进程 ;该进程得到通知,暂时 挂起 当前处理的事务去 响应客户端请求 。
5 使用“反向代理服务器”的优点是什么?
反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当您使用web托管服务时。
6 在Nginx中,解释如何在URL中保留双斜线?
要在URL中保留双斜线,就必须使用merge_slashes_off;语法:merge_slashes [on/off]默认值: merge_slashes on环境: http,server