nginx 简单理解和配置
1.概念
Nginx是一个高性能的HTTP和反向代理的web服务器,同时也提供了IMAP/POP3/SMTP服务,Nginx是由伊戈尔·塞索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因他的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx1.0.4发布。
nginx时一款轻量级的web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行。其特点时占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆是由nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
2. 优点
Nginx可以在大多数UnixLinuxOS上编译运行,并有Windows移植版,Nginx的1.4.0稳定版本已经于2013年4月24日发布,一般情况下,对于新建站点,建议是由最新稳定版本为生产版本,已有站点的升级紧迫性不高,Nginx的源代码使用2-clause BSD-like license。
Nginx 是一个很强大的高性能web和反向代理服务,它具有很多非常优越的特性:
再连接高并发的情况下,Nginx是Apache服务模型不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应。
3. 功能概述
HTTP基础功能:
处理静态文件,索引文件以及自动索引;
反向代理加速(无缓存),简单的负载均衡和容错;
FastCGI,简单的负载均衡和容错;
模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
SSL 和 TLS SNI 支持;
IMAP/POP3 代理服务功能:
使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;
使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端;
认证方法:
POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;
IMAP: IMAP LOGIN;
SMTP: AUTH LOGIN PLAIN CRAM-MD5;
SSL 支持;
在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;
其他HTTP功能:
基于IP 和名称的虚拟主机服务;
Memcached 的 GET 接口;
支持 keep-alive 和管道连接;
灵活简单的配置;
重新配置和在线升级而无须中断客户的工作进程;
可定制的访问日志,日志写入缓存,以及快捷的日志回卷;
4xx-5xx 错误代码重定向;
基于 PCRE 的 rewrite 重写模块;
基于客户端 IP 地址和 HTTP 基本认证的访问控制;
PUT, DELETE, 和 MKCOL 方法;
支持 FLV (Flash 视频);
带宽限制
4. 正向代理和反向代理的理解
明确一个概念:代理服务器: 提供代理服务的电脑系统或其他类型的网络终端,代理网络用户去获取网络信息
代理服务器的优点:
提高访问速度:
由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到到缓存的作用,尤其对于热门网站能明显提高访问速度。
防火墙作用:
由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可以再代理服务器上设置权限,过滤掉莫i写不安全信息。同时正向代理中上网者可以隐藏自己的ip,免受攻击。
突破访问限制
互联网上有许多开发的代理服务器,客户机在访问限制时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的翻墙浏览器就是利用了代理服务器,可以直接访问外网
4.1 正向代理
正向代理(for ward proxy),一个位于客户端和原始服务器之前的服务器,为了从原始服务器取得内容,客户端项代理发送一个请求并制定目标(原始服务器),然后代理项原始服务器转发请求并将获得的内容返回给客户端。客户端才能使用正向代理。平时说的代理都时正向代理。
正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
简单一点:A向C借钱,由于一些情况不能直接向C借钱,于是A想到一个办法,他让B向C借钱,A就得到了C的钱,C不知道A的存在,B就充当于代理人的角色。
4.2 反向代理
反向代理(Reverse Proxy),以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求的客户端,此时代理服务器对外表现为一个反向代理服务器。
反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!
简单一点:A向B借钱,B没有拿自己的钱,而是悄咪咪的向C借钱,拿到钱之后再交给A,A以为时B的钱,他并不知道C的存在。
4.3 正向代理和反向代理的区别
位置不同
正向代理:架设再客户机和目标主机之间
反向代理:架设再服务器端
代理对象不同
正向代理:代理客户端,服务器不知道实际发起请求的客户端
反向代理:代理服务端,客户端不知道实际提供服务的服务端;
用途不同
正向代理:为再防火墙内的局域网客户端提供网文Internet的途径
反向代理:将防火墙后面的服务器提供给Internet访问
安全性不同
正向代理:允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为授权的客户端提供服务
反向代理:都说对外透明,访问者并不知道自己访问的是哪个代理
4.4 应用
正向代理的应用:
访问原来无法访问的资源
用作缓存,加速访问速度
对客户端访问授权,上网进行认证
代理可以记录用户的访问记录(上网行为管理),对外隐藏用户信息
反向代理的应用:
保护内网安全
负载均衡
缓存,减少服务器的压力
Nginx作为最近较火的反向代理服务器,安装在目的主机端,主要用于转发客户机请求,后台有多个http服务器提供服务,nginx的功能就是把请求转发给后台的服务器,决定哪台目标主机来处理当前请求。
正向代理是从客户端的角度出发,服务于特定用户(比如说一个局域网内的客户)以访问非特定的服务;反向代理正好与此相反,从服务端的角度出发,服务于非特定用户(通常是所有用户),已访问特定的服务。
5. 负载均衡
nginx扮演了反向代理服务器的角色,它是以依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否可以控制呢?
这里提到的客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量
请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则
所以,将服务器接收到的请求按照规则分发的过程,被称为负载均衡
负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制
nginx支持的负载均衡调度算法方式如下:
weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块
url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包
6. Nginx安装
6.1 windows安装
官方网站下载地址:[https://nginx.org/en/download.html]
下载对应的版本的nginx压缩包,解压到自己电脑上存放软件的文件夹中即可
启动nginx:
1) 直接双击该目录下的nginx.exe,即可启动nginx服务器
2) 命令行计入该文件夹,执行nginx命令,也会直接启动nginx服务器 nginx
访问nginx : 打开浏览器,输入地址:http://localhost,访问页面,出现如下页面表示访问成功
停止nginx:
命令行进入nginx根目录,执行如下命令,停止服务器:
nginx -s stop
# 强制停止nginx服务器,如果有未处理的数据,丢弃
nginx -s quit
# 优雅的停止nginx服务器,如果有未处理的数据,等待处理完成之后停止
也可以写两个.bat文件
// start.bat
start nginx -c ./conf/nginx.conf // stop.bat
nginx -s stop
pause
7.nginx配置
在项目使用中,使用最多的三个核心功能是反向代理、负载均衡和静态服务器
main # 全局配置 events { # nginx工作模式配置 } http { # http设置
.... server { # 服务器主机配置
....
location { # 路由配置
....
} location path {
....
} location otherpath {
....
}
} server {
.... location {
....
}
} upstream name { # 负载均衡配置
....
}
}
如上述配置文件所示,主要由6个部分组成:
main:用于进行nginx全局信息的配置
events:用于nginx工作模式的配置
http:用于进行http协议信息的一些配置
server:用于进行服务器访问信息的配置
location:用于进行访问路由的配置
upstream:用于进行负载均衡的配置
7.1 main模块
user nobody nobody; # user用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
worker_processes 2; # 指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
error_log logs/error.log # 定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
pid logs/nginx.pid # 用来指定进程id的存储文件的位置
worker_rlimit_nofile 1024;# 指定一个进程可以打开最多文件数量的描述
7.2 event 模块
nginx服务器的工作模式的一些操作配置
event {
worker_connections 1024; # 指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。
multi_accept on; # 指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
use epoll; # 指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue
}
7.3 http模块
作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置,常规情况下,使用默认配置即可!
http {
##
# 基础配置
## sendfile on; # 配置on让sendfile发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处
tcp_nopush on; # 让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
tcp_nodelay on; # 让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦
keepalive_timeout 65; # 给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好
client_header_timeout 120s; #调大点 设置请求头的超时时间
client_body_timeout 120s; #调大点 设置请求体的超时时间
client_max_body_size 500m; #主要是这个参数,限制了上传文件大大小
types_hash_max_size 2048; # 混淆数据,影响三列冲突率,值越大消耗内存越多,散列key冲突率会降低,检索速度更快;值越小key,占用内存较少,冲突率越高,检索速度变慢
server_tokens off; # 虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处哦 # server_names_hash_bucket_size 64;
# server_name_in_redirect off; include /etc/nginx/mime.types; # 指定在当前文件中包含另一个文件的指令
default_type application/octet-stream; # 指定默认处理的文件类型可以是二进制 ##
# SSL证书配置
## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on; ##
# 日志配置
## access_log /var/log/nginx/access.log; # 设置存储访问记录的日志
error_log /var/log/nginx/error.log; # 设置存储记录错误发生的日志 ##
# Gzip 压缩配置
## gzip on;
gzip_disable "msie6"; # gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript
text/xml application/xml application/xml+rss text/javascript; ##
# 虚拟主机配置
## include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
7.4 server模块
srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息
server {
listen 80;
server_name localhost; #指定ip地址或者域名,多个配置之间用空格分隔 #http连接超时时间,默认是100s。上传文件比较大,在规定时间未上传完成,会自动断开连接
keepalive_timeout 100;
client_header_timeout 120s; #调大点
client_body_timeout 120s; #调大点
client_max_body_size 500m; #主要是这个参数,限制了上传文件大大小 #location ^~/alarmApi/:表示匹配访问/alarmApi
location ^~/alarmApi/{
proxy_pass http://iot-device-alarm.haier-haiergroup.svc.cluster.local:8011;
}
#添加访问目录为/san的代理配置
location /san/ {
rewrite ^/san/(.*)$ http://10.133.0.72:32664/$1 permanent;
proxy_pass http://10.133.0.72:32664/;
} # ui
location / {
root /opt/webs/device_alarm_clinet/dist; #表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录
index index.html index.htm; #用户访问web网站时的全局首页
try_files $uri $uri/ /index.html; #解决刷新变404问题
} }
7.5 upstream模块
upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器
upstream name {
ip_hash;
server 192.168.1.100:8000;
server 192.168.1.100:8001 down;
server 192.168.1.100:8002 max_fails=3;
server 192.168.1.100:8003 fail_timeout=20s;
server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
核心配置信息如下
ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定
server host:port:分发服务器的列表配置
-- down:表示该主机暂停服务
-- max_fails:表示失败最大次数,超过失败最大次数暂停服务
-- fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求
8. 一个小案里,可以实现接口地址重写
# 重写url,遇到nff 保留后面的接口路径,rewrite不能和proxy_pass 写在一起,rewrite会302重定向,而且智能走get请求 location ^~/nff/{
if ($request_uri ~ '^/nff(/?)(.*)$'){
set $target_uri $;
}
proxy_pass http://172.21.55.18:9002/$target_uri;
#rewrite ^/nff/(.*)$ http://172.21.55.18:9002/$1; #其中$2表示的是正则中的第二串
}
9. 附上自己的nginx.conf和Dockerfile
#user nobody;
worker_processes 1; events {
worker_connections 1024;
} http {
include mime.types;
default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; access_log /etc/nginx/access.log main; sendfile on;
#tcp_nopush on; #keepalive_timeout 0;
keepalive_timeout 65; #gzip on; #通用APP-设备告警APP
server {
listen 80;
server_name localhost; #http连接超时时间,默认是100s。上传文件比较大,在规定时间未上传完成,会自动断开连接
keepalive_timeout 100;
client_header_timeout 120s; #调大点
client_body_timeout 120s; #调大点
client_max_body_size 500m; #主要是这个参数,限制了上传文件大大小 #自己服务的接口
location ^~/energyApi/{
proxy_pass http://iot-device-energy.haier-haiergroup.svc.cluster.local:8014;
}
#添加访问目录为/san的代理配置
location /san/ {
rewrite ^/san/(.*)$ http://10.133.0.72:32664/$1 permanent;
proxy_pass http://10.133.0.72:32664/;
}
# ui
location / {
root /opt/webs/device_energy_clinet/dist; #打包后项目路径
index index.html index.htm;
try_files $uri $uri/ /index.html; #解决刷新变404问题
}
}
}
FROM nginx
EXPOSE 80
COPY dist /opt/webs/device_energy_clinet/dist
COPY nginx.conf /etc/nginx/nginx.conf
nginx 简单理解和配置的更多相关文章
- java基础(一):我对java的三个环境变量的简单理解和配置
首先说说java的三个环境变量:java_home,classpath,path java_home:jdk的安装路径[你一层一层点开安装路径,直到当前目录有一个bin目录,然后在地址栏里面右键单击复 ...
- Nginx 简单的cpu配置
配置指定CPU Nginx建议进程数和CPU数量一致,这样每个CPU都有自己独立的缓存 worker_processes 4; worker_cpu_affinity 1000 0100 0010 0 ...
- nginx简单的rewrite配置
假设当前已存在location /test/,希望配置一个短连接/ts/与之相同,就需要用到rewrite 直接配置到server段 rewrite ^/ts/(.*) /test/$1; 或者放到l ...
- Linux安装Nginx以及简单理解
1.Nginx简单介绍 ①.Nginx:一个高性能的HTTP和反向代理服务器,高并发处理很不错. ②.反向代理:在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂 ...
- Nginx 简单的负载均衡配置示例(转载)
原文地址:Nginx 简单的负载均衡配置示例(转载) 作者:水中游于 www.s135.com 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP. 用户访问http://www ...
- Nginx简单配置
Nginx 配置文件结构如果你下载好啦,你的安装文件,不妨打开 conf 文件夹的 nginx.conf 文件,Nginx 服务器的基础配置,默认的配置也存放在此.在 nginx.conf 的注释符号 ...
- Nginx模块开发-理解HTTP配置
理解HTTP配置 相关数据结构 先明白Nginx下述数据结构,再理解 HTTP配置的解析与合并过程 ngx_module_t 官方API typedef struct{ NGX_MODULE_V1; ...
- nginx的安装及简单负载均衡配置
Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性.本人目前所在公司也使用nginx,主要用来做负载均衡服务器.同时也可以作为邮件代理服务器. 1. nginx的安装.本 ...
- Nginx简单配置,部分来源于网络
nginx.conf listener监听端口 server_name监听域名 location{}是用来为匹配的 URI 进行配置,URI 即语法中的“/uri/”.location / { }匹 ...
随机推荐
- MySQL常用关键词
MySQL常用关键词 1. 显示表departments的结构:DESC DESC departments; 2. 显示出表employees中的全部job_id(不能重复):DISTINCT SE ...
- 工作五年的.neter的一些经历感想和对未来的一些疑惑
本次疫情在家办公快一个月了,节省了上下班的时间,外出活动时间,感觉有好多时间可以利用.人一闲下来就容易想事情,很多事情想不通心里堵的厉害,做事都提不起兴趣.至于想些什么呢,我给大家摆一下. 我的经历 ...
- C++中的public、protected和private
访问权限控制 一个类的public的成员变量.成员函数,可以通过类的实例变量进行访问. 一个类的protected的成员变量.成员函数,无法通过类的实例变量进行访问,但是可以通过类的友元函数.友元类进 ...
- HTTPS原理及流程
HTTPS为什么更安全:数据对称加密传出,对称密钥使用非对称加密协商. HTTPS就一定安全吗:不一定,如果用户在浏览器端执意访问证书可疑或过期的站点,就存在安全隐患. --- HTTPS实现原理:h ...
- Policy-based Approach(基于策略的方法)
step 1:Neural Network as Actor step 2:goodness of function(训练一些Actor) 是一个序列,包含T个状态s.行为a.奖励s.代表某一次的开始 ...
- css选择器四大类:基本、组合、属性、伪类
什么是选择器?选择器的作用是通过它可以找到元素,把css样式传递给元素!css选择器主要分为:基本选择器.属性选择器.组合选择器与伪类选择器四个大类! css基本选择器 基本选择器又分为:*通配符.标 ...
- cf1280B
题意:给出一个n*m的矩阵,矩阵中的元素要么P要么是A 每次可以选择一个的子矩形,然后将矩阵中每一行都变为第一行,或者将矩阵中每一列都变为第一列 要求用最少的次数将矩阵中所有元素都变成A 题解:分类讨 ...
- 安装NFS到CentOS(YUM)
运行环境 系统版本:CentOS Linux release 7.3.1611 软件版本:无 硬件要求:无 安装过程 1.配置YUM源 [root@localhost ~]# rpm -i https ...
- 浅谈python的第三方库——numpy(二)
前一期博文中,初步探索了numpy中矩阵的几种运算操作,本文将展示numpy矩阵的元素抽取与合并操作. 1 元素抽取 在我们使用矩阵的时候,有时需要提取出矩阵的某些位置上的元素单独研究,这时就需要熟悉 ...
- maven的核心概念——POM
Project Object Model:项目对象模型.将Java工程的相关信息封装为对象作为便于操作和管理的模型.Maven工程的核心配置.可以说学习Maven就是学习pom.xml文件中的配置. ...