Nginx 学习笔记01
概念
-
Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。
-
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
-
Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
-
Nginx常用功能:
- Http代理,反向代理:
- 作为Web服务器最常用的功能之一,尤其是反向代理。
- 负载均衡:
- Nginx提供的负载均衡策略有2种:内置策略和扩展策略。
- 内置策略:轮询,加权轮询,Ip hash
- 扩展策略:自定义负载均衡算法
- Web缓存:
- Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。
- 配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以的进行增删管理。
- Http代理,反向代理:
-
Nginx的特点:
- (1)跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有Windows的移植版本。
- (2)配置异常简单,非常容易上手。配置风格跟程序开发一样,神一般的配置
- (3)非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数.(这得益于Nginx使用了最新的epoll模型)
- (4)事件驱动:通信机制采用epoll模型,支持更大的并发连接。
- (5)master/worker结构:一个master进程,生成一个或多个worker进程
- (6)内存消耗小:处理大并发的请求内存消耗非常小。在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)
- (7)成本低廉:Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
- (8)内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。
- (9)节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
- (10)稳定性高:用于反向代理,宕机的概率微乎其微
安装教程
- 参考地址:http://www.nginx.cn/doc/
- 步骤:
- 下载地址:
- 解压
- 基本属性配置:
-
# 定义Nginx运行的用户和用户组 #user HymanHu admin; # Nginx进程数,建议设置为CPU总核心数 worker_processes 2; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; # 进程文件 #pid logs/nginx.pid; events { # Nginx最大负载量 worker_connections 1024; } http { # mime type 映射 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 logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # server 表示一个虚拟主机,一台服务器可配置多个虚拟主机 server { # 监听端口 listen 80; # 识别的域名 server_name localhost; # 一个关键的设置,与URL参数乱码问题有关 charset utf-8; #access_log logs/host.access.log main; # 一个server有多个location,用来匹配 同一个域名下不同uri的访问 location / { # 默认主页在nginx安装目录的html子目录 # root 表示本地的根目录 ,可以写相对路径 也可以写绝对路径如 e:/nginx/html ; root html; # index :访问主页 后面如果跟有多个页面 则会依次判断 如果第一个不存在 则向后匹配; index index.html index.htm; } } }
- 配置详解:
- main:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- events:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- server:配置虚拟主机的相关参数,一个http中可以有多个server。
- location:配置请求的路由,以及各种页面的处理情况。
- upstream:用于进行负载均衡的配置
-
- 运行命令:
- 开启:
- 双击nginx.exe
- start nginx
- 关闭:
- nginx.exe -s stop 快速停止
- nginx -s quit 完整有序的停止
- 修改配置后重新加载生效:
- nginx -s reload
- 重新打开日志文件:
- nginx -s reopen
- 测试nginx配置文件是否正确:
- nginx -t -c /path/to/nginx.cof
- 开启:
Ubuntu16.04 安装Nginx步骤
-
安装gcc g++的依赖库:
-
apt-get install build-essential apt-get install libtool
-
-
安装 pcre依赖库:
-
sudo apt-get update sudo apt-get install libpcre3 libpcre3-dev
-
-
安装 zlib依赖库:
-
apt-get install zlib1g-dev
-
-
安装 ssl依赖库:
-
apt-get install openssl
-
-
安装Nginx:
-
#下载最新版本: wget http://nginx.org/download/nginx-1.14.2.tar.gz #解压: tar -zxvf nginx-1.14.2.tar.gz #进入解压目录: cd nginx-1.14.2 #配置: ./configure --prefix=/usr/local/nginx #编辑nginx: make 注意:这里可能会报错,提示“pcre.h No such file or directory”,具体详见:http://stackoverflow.com/questions/22555561/error-building-fatal-error-pcre-h-no-such-file-or-directory 需要安装 libpcre3-dev,命令为:sudo apt-get install libpcre3-dev #安装nginx: sudo make install #启动nginx: sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 注意:-c 指定配置文件的路径,不加的话,nginx会自动加载默认路径的配置文件,可以通过 -h查看帮助命令。 #查看nginx进程: ps -ef|grep nginx
-
-
所在目录:
/usr/local/nginx/sbin/nginx
Nginx反向代理
-
反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
-
通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。
-
反向代理服务器的工作原理:
- 反向代理服务器通常有两种模型,它可以作为内容服务器的替身,也可以作为内容服务器集群的负载均衡器。
- 作内容服务器的替身:
- 如果您的内容服务器具有必须保持安全的敏感信息,如信用卡号数据库,可在防火墙外部设置一个代理服务器作为内容服务器的替身。当外部客户机尝试访问内容服务器时,会将其送到代理服务器。实际内容位于内容服务器上,在防火墙内部受到安全保护。代理服务器位于防火墙外部,在客户机看来就像是内容服务器。
- 作为内容服务器的负载均衡器:
- 可以在一个组织内使用多个代理服务器来平衡各 Web 服务器间的网络负载。在此模型中,可以利用代理服务器的高速缓存特性,创建一个用于负载平衡的服务器池。此时,代理服务器可以位于防火墙的任意一侧。如果 Web 服务器每天都会接收大量的请求,则可以使用代理服务器分担 Web 服务器的负载并提高网络访问效率。
- 作内容服务器的替身:
- 反向代理服务器通常有两种模型,它可以作为内容服务器的替身,也可以作为内容服务器集群的负载均衡器。
-
配置:
- nginx.cof: 在server上面添加下面配置
include reverse-proxy.conf;
- reverse-proxy.conf: 引入代理的服务配置文件
-
server{ listen 80; server_name HymanHu; charset utf-8; location / { proxy_pass http://localhost:8080; } }
-
- 访问 http://hymanhu 就会代理到 http://localhost:8080
- nginx.cof: 在server上面添加下面配置
nginx负载均衡
- 负载均衡的功能:
- 转发
- 故障移除
- 恢复添加
- 高可用
- 我们配置负载均衡的目的是在于当用户访问我们的服务器的时候, 首先会通过 Nginx服务器来决定转发到哪个Tomcat服务器上去给用户提供服务, 当然这个概率是我们通过权重来配置的. 经过Nginx指派之后, 我们就可以处理高并发的访问了, 这里就能达到负载均衡的目的.
- 负载均衡算法:
- 热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。
-
upstream mysvr { server 127.0.0.1:7878; server 192.168.10.121:3333 backup; #热备 }
-
- 轮询:nginx默认就是轮询其权重都默认为1
-
upstream mysvr { server 127.0.0.1:7878; server 192.168.10.121:3333; }
-
- 加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。
-
upstream mysvr { server 127.0.0.1:7878 weight=1; server 192.168.10.121:3333 weight=2; }
-
- ip_hash:nginx会让相同的客户端ip请求相同的服务器。
-
upstream mysvr { server 127.0.0.1:7878; server 192.168.10.121:3333; ip_hash; }
-
- 最少连接数:把请求分配到连接数最少的server
-
upstream fengzp.com { least_conn; server 192.168.99.100:42000; server 192.168.99.100:42001; }
-
- 热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。
资源服务器
- 路径配置:
- root 代表路径:
-
location /api/v1/upload { root /opt/edu/upload; } root 配置的意思是,会在root配置的目录后跟上URL,组成对应的文件路径。 即我的访问 http://localhost/api/v1/upload/api/v1/upload/course/logo/test.png 最终去寻找的文件路径是 /opt/edu/upload/api/v1/upload/course/logo/test.png 而我想要的是 /opt/edu/upload/course/logo/test.png
- 表示文件放在 /opt/edu/upload 目录下
-
Sets the root directory for requests. For example, with the following configuration location /i/ { root /data/w3; }
- The /data/w3/i/top.gif file will be sent in response to the “/i/top.gif” request
-
- alias 别名:
-
Defines a replacement for the specified location. For example, with the following configuration location /i/ { alias /data/w3/images/; }
- on request of “/i/top.gif”, the file /data/w3/images/top.gif will be sent.
-
- 区别:
-
当访问/i/top.gif时,root是去/data/w3/i/top.gif请求文件,alias是去/data/w3/images/top.gif请求,也就是说 root响应的路径:配置的路径+完整访问路径(完整的location配置路径+静态文件) alias响应的路径:配置路径+静态文件(去除location中配置的路径)
-
- 注意:
- 使用alias时目录名后面一定要加“/”
- 一般情况下,在location /中配置root,在location /other中配置alias