1. Nginx 介绍
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
- Nginx一般用户七层负载均衡,其吞吐量有一定的限制。为了提高整体的吞吐量,会在DNS和Nginx之间引入LVS(软件负载均衡器)、F5(硬负载均衡器) 可以做四层负载均衡,首先DNS解析到LVS(F5),让后LVS(F5)转发给Nginx,在有Nginx转发给真实的服务器
2. Linux安装Nginx
- 安装依赖包
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
- 下载解压nginx安装包
//创建一个文件夹
cd /usr/local
mkdir nginx
cd nginx
//下载tar包
wget http://nginx.org/download/nginx-1.6.3.tar.gz
tar -xvf nginx-1.6.3.tar.gz
- 安装nginx
//进入nginx目录
cd /usr/local/nginx
//进入目录
cd nginx-1.6.3
//执行命令
./configure
//执行make命令
make
//执行make install命令
make install
- 启动nginx
/usr/local/nginx/sbin/nginx -s reload
如果出现报错:nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed
则运行: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
3. Nginx应用场景
- http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
- 虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
- 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
- nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。
4. Nginx目录结构
执行命令 tree /application/nginx ;如果tree命令找不到就执行 yum install tree -y安装
yum install tree -y
[root@vm10-0-0-128 local]# tree nginx/
nginx/
├── client_body_temp
├── conf #这是Nginx所有配置文件的目录,极其重要
│ ├── fastcgi.conf #fastcgi相关参数的配置文件
│ ├── fastcgi.conf.default #fastcgi.conf的原始备份
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types
│ ├── mime.types.default
│ ├── nginx.conf #这是Nginx默认的主配置文件
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default
│ ├── uwsgi_params
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp #fastcgi临时数据目录
├── html #这是编译安装时Nginx的默认站点目录 nginx首页与错误页面
│ ├── 50x.html
│ └── index.html
├── logs #这是Nginx默认的日志路径,包括错误日志及访问日志
│ ├── access.log #这是Nginx的默认访问日志文件,使用tail -f access.log,可以实时观看网站用户访问情况信息
│ ├── error.log #这是Nginx的错误日志文件,如果Nginx出现启动故障等问题,一定要看看这个错误日志
│ └── nginx.pid #Nginx的pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp #临时目录
├── sbin #这是Nginx命令的目录,如Nginx的启动命令nginx
│ └── nginx
├── scgi_temp #临时目录
└── uwsgi_temp #临时目录
5. Nginx主配置文件nginx.conf
#user nobody; #定义Nginx运行的用户和用户组
worker_processes 1; #nginx进程数,建议设置为等于CPU总核心数。
#error_log logs/error.log; #全局错误日志定义类型,
#error_log logs/error.log notice; #进程文件
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024; #单个进程最大连接数(最大连接数=连接数*进程数)
}
#HTTP区块开始 核心区域
http {
include mime.types; #Nginx支持的媒体类型库文件
default_type application/octet-stream; #默认媒体类型
#client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓存值
sendfile on; #开启高效文件传输模式,s
#tcp_nopush on; #防止网络阻塞
#tcp_nodelay on; #防止网络阻塞
#keepalive_timeout 0;
keepalive_timeout 65; #连接超时,单位是秒
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip模块设置
#gzip on; #开启gzip压缩输出
#虚拟主机的配置
server {
listen 8080; #监听端口
server_name localhost; #提供服务的域名主机名
# location的作用
# location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。
# 1. =开头表示精确匹配
# 2. ^~ 开头表示uri以某个常规字符串开头
# 3. ~ 开头表示区分大小写的正则匹配;
# 4. ~* 开头表示不区分大小写的正则匹配
# 5. / 通用匹配, 如果没有其它匹配,任何请求都会匹配到
location /{ # 对 /进行反向代理
root html; #站点的根目录
index index.html index.htm; #默认的首页文件
try_files $uri $uri/ /index.html;
proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
#以下是一些反向代理的配置,可选
proxy_set_header Host $host;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
location /i5n/ {
proxy_pass http://127.0.0.1:8080/i5n/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
# 错误页面 可以自定义自己都页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
6. 基于虚拟主机配置域名
#当客户端访问www.yanxiaolong.cn,监听端口号为80,直接跳转到data/www目录下文件
server {
listen 80;
server_name www.yanxiaolong.cn;
location / {
root data/www;
index index.html index.htm;
}
}
#当客户端访问blog.yanxiaolong.cn,监听端口号为80,直接跳转到data/blow目录下文件
server {
listen 80;
server_name blog.itmayiedu.com;
location / {
root data/blog;
index index.html index.htm;
}
}
7. 基于虚拟主机配置域名
#当客户端访问www.yanxiaolong.cn,监听端口号为8080,直接跳转到data/www目录下文件
server {
listen 8080;
server_name www.yanxiaolong.cn;
location / {
root data/www;
index index.html index.htm;
}
}
#当客户端访问blog.yanxiaolong.cn,监听端口号为8081,直接跳转到data/blog目录下文件
server {
listen 8081;
server_name blog.yanxiaolong.cn;
location / {
root data/blog;
index index.html index.htm;
}
}
8. Nginx配置反向代理
- 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
- 反向代理的好处隐藏真实内部ip地址,请求先访问nginx代理服务器(外网可以访问到),在使用nginx服务器转发到真实服务器中。
配置:
#当客户端访问api.yanxiaolong.cn,监听端口号为80直接跳转到真实ip服务器地址 127.0.0.1:8080
server {
listen 80;
server_name api.yanxiaolong.cn;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
#当客户端访问api2.yanxiaolong.cn,监听端口号为80直接跳转到真实ip服务器地址 127.0.0.1:8081
server {
listen 80;
server_name api2.yanxiaolong.cn;
location / {
proxy_pass http://127.0.0.1:8081;
}
}
9. Nginx配置负载均衡
- Nginx负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡、故障转移、失败重试、容错、健康检查等。
- 当上游服务器(真实业务逻辑访问的服务器)发生故障时,可以转移到其他上游服务器(真实业务逻辑访问的服务器)。
负载均衡算法
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。weight(轮询权值)
weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。ip_hash
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。俗称IP绑定。fair(第三方) 需要使用外部扩展
比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。url_hash(第三方) 需要使用外部扩展
按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。
轮询 :
upstream backServer{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name api.yanxiaolong.cn;
location / {
# 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
}
}
加权轮询 :
upstream backServer{
server 127.0.0.1:8080 wight = 1;
server 127.0.0.1:8081 wight = 2;
}
server {
listen 80;
server_name api.yanxiaolong.cn;
location / {
# 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
}
}
IP绑定ip_hash
upstream backServer{
server 127.0.0.1:8080 ;
server 192.168.10.225:8081 max_fails=3 fail_timeout=15;
ip_hash;
}
server {
listen 80;
server_name api.yanxiaolong.cn;
location / {
# 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
}
}
10. Nginx配置故障转移
- 当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。
upstream backServer{
server 127.0.0.1:8080 wight = 1;
server 127.0.0.1:8081 wight = 2;
}
server {
listen 80;
server_name www.itmayiedu.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
#nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 20s;
#nginx发送给上游服务器(真实访问的服务器)超时时间
proxy_send_timeout 20s;
### nginx接受上游服务器(真实访问的服务器)超时时间
proxy_read_timeout 20s;
}
}
补充:nginx rewrite
Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用。
~
Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。
通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。
Rewrite全局变量:
变量 | 说明 | |
---|---|---|
$args | 存放了请求url中的请求指令。比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的arg1=value1&arg2=value2 | |
$content_length | 存放请求头中的Content-length字段 | |
$content_type | 存放了请求头中的Content-type字段 | |
$document_root | 存放了针对当前请求的根路径 | |
$document_uri | 请求中的uri,不包含请求指令 ,比如比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的/server/source$host | $1 |
$host | 存放了请求url中的主机字段,比如比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的www.myweb.name。如果请求中的主机部分字段不可用或者为空,则存放nginx配置中该server块中server_name指令的配置值 | |
$http_cookie | cookie | |
$limit_rate | nginx配置中limit_rate指令的配置值 | |
$remote_addr | 客户端的地址 | |
$remote_port | 客户端与服务器端建立连接的端口号 | |
$remote_user | 变量中存放了客户端的用户名 | |
$request_body_file | 存放了发给后端服务器的本地文件资源的名称 | |
$request_method | 存放了客户端的请求方式,如get,post等 | |
$request_filename | 存放当前请求的资源文件的路径名 | |
$query_string | $args含义相同 | |
$scheme | 客户端请求使用的协议,如http,https,ftp等 | |
$server_protocol | 客户端请求协议的版本,如”HTTP/1.0”,”HTTP/1.1” | |
$server_addr | 服务器的地址 | |
$server_name | 客户端请求到达的服务器的名称 |
判断IP地址来源
server {
listen 80;
server_name www.yanxiaolong,cn;
location / {
# 如果不是白名单则 显示403 禁止访问
if ($remote_addr = 192.168.5.166) {
return 403;
}
}
限制浏览器访问
server {
listen 80;
server_name www.yanxiaolong,cn;
location / {
## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
if ($http_user_agent ~ Chrome) {
return 500;
}
}
Nginx1.9开始支持tcp层的转发,通过stream实现的
### 修改为TCP模块
tcp {
### 定义多个上游服务器
upstream backServer{
### 定义TCP模块上游服务器
server 192.168.5.165:80001;
server 192.168.5.165:80002;
}
server {
listen 9999;
server_name api.yanxiaolong.cn;
### 反向代理upstream
proxy_pass backServer;
}
}
个人博客地址:http://blog.yanxiaolong.cn/