nginx简介
Nginx(发音同 engine x)是一款基于异步框架的轻量级/高性能的Web 服务器/反向代理服务器/缓存服务器/电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev(伊戈尔·赛索耶夫)所开发,最初供俄国大型网站Rambler.ru及搜寻引擎Rambler使用。

Nginx特点
优点:
高并发量:基于 epoll/kqueue 模型开发,支持高并发量,官方说其支持高达 5w 并发连接数的响应
内存消耗少:善于处理静态文件,相较于其他web(比如:apache),占用更少的内存及资源
简单稳定:配置简单(一个conf文件),运行简单(nginx命令),而且运行稳定
模块化程度高:功能模块插件化设计,可以自由配置相应的功能。
支持Rwrite重写规则:能够根据域名、URL等请求关键点,实现定制化的高质量分发。
低成本:Nginx的负载均衡功能很强大而且免费开源,相较于几十万的硬件负载均衡器成本相当低。
支持多系统:Nginx代码完全用C语言从头写成,可以在各系统上编译并使用。
缺点:
动态处理差:nginx善于处理静态文件,但是处理动态页面相较于Apache之类重量级的web软件能力稍欠缺。
rewrite弱:虽然nginx支持rewrite功能多,但是相较于Apache之类重量级的web软件能力稍欠缺

部署:
安装方式:源码安装
安装步骤:
1.nginx官网下载源码包,并在/usr/local目录下创建nginx目录,将下载的nginx源码包传至/usr/local/nginx/目录下,并解压
注:为什么安装在/usr/local下:

统管理员在本机自行安装自己下载的软件(非distribution默认提供者),建议安装到此目录, 这样会比较便于管理。举例来说,你的distribution提供的软件较旧,你想安装较新的软件但又不想移除旧版, 此时你可以将新版软件安装于/usr/local/目录下,可与原先的旧版软件有分别啦。 你可以自行到/usr/local去看看,该目录下也是具有bin, etc, include, lib...的次目录

2.安装依赖包

yum install gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

3.配置nginx安装信息./configure(官方说明文档
nginx大部分常用模块,编译时./configure --help以–without开头的都默认安装。

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \  #不要该选项,加了该选项会产生一个问题:每次重启后nginx目录会自动删除,目前不知道解决方案,就不加该选项
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-file-aio \
--with-http_realip_module \   #可以记录IP,便于统计访问次数
--conf-path=/etc/nginx/nginx.conf \   #若不指定,则默认在--prefix目录下
--sbin-path=/usr/sbin/nginx \    #若不指定,则默认在--prefix目录下
--with-http_stub_status_module \
--with-http_flv_module

4.执行编译和安装,

make && make install

5.将nginx加入到service服务下管理
复制官网的启动脚本链接 ,/etc/init.d目录下执行vi nginx,将复制的脚本粘贴到文件中。
6.nginx配置文件说明:
全局配置段
主要是全局性的和服务级别的属性配置,常见的主要有以下几种设置:

user 					        设置使用用户(worker)
worker_processes 		进行增大并发连接数的处理 跟cpu保持一致 八核设置八个
error_log 				nginx的错误日志
pid  					nginx服务启动时候pid 
events					定义事件相关的属性
worker_connections 	一个进程允许处理的最大连接数
use 					定义使用的内核模型

http配置段
主要配置server通用的一些配置

include mime.types; 						# 文件扩展名与文件类型映射表
default_type application/octet-stream; 		# 默认文件类型
sendfile on; 								# 开启高效文件传输模式。
autoindex on; 								# 开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; 								# 防止网络阻塞
tcp_nodelay on; 							# 防止网络阻塞
keepalive_timeout 120; 						# 长连接超时时间,单位是秒
gzip on;                         # 开启gzip压缩输出

Server常见配置属性
常见样式

server {
    listen 端口;
    server_name 主机名;
    location / {
    	root   /var/www/html;					# 指定响应请求的文件所在路径
    	index  index.php index.html index.htm;	# 指定响应请求的默认文件名称
    	expires 7d;								# 指定响应请求的文件过期时间,一般用于静态文件
    	try_files $uri $uri/ =404;				# 如果root指定的路径下有查找的文件,就返回,否则报错
}
}

server配置段最重要的属性是listen和server_name。它们都是用于匹配并处理请求的。
listen属性
作用:定义Server监听的ip和port,当ip/port匹配时候才进行下一步匹配
表现形式:
完整示例
IP:Port
地址精确表示样式

listen 10.10.10.10:99

IP
自动监听 IP:80地址

listen 10.10.10.10
listen 10.10.10.10:80

Port
自动监听 全地址:Port

listen 99或 [::]:99
listen 0.0.0.0:99

default_server
自动使用默认的地址

listen default_server
listen localhost:80

使用原则:
首先将所有样式补全成IP:Port,然后匹配,匹配Server多,那么接着使用Server_name匹配
server_name属性
作用:定义Server监听的域名,当域名匹配时候才进行下一步操作
表现形式:

www.example.com
*.example.com
www.example.*

_
使用原则:
优先使用完整样式,然后使用前缀正则样式,最后使用后缀正则样式,如果正则样式相同的时候,匹配最长,否则就走非法规则。
非法域名/IP,表示请求到该主机上一个不存在的IP或者域名

location常见动作:
在location内部常用的功能属性非常多,常见的基本属性、临时跳转、访问控制、目录列表等。
基本属性

location / {
    	root   /var/www/html;					# 指定响应请求的文件所在路径
    	index  index.php index.html index.htm;	# 指定响应请求的默认文件名称
    	expires 7d;								# 指定响应请求的文件过期时间,一般用于静态文件
    	try_files $uri $uri/ =404;				# 如果root指定的路径下有查找的文件,就返回,否则报错
}

root属性 作用:定义Server相应请求的html文件所在路径 表现形式: root /var/www/html;
index属性 作用:定义响应请求后返回的文件名称或格式 表现形式: index index.html index.htm index.nginx-debian.html;
return属性 作用:定义响应请求后返回的http状态码 表现形式: return 444;

location匹配规则

pigx 负载均衡 负载均衡真实ip_html


匹配示例:

location = / {
   #规则A
}
location = /login {
   #规则B
}
location ^~ /static/ {
   #规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
   #规则D
}
location ~* \.png$ {
   #规则E
}
location / {
   #规则F
}

临时跳转

location = /test/ {
    return 302 http://sswang.com/;			# 访问旧url的时候,临时跳转到新url,两个url均不失效	
}

访问控制

location /nginx-status {
    stub_status on;  						# 开启nginx的状态页面,默认关闭
    allow 192.168.8.14;						# 允许的访问地址
    deny all;								# 默认进制所有访问
}

注意:该功能(访问控制)依赖于ngx_http_stub_status_module 模块(默认没有安装,需要定制化安装)

目录列表

location /upload {
    alias   /var/www/upload/;		# 指定查看文件列表路径(绝对路径)
    autoindex on;             		# 开启目录自动索引
    autoindex_exact_size off; 	# 默认on,显示文件确切大小(bytes)。off表示显示文件的大概大小(kB/MB/...)
    autoindex_localtime on;   	# 默认off,显示的文件时间为GMT时间。on表示显示文件的服务器时间
}

注意: 该alias指定的目录下,不允许出现index属性指定的文件。

root VS alias
root 和 alias 所起的作用都是指定响应请求所用文件的路径,只是他们有些许的区别

root 	表示 location 匹配内容的相对路径
alias 	表示 一个绝对路径,而且必须以"/"结尾

一般情况下,在location /中配置root,在location /other中配置alias
效果一: 效果二:

location /img/ {                       		location /img/ {
	alias /var/www/image/;                		root /var/www/image;
}                                          	}

效果一:访问http://localhost/img/,nginx找/var/www/image/目录下的文件
效果二:访问http://localhost/img/,nginx找/var/www/image/img/目录下的文件

location核心动作
Nginx的配置语法灵活,可控制度非常高。在0.7以后的版本中加入了一个try_files指令,配合命名location,可以部分替代原本常用的rewrite配置方式,提高解析效率。

指令语法
try_files file ... uri
try_files file ... =code

作用:
响应时按顺序查找file,找到则返回file内容,否则的话进行内部重定向(uri)或返回状态码(code)。
常见示例

如果能找到指定的uri那么就返回相应的内容,否则的话返回错误状态码404
try_files $uri $uri/ =404;
如果能找到指定的文件1/2.html那么就返回相应的内容,否则的话返回6.html文件内容
try_files 1.html 2.html /6.html;
如果能找到指定的uri那么就返回相应的内容,否则的话就内部重定向到后端名称为@backup的location
try_files $uri @backup;

注意:
如果最后一个地址是一个uri的话,那么这个uri必须是存在的,否则的话就有问题

注意:为了方便管理,配置文件分主配置文件/usr/local/nginx/conf/nginx.conf,从配置文件/usr/local/nginx/conf/*.conf,主配置文件主要描述全局配置段和http配置段,从配置文件主要记录server配置段。主配置文件http配置段内加入include /usr/local/nginx/conf/*.conf,使主配置文件能找到从配置文件

nginx进阶知识

正、反代理讲解:链接 官方介绍
官方资料:http://www.nginx.cn/doc/standard/httpproxy.html 官方的代理属性很多,我们主要介绍proxy_pass和proxy_set_header属性
官方代码示例

location / {
: proxy_pass        http://localhost:8000;		# 设定请求跳转后的地址,可以使用hostname或IP:Port形式
: proxy_set_header  X-Real-IP  $remote_addr;	# 后端请求携带原始请求的真实IP地址
}

属性详解:

proxy_pass 指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式

proxy_pass关键点 proxy_pass后面的路径最后的/作用很重要!!!

示例代码:
location /html/ {
  1 proxy_pass http://proxy.com; 
    2 proxy_pass http://proxy.com/;
}
假设我们访问的url是 http://domain.com/html/test.js,如何理解上述两种proxy_pass的区别呢?
对于 1 来说 proxy.com后面没有"/",表示"/html/" 请求(包括自己)后续的路径及其参数等关键字都由http://a.com/来处理,代理后的样式如下:
http://proxy.com/html/test.js     
对于 2 来所 proxy.com后面有"/",表示"/html/" 请求后续的路径及其参数等关键字都由http://a.com/来处理,代理后的样式如下:
http://proxy.com/test.js

nginx反向代理实践
代理的配置文件
~# vim /etc/nginx/conf.d/proxy.conf

server {
  listen 192.168.8.14:80;
  server_name www.sswang.com;
  location / {
    proxy_pass http://192.168.8.14:9999/hello/;
  }
}

后端服务配置文件
~# vim /etc/nginx/conf.d/hello.conf

server {
  listen 192.168.8.14:9999;
  location /hello/ {
    alias /var/www/html/hello/;
    try_files $uri $uri/ =404;
  } 
}

检查nginx配置后重载服务

负载均衡是什么?

我们之前使用proxy_pass的方式实现了nginx代理请求到后端的效果,随着我们的网站访问量越来越多,一个后端就不现实了,那么接下来我们应该如果在访问量日渐增大的情况下,满足线上业务的稳定呢?
解决方法就是:负载均衡 负载均衡简单说来人多力量大,打群架。
在nginx中的负载均衡主要有两种:四层负载(IP:Port)、七层负载(http://xxx)

nginx upstream模块
官方资料:http://www.nginx.cn/doc/standard/httpupstream.html 官方的代理属性很多,我们主要介绍upstream和ip_hash属性
官方代码示例

#负载均衡
upstream backend  {   #backend为自己的项目名称
  server backend1.example.com weight=5;   #weight 加权轮训
  server backend2.example.com:8080;
  server unix:/tmp/backend3;
}
#反向代理
server {
  location / {
    proxy_pass  http://backend; #backend是负载均衡配置的名称,根据自己情况更改
  }
}

属性详解:

upstream 主要是定义一个后端服务地址的集合列表,每个后端服务使用一个server命令表示 upstream {} 和 Server
{} 两部分内容属于平级关系。

后端服务状态

在upstream模块中,可以使用server命令指定后端服务器的地址,同时还可以设置后端服务器在负载均衡调度中的状态,常用的状态有以下几种:
down:	表示当前server主机暂时不参与负载均衡。
backup:后备主机,当所有非backup机器出现故障或者繁忙的时候,才会请求backup机器。
max_fails:允许请求的最大失败数,默认为1,配合fail_timeout一起使用
fail_timeout:经历max_fails次失败后,暂停服务的时间,默认为10s。

nginx负载均衡实践
负载均衡配置文件
~# vim /etc/nginx/conf.d/upstream.conf

upstream backends {
  server 192.168.8.14:10086;
  server 192.168.8.14:10087;
  server 192.168.8.14:10088;
}

server {
  listen 80;
  server_name localhost;
  location / {
    proxy_pass http://backends;
  }
}

后端代理配置文件
~# vim /etc/nginx/conf.d/backend.conf

server {
  listen 192.168.8.14:10086;
  location / {
    root /var/www/html/hello/;
    try_files $uri $uri/ =404;
  }
}


server {
  listen 192.168.8.14:10087;
  location / {
    root /var/www/html/nihao/;
    try_files $uri $uri/ =404;
  }
}
server {
  listen 192.168.8.14:10088;
  location / {
    root /var/www/html/huanying/;
    try_files $uri $uri/ =404;
  }
}

负载均衡调度算法
官方资料:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#exampleNginx提供的负载均衡策略有两种:
内置策略:nginx自带的算法
雨露均沾型:轮训、加权轮训、哈希
定向服务型:ip_hash、least_conn、cookie、route、lean、
商业类型:ntlm、least_time、queue、stick
扩展策略:各种结合业务场景自定义的算法或者第三方算法
自定义算法
第三方算法:fair、url_hash
常用算法简介:

轮询(默认):请求按顺序逐一分配到不同的后端服务器。
weight:指定轮询权重,值越大,分配到的几率就越高,适用于后端服务器性能不均衡情况。
ip_hash:按访问IP的哈希结果分配请求,分配后访客访问固定后端服务器,有效的解决动态网页会话共享问题。
fair:基于后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash:按访问URL的哈希结果分配请求,使同URL定向到同一台后端服务器,可提高后端缓存服务器的效率。

加权轮训实践
修改负载均衡配置文件
~# vim /etc/nginx/conf.d/upstream.conf

upstream backends {
  server 192.168.8.14:10086 backup;
  server 192.168.8.14:10087 weight=1;
  server 192.168.8.14:10088 weight=2;
}

ip_hash实践
修改负载均衡配置文件
~# vim /etc/nginx/conf.d/upstream.conf

upstream backends {
  ip_hash;
  server 192.168.8.14:10086 ;
  ...
}

NGINX日志操作

日志简介

Nginx默认提供了两个日志文件
access.log和error.log,通过access.log可以得到用户请求的相关信息;通过error.log可以获取某个web服务故障或其性能瓶颈等信息。
而且nginx的日志支持定制化格式,这样我们就可以根据实际的业务情况更好的高效工作。最常见的场景就是获取客户端的IP,记录用户访问量。

官方介绍:http://nginx.org/en/docs/http/ngx_http_log_module.html 基本配置
cat /etc/nginx/nginx.conf -n

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

注意:

nginx日志属性设置的完整格式是: 属性名称 access_log 存储位置
/var/log/nginx/access.log
日志格式 位置为空表示使用默认的combined 日志格式。它是通过log_format设置的

默认日志格式

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

注意: log_format是有一批nginx内置变量组合而成的。

日志样式:
tail /var/log/nginx/access.log

192.168.8.14 - - [12/Nov/2018:08:24:18 -0800] "GET /favicon.ico HTTP/1.0" 404 580 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"

nginx常用内置变量

nginx常用的内置变量主要是用来分析日志中的http记录的,我们可以根据内置的变量精确的获取相关的信息

默认变量

$remote_addr		前一台主机的ip地址,不一定是真实的客户端IP
$remote_user		用于记录远程客户端的用户名称(一般为“-”)
$time_local			用于记录访问时间和时区
$request			用于记录请求的url以及请求方法
$status				响应状态码,例如:200成功、404页面找不到等。
$body_bytes_sent	给客户端发送的文件主体内容字节数
$http_referer		可以记录用户是从哪个链接访问过来的
$http_user_agent	用户所使用的代理(一般为浏览器)

其他常用变量
$request_uri 		包含请求参数的原始URI,不包含主机名
$uri 				不带请求参数的当前URI,不包含主机名
$http_x_forwarded_for 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$http_x_real_ip		可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$args 				这个变量等于请求行中的参数,同$query_string
$host 				请求主机头字段,否则为服务器名称。
$scheme 			HTTP方法(如http,https)
$document_uri 		与$uri相同
$document_root 		当前请求文件配置文件中html的根目录即root值
$request_filename 	当前请求的文件路径,由root或alias指令与URI请求生成

示例:
例:

http://localhost:10086/sswang1/sswang2/test.txt
$host				localhost
$server_port		10086
$request_uri		/sswang1/sswang2/test.txt
$document_uri		/sswang1/sswang2/test.txt
$document_root		/var/www/html
$request_filename	/var/www/html/sswang1/sswang2/test.txt

自定义日志实践(反向代理,获取客户端真实IP)
需求:

基于代理方式访问app1应用,日志存放在/var/logs/nginx/app1/access.log,要求能从日志中获取客户端的IP地址
因为是获取代理前面客户端的真实IP,需要nginx开启 --with-http_realip_module 功能,使用nginx
-V来检查,ubuntu默认安装的已经开启了该功能。

设置日志格式
~# vim /etc/nginx/nginx.conf
##
# Logging Settings
## 设定日志格式的方法: log_format 格式名称 “日志表现样式”

log_format proxy_format '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent "$http_referer"'
                    '"$http_user_agent" "$http_x_real_ip" "$http_x_forwarded_for"';

使用日志格式:
access_log 日志路径 格式名称;
负载均衡配置文件
~# vim /etc/nginx/conf.d/upstream.conf

upstream backends {
  server 192.168.8.14:10086;
}
server {
  listen 80;
  server_name localhost;
  location / {
    proxy_pass http://backends;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

后端代理配置文件
~# vim /etc/nginx/conf.d/backend.conf

server {
  listen 192.168.8.14:10086;
  root /var/www/html/app1/;
  access_log /var/log/nginx/app1/access.log proxy_format;
  real_ip_header X-Forwarded-For; 
  set_real_ip_from 192.168.0.0/16; #有无都行
  real_ip_recursive on;
  location / {
    try_files $uri $uri/ =404;
  }
}

查看日志:
app1日志

192.168.8.1 - - [12/Nov/2018:18:28:46 -0800] "GET / HTTP/1.0" 200 22 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" "192.168.8.1" "192.168.8.1"
192.168.8.14 - - [12/Nov/2018:18:29:30 -0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.47.0" "192.168.8.14" "192.168.8.14"
192.168.8.15 - - [12/Nov/2018:18:31:43 -0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.29.0" "192.168.8.15" "192.168.8.15"

二进制包安装方式

1.下载对应系统版本的二进制包:
2.安装:
rpm -ivh 二进制包名
3.主要目录:

Nginx配置简介
nginx软件目录:
工作目录:/etc/nginx
执行文件: /usr/sbin/nginx
日志目录:/var/log/nginx
启动文件:/etc/init.d/nginx
web目录:/var/www/html/,首页文件是index.nginx-debian.html
 /usr/share/nginx/html/ 首页文件是index.html

nginx配置文件(划分主、从配置文件):
默认文件(主):
/etc/nginx/nginx.conf
其他目录(从):
/etc/nginx/conf.d/

主配置文件(参考)

user  nginx;
worker_processes  4;

error_log  /data/logs/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  10240;
}


http {
    include       /etc/nginx/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  /data/logs/nginx/access.log  main;

    sendfile        on;
    tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;
    client_max_body_size 10M;
    client_body_buffer_size 128k;


    include /etc/nginx/conf.d/*.conf;
}

从配置文件(下载文件使用的):

server {
    listen       9999;
    access_log  /data/apps/logs/autoindex.access.log  main;

    location / {
        alias   /data/www/download/;
        autoindex on;
        autoindex_localtime on;
    }
}

tomcat方向代理

注意新建日志目录

server {
    listen       80;
    access_log          /data/logs/nginx/www_access.log;
    error_log           /data/logs/nginx/www_error.log;

    index index.html;
    charset utf8;
    root           /data/www/h5/dist;
    location /api/ {
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass http://127.0.0.1:9096/;
    }