Nginx简介
Nginx基本介绍
Nginx是一个轻量级的、高性能的web服务器,同时也提供IMAP/POP3/SMTP服务。Nginx是由俄罗斯程序员伊戈尔·赛索耶夫为俄罗斯访问量第二的网站Rambler.ru开发的,具有稳定、功能强大、配置文件示例丰富、系统资源占用低、性能优异等特点。
Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php等,但不支持Java。Java程序只能通过与Tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表名Nginx能承受高达50000个并发连接数(Tomcat最高也就500多)。
Nginx支持热部署,它的启动特别容易,并且几乎可以做到7*24小时不间断允许,即使运行数个月也不需要重新启动。并且还能在不间断服务的情况下对软件版本进行升级。
Nginx相关概念
-
反向代理
-
正向代理:如果把局域网外的Internet想象成一个巨大的资源库,那么当局域网中的客户端要访问Internet时,就需要通过代理服务器来访问,这种代理方式称为正向代理。简单理解就是面向客户端的代理就称为正向代理。
Client1
ProxyServer
Client2
Client3
Internet
WebServer
-
反向代理:这种代理对客户端来说是透明的,因为客户端无需任何配置即可访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端。此时反向代理服务器对外就是一个普通的服务器,仅暴露了自身的IP地址,隐藏了真实服务器的IP地址。简单理解就是面向服务端的代理就称为反向代理。
Client1
Internet
Client2
Client3
Nginx
WebServer1
WebServer2
WebServer3
-
负载均衡 负载均衡),意思是将负载(工作任务访问请求等)进行平衡并分摊到多个操作单元(服务器、组件等)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。
100
50
30
20
Internet
Nginx
HighPerformanceServer
MediumPerformanceServer
LowPerformanceServer
-
动静分离 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
Client
Nginx
StaticResourceServer
DynamicResourceServer
Nginx安装
通过包管理器安装
-
UbuntuServer可以通过apt命令进行安装 apt install nginx-full
-
CentOS可以通过yum命令安装 yum install nginx
注意:通过包管理器安装时有可能会因为某些依赖库版本问题导致安装失败,此时建议使用从tar.gz包进行安装的方式来安装
通过tar.gz包进行安装
去 Nginx官网 下载Nginx的tar.gz包,通过ftp或lrzsz工具将压缩包上传到服务器,之后执行以下命令安装即可:
tar -xzvf nginx-1.20.1.tar.gz
cd nginx-1.20.1
./configure
make
make install
nginx -v
Nginx常用命令
命令 | 介绍 |
---|
nginx | nginx服务器的启动命令 | nginx -v | 查看nginx版本号 | nginx -s stop | nginx服务器的停止命令 | nginx -s reload | nginx服务器的重启命令 | nginx -s quit | nginx服务器的安全退出命令 | ps -ef | grep nginx | 查看nginx进程是否已启动 |
Nginx配置文件
Nginx配置文件位置
Nginx配置文件的位置取决于安装方式。如果是通过包管理器的安装方式安装的nginx,配置文件就在/etc/nginx/ 目录下;如果是使用tar.gz包安装方式安装的话,nginx配置文件的安装位置就在/usr/local/nginx/conf/ 目录下。
Nginx配置文件详解
Nginx的配置文件由以下三部分组成:
- 全局块:从配置文件开始到events块之间的内容,主要会设置一些影响Nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户(组)、允许生成的worker process数、进程PID存放路径、日志存放路径以及配置文件的引入等。比如
worke_processes 1; 这条指令就是配置Nginx的并发处理量,默认为1,值越大,可支持的并发处理量就越多。 - events块:涉及的指令主要影响Nginx服务器与用户之间的网络连接。比如
worker_connections 1024; 这条指令就是在配置Nginx支持的最大连接数。 - http块:Nginx服务器配置中最频繁修改的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是,http块也可以包括http全局块、server块。
- http全局块:主要配置文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等;
- server块:与虚拟主机有密切关系,从用户角度看虚拟主机和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器的硬件成本。每个http块可以包含多个server块,而每个server块就相对于一个虚拟主机。每个server块也可以分为server全局块和多个location块:
- server全局块:常用于配置本虚拟主机的名称、IP配置和监听配置;
- location块:主要用于匹配Nginx收到的请求URL,以处理每个URL所对应的请求。此外还可以配置地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也可以在这里进行。
Nginx具体配置内容
#定义Nginx运行的用户和用户组
user www www;
#
#nginx进程数,建议设置为等于CPU总核心数.
worker_processes 8;
#
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#
#进程PID存放位置
pid /var/run/nginx.pid;
#
#一个nginx进程打开的最多文件描述符数目,建议与ulimit -n的值保持一致.
worker_rlimit_nofile 65535;
#
#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 1024; #最大连接数,默认为512
}
#
#设定http服务器
http
{
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
#charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓
client_max_body_size 8m; #设定请求缓
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
# 开启目录列表访问,合适下载服务器,默认关闭.
autoindex on; # 显示目录
autoindex_exact_size on; # 显示文件大小 默认为on,显示出文件的确切大小,单位是bytes 改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on; # 显示文件时间 默认为off,显示的文件时间为GMT时间 改为on后,显示的文件时间为文件的服务器时间
sendfile on; # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载.注意:如果图片显示不正常把这个改成off.
tcp_nopush on; # 防止网络阻塞
tcp_nodelay on; # 防止网络阻塞
# FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度.下面参数看字面意思都能理解.
fastcgi_connect_timeout 300; ## 链接
fastcgi_send_timeout 300; ##读取 是指nginx进程向fastcgi进程发送request的整个过程的超时时间
fastcgi_read_timeout 300; ##发请求 是指fastcgi进程向nginx进程发送response的整个过程的超时时间
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
# gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #允许压缩的页面的最小字节数,页面字节数从header偷得content-length中获取.默认是0,不管页面多大都进行压缩.建议设置成大于1k的字节数,小于1k可能会越压越大
gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
gzip_http_version 1.1; #压缩版本(默认1.1,目前大部分浏览器已经支持gzip解压.前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级.1压缩比最小,处理速度快.9压缩比最大,比较消耗cpu资源,处理速度最慢,但是因为压缩比最大,所以包最小,传输速度快
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn.
gzip_vary on;#选项可以让前端的缓存服务器缓存经过gzip压缩的页面.例如:用squid缓存经过nginx压缩的数据
#开启限制IP连接数的时候需要使用
#limit_zone crawler $binary_remote_addr 10m;
##upstream的负载均衡,四种调度算法(下例主讲)##
#虚拟主机的配置
server
{
# 监听端口
listen 80;
# 域名可以有多个,用空格隔开
server_name 127.0.0.1;
# HTTP 自动跳转 HTTPS
rewrite ^(.*) https://www.baidu.com;
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
upstream myserver {
server 127.0.0.1:8080;
server 192.168.24.189:8080 backup; #热备
}
server
{
# 监听端口 HTTPS
listen 443 ssl;
server_name https://www.baidu.com;
root /data/www/;
# 配置域名证书
ssl_certificate C:\WebServer\Certs\certificate.crt;
ssl_certificate_key C:\WebServer\Certs\private.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
index index.html index.htm index.php;
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
# 配置地址拦截转发,解决跨域验证问题
location /oauth/{
proxy_pass https://localhost:13580/oauth/;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 图片缓存时间设置
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 10d;
}
# JS和CSS缓存时间设置
location ~ .*\.(js|css)?$ {
expires 1h;
}
# 日志格式设定
log_format access '$server_name $remote_addr -$remote_user [$time_local] "$request"'
'$status $uptream_status $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for" '
'$ssl_protocol $ssl_cipher $upstream_addr $request_time $upstream_response_time';
# 定义本虚拟主机的访问日志
access_log /var/log/nginx/access.log access;
# 设定查看Nginx状态的地址.StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生.
}
}
}
- 1.与remoteaddr与http_x_forwarded_for 用以记录客户端的ip地址;
- 2.$remote_user :用来记录客户端用户名称;
- 3.$time_local : 用来记录访问时间与时区;
- 4.$request : 用来记录请求的url与http协议;
- 5.$status : 用来记录请求状态;成功是200,
- 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
- 7.$http_referer :用来记录从那个页面链接访问过来的;
- 8.$http_user_agent :记录客户端浏览器的相关信息;
- 9.惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。
- 10.每个指令必须有分号结束。
日志配置解析
'$server_name $remote_addr - $remote_user [$time_local] "$request"'`
`'$status $uptream_status $body_bytes_sent "$http_referer"'`
`'"$http_user_agent" "$http_x_forwarded_for" '`
`'$ssl_protocol $ssl_cipher $upstream_addr $request_time $upstream_response_time'
-
$server_name:虚拟主机名称。 -
$remote_addr:远程客户端的IP地址,请求者IP。 -
-:空白,用一个“-”占位符替代,历史原因导致还存在。 -
$remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白。 -
[$time_local]:访问的时间与时区,比如07/Jun/2016:08:54:27 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。 -
$request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求 -
$status:记录请求返回的http状态码,比如成功是200。 -
$uptream_status:upstream状态,比如成功是200. -
$body_bytes_sent:发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。 -
$http_referer:记录从哪个页面链接访问过来的。 -
$http_user_agent:客户端浏览器信息 -
http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。 -
$ssl_protocol:SSL协议版本,比如TLSv1。 -
$ssl_cipher:交换数据中的算法,比如RC4-SHA。 -
$upstream_addr:upstream的地址,即真正提供服务的主机地址。 -
$request_time:整个请求的总时间。 -
$upstream_response_time:请求过程中,upstream的响应时间。` ### 4.Nginx代理服务的配置说明 -
1.如果我们的代理只允许接受get,post请求方法的一种 proxy_method get; #支持客户端的请求方法。post/get;
-
2.负载均衡 proxy_connect_timeout 1; #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
-
3.如果使用upstream指令配置啦一组服务器作为被代理服务器,服务器中的访问算法遵循配置的负载均衡规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一组服务器处理。
-
error:建立连接或向被代理的服务器发送请求或读取响应信息时服务器发生错误。 -
timeout:建立连接,想被代理服务器发送请求或读取响应信息时服务器发生超时。 -
invalid_header:被代理服务器返回的响应头异常。 -
off:无法将请求分发给被代理的服务器。 -
http_400,…:被代理服务器返回的状态码为400,500,502,等。 proxy_next_upstream timeout; #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
-
4.通过http获取客户的真是ip而不是获取代理服务器的ip地址 proxy_set_header Host $host; #只要用户在浏览器中访问的域名绑定了 VIP VIP 下面有RS;则就用$host ;host是访问URL中的域名和端口 www.taobao.com:80
proxy_set_header X-Real-IP $remote_addr; #把源IP 【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP;这样在代码中 $X-Real-IP来获取 源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用 【,】隔开;代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源IP
代理配置的配置文件
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat ' $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
proxy_connect_timeout 1; #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_http_version 1.0 ; #Nginx服务器提供代理服务的http协议版本1.0,1.1,默认设置为1.0版本。
#proxy_method get; #支持客户端的请求方法。post/get;
proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
proxy_ignore_headers "Expires" "Set-Cookie"; #Nginx服务器不处理设置的http相应投中的头域,这里空格隔开可以设置多个。
proxy_intercept_errors on; #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off。
proxy_headers_hash_max_size 1024; #存放http报文头的哈希表容量上限,默认为512个字符。
proxy_headers_hash_bucket_size 128; #nginx服务器申请存放http报文头的哈希表容量大小。默认为64个字符。
proxy_next_upstream timeout; #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
#proxy_ssl_session_reuse on; 默认为on,如果我们在错误日志中发现“SSL3_GET_FINSHED:digest check failed”的情况时,可以将该指令设置为off。
Nginx负载均衡详解
upstream myserver {
server 192.168.24.200:8080;
server 192.168.24.205:8080;
}
server {
....
location / {
proxy_pass myserver;#请求转向mysvr 定义的服务器列表
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
-
1、热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB… upstream myserver {
server http://192.168.24.200:8080;
server http://192.168.24.205:8080; backup; #热备
}
-
2、轮询:nginx默认权重就是轮询,都默认为1,服务器处理请求的顺序:ABABABABAB… upstream myserver {
server 192.168.24.200:8080;
server 192.168.24.205:8080;
}
-
3、加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB… upstream myserver {
server 192.168.24.200:8080 weight=1;
server 192.168.24.205:8080 weight=2;
}
-
4.ip_hash:nginx会让相同的客户端ip请求相同的服务器。 upstream myserver {
server 192.168.24.200:8080
server 192.168.24.205:8080
ip_hash;
}
-
5.关于nginx负载均衡配置的几个状态参数讲解:
nginx配置部分参考:最全Nginx 配置文件详解及安装 - 知乎 (zhihu.com)
|