Nginx 简介
nginx是一个高性能多进程的web服务器,相对比apache, 它对处理高并发请求有更好的性能
编译与安装
安装之前需要安装几个nginx基本功能所必需的库,
GCC编译器 : 用于编译C语言程序
PCRE库 : 函数库,很多软件所使用,支持正则
zlib库 :用于http请求做gzip格式压缩,减少网络传输量
OpenSSL开发库:如果我们的服务器不只是需要支持HTTP,
还需要更安全的SSL协议上传输HTTP,就需要OpenSSL了。
如果需要使用MD5、SHA1等散列函数,也相呼应安装它。
以上几个库为了方便,我们通过yum命令统一安装:
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel
到这里我们安装好了需要的基本库,下面来安装Nginx吧
首先需要下载Nginx安装包(推荐使用稳定版本) 地址:http://nginx.org/en/download.html
解压:tar -zxvf nginx-1.26.1.tar.gz
构建,编译,安装: ./configure & make & make install
执行完成后nginx运行文件默认安装在/usr/local/nginx下。
也可以通过这个命令参数指定安装路径
./configure --prefix=path
模块更新
以上是nginx基本安装,但是有时候需要使用nginx一些其他模块功能,就需要单独安装了。
以下举例说明:
添加状态查看模块
- ./configure --with-http_stub_status_module
- make
- make install 这个命令会把旧nginx执行文件添加old表示,并把新得nginx复制过来
常用命令
./sbin/nginx 默认启动方式
nginx 支持以下命令行参数:
-? 打印帮助 用于命令行参数。-h
-c 指定配置文件启动
-e 指定配置文件中 error_log 的路径
-g 设置全局配置指令 如设置启动用户为root
./sbin/nginx -g "user root
-p 设置 nginx 启动目录(默认值为/usr/local/nginx )
-q 禁止显示非错误消息 在配置测试期间。
-s 向主进程发送信号。 参数信号可以是以下项之一:
stop— 快速停止
quit— 优雅地停止
reload— 热装载重新加载配置
reopen— 重新打开日志文件
-t 检查配置是否正确
-T 检查配置是否正确,并输出信息
-v 打印 nginx 版本。
-V 打印 nginx 版本、编译器版本、并配置参数
配置详解
Nginx默认配置及说明如下:
#user nobody;
worker_processes 1;
#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 {
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 {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
其配置结构如下:
-——全局块
|
|——events块
|
-——http块
|
-————server块
|
-————location块
配置结构介绍:
- 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程
pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。- events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,
开启多个网络连接序列化等。- http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方 模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,
连接超时时间,单连接请求数等。- server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- location块:配置请求的路由,以及各种页面的处理情况。
下面给大家上一个配置文件,作为理解。
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg 。
debug 日志开启 必须在安装时 添加 --with-debug (允许debug)
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
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块。
upstream mysvr {
server 127.0.0.1:7878 weight=3; #weight是权重
server 192.168.10.121:3333 weight=3 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
location ~ .(jsp|jspx|do)?$ {
#获取请求地址
proxy_set_header Host $host;
#只能获取上一层ip,$remote_addr一般都是设置第一个代理上面
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#代理
proxy_pass http://127.0.0.1:8080;
}
}
}
配置说明
location匹配说明
- =表示把URI作为字符串,以便与参数中的uri做完全匹配。
- / 基于uri目录匹配
- ~表示正则匹配URI时是字母大小写敏感的。
- ~*表示正则匹配URI时忽略字母大小写问题。
- ^~表示正则匹配URI时只需要其前半部分与uri参数匹配即可。
匹配优先规则:
1. 精确匹配优先 =
2. 正则匹配优先 ^~
3. 前缀最大匹配优先
4. 配置靠前优化
root 与 alias 的区别
① 路径
root的处理结果:root路径+location路径
alias的处理结果:使用alias路径替换location路径
alias是一个目录别名的定义,root则是最上层目录的定义
② 作用域
alias只能作用在location中,而root可以存在server、http和location中
③ 语法格式
alias后面必须要用 “/” 结束,不然会被认为是个文件,而找不到对应的目录;而root则对 “/” 可有可无。
alias不支持正则匹配。
基于正则动静分离
简单动静分离配置
location ~* \.(gif|jpg|png|css|js)$ {
root /usr/local/static;
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
#expires 30d;
}
本地动静分离反向代理配置
#所有jsp的页面均交由tomcat处理
location ~ .(jsp|jspx|do)?$ {
#获取请求地址
proxy_set_header Host $host;
#只能获取上一层ip,$remote_addr一般都是设置第一个代理上面
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#代理
proxy_pass http://127.0.0.1:8080;
}
防盗链配置
# 加到需要配置的location 即可实现
valid_referers none blocked *.hc.com;
if ($invalid_referer) {
return 403;
}
下载限速
location /download {
limit_rate 1k; //限制每秒下载速度
limit_rate_after 30m; // 超过30秒之后限制每秒1k
}
创建IP黑名单
#封禁指定IP
deny 192.168.0.1;
#开放指定IP 段
allow 192.168.0.0/24;
#封禁所有
deny all;
#开放所有
allow all;
创建黑名单文件
echo ‘deny 192.168.0.132;’ >> balck.ip
http配置块中引入 黑名单文件
include black.ip;
allow和deny都可以在http,server,location,limit_except中使用
反向代理基本配置
正反向代理的概念
正向代理与反向代理技术实现上是没什么区别的,知识使用场景不同来区分正反向代理。
反向代理与正向代理的区别
正向代理 代理服务器位置: 客户端与服务都能连接的们位置
主要作用: 屏蔽客户端IP、集中式缓存、解决客户端不能直连服务端的问题。 应用场景: 爬虫、翻墙、maven 反向代理
代理服务器位置: 目标服务器内部 主要作用: 屏蔽服务端内部实现、负载均衡、缓存。 应用场景: Nginx 、Apache负载均衡应用
Nginx代理基本配置
Nginx 代理只需要配置 location 中配置proxy_pass 属性即可,指向代理的服务器地址。
除此还有一些其他属性介绍如下:
location = / {
proxy_pass # 代理服务
proxy_redirect off; # 是否允许重定向
proxy_set_header Host $host; # 传 header 参数至后端服务
proxy_set_header X-Forwarded-For $remote_addr; # 传 header 参数至后端服务
proxy_connect_timeout 90; # 连接代理服务超时时间
proxy_send_timeout 90; # 请求发送最大时间
proxy_read_timeout 90; # 读取最大时间
proxy_buffer_size 4k; # 指定 nginx 读缓存的大小
proxy_buffers 4 32k;#代理服务器响应的body所占用的buffer个数以及每个buffer大小
proxy_busy_buffers_size 64k; #缓存
proxy_temp_file_write_size 64k; #缓存
}
负载均衡配置与参数解析
通过proxy_pass 可以把请求代理至后端服务,但是为了实现更高的负载及性能, 我们的后端服务通常是多个,
这个是时候可以通过upstream 模块实现负载均衡。
upstream 的实现举例说明如下:
upstream backend {
server 127.0.0.1:8010 weight=1;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:8030 weight=1 backup;
}
location / {
proxy_pass http://backend;
}
upstream 相关参数
- server 反向服务地址加端口
- weight 权重
- max_fails 失败多少次认为主机已挂掉则,踢出
- fail_timeout 踢出后重新探测时间
- backup 备用服务
- max_conns 允许最大连接数
- slow_start 当节点恢复,不立即加入,而是等待 slow_start 后加入服务对列。
upstream 负载均衡算法介绍
- ll+weight 轮询加权重 (默认)
- ip_hash 基于Hash 计算 ,用于保持session 一至性
- url_hash 静态资源缓存,节约存储,加快速度(第三方)
- least_conn 最少链接(第三方)
- least_time 最小的响应时间,计算节点平均响应时间,然后取响应最快的那个,分配更高权重(第三方)
Nginx 高速缓存
使用场景: 调用服务多,数据量大,处理慢,数据固定,不经常变化
Nginx 缓存基本配置
1、在http元素下添加缓存区声明。
#proxy_cache_path 缓存路径
#levels 缓存层级及目录位数
#keys_zone 缓存区内存大小
#inactive 有效期
#max_size 硬盘大小
proxy_cache_path /data/nginx/cache_1 levels=1:2
keys_zone=cache_1:500m inactive=20d max_size=1g;
2、为指定location 设定缓存策略。
# 指定缓存区
proxy_cache cache_1;
#以全路径md5值做做为Key
proxy_cache_key $host$uri$is_args$args;
#对不同的HTTP状态码设置不同的缓存时间
proxy_cache_valid 200 304 12h;
缓存的清除
该功能采用第三方模块 ngx_cache_purge 实现。
1. 下载ngx_cache_purge 模块包
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
2. 查看已安装模块 ./sbin/nginx -V
3. 进入nginx安装包目录 重新安装
./configure --prefix=/root/svr/nginx
–with-http_stub_status_module
–with-http_ssl_module
–add-module=/root/svr/packages/ngx_cache_purge-2.3
4.重新编译 make
5.替换执行文件
make install或者手动拷贝安装目录/objs/nginx文件用于替换原nginx文件
6. 检测查看安装是否成功 nginx -t
7. 清除配置
location ~ /clear(/.*) {
#允许访问的IP
allow 127.0.0.1;
allow 192.168.1.100;
#禁止访问的IP
deny all;
#配置清除指定缓存区和路径(与proxy_cache_key一至)
proxy_cache_purge cache_luban $host 1 1 1is_args$args;
}
配置好以后 直接访问 :
访问生成缓存文件
http://www.hc.com/?a=1
# 清除生成的缓存,如果指定缓存不存在 则会报404 错误。
http://www.hc.com/clear/?a=1
说明:nginx会根据请求路径生成MD5,获取缓存文件路径,进行缓存或者清除。
proxy_cache_key生成md5规则;
proxy_cache_path缓存路径 levels指定目录数
比如: proxy_cache_path /data/nginx/cache_1 levels=1:2 proxy_cache_key abcdef
对应的缓存路径: /data/nginx/cache_1/f/de/
Nginx 性能参数调优
- worker_processes number
worker 进程数;
每个worker进程都是单线程的进程,它们会调用各个模块以实现多种多样的功能。
如果这些模块确认不会出现阻塞式的调用,那么,有多少CPU内核就应该配置多少个进程;
反之,如果有可能出现阻塞式调用,那么需要配置稍多一些的worker进程。
例如,如果业务方面会致使用户请求大量读取本地磁盘上的静态资源文件,
而且服务器上的内存较小,以至于大部分的请求访问静态资源文件时都必须读取
磁盘(磁头的寻址是缓慢的),而不是内存中的磁盘缓存,
那么磁盘I/O调用可能会阻塞住worker进程少量时间,进而导致服务整体性能下降。
- worker_connections number;
每个worker 进程的最大连接数;
默认:worker_connections 1024
- worker_cpu_affinity cpumask[cpumask……]
绑定worker进程指定CPU内核运行。
例如,如果有4颗CPU内核,就可以进行如下配置:
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
注意 worker_cpu_affinity配置仅对Linux操作系统有效。
说明:为什么要绑定worker进程到指定的CPU内核呢?
假定每一个worker进程都是非常繁忙的,如果多个worker进程都在抢同一个CPU,
那么这就会出现同步问题。反之,如果每一个worker进程都独享一个CPU,
就在内核的调度策略上实现了完全的并发。
- worker_priority nice;
worker 进程优先级设置;
默认:worker_priority 0;
如果用户希望Nginx占有更多的系统资源,那么可以把nice值配置得更小一些,
但不建议比内核进程的nice值(通常为–5)还要小。
说明:优先级由静态优先级和内核根据进程执行情况所做的动态调整共同决定。
nice值是进程的静态优先级,它的取值范围是–20~+19,–20是最高优先级,
+19是最低优先级,
worker_priority 默认值是0,建议只在±5内调整
- worker_rlimit_nofile limit;
更改worker进程的最大打开文件数限制;
如果没设置的话,这个值为操作系统的限制。
设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,
所以把这个值设高,这样nginx就不会有“too many open files”问题了。
- accept_mutex[on|off]
accept_mutex是Nginx的负载均衡锁;
默认:accept_mutext on;
说明:当某一个worker进程建立的连接数量达到worker_connections配置的
最大连接数的7/8时,会大大地减小该worker进程试图建立新TCP连接的机会。
accept锁默认是打开的,如果关闭它,那么建立TCP连接的耗时会更短,
但会导致worker进程之间的负载会非常不均衡,因此不建议关闭它。
- accept_mutex_delay Nms;
未获取到锁的worker进程需要等待的时长;
默认:accept_mutex_delay 500ms;
说明:在使用accept锁后,同一时间只有一个worker进程能够取到accept锁。
这个accept锁不是堵塞锁,如果取不到会立刻返回。
如果只有一个worker进程试图取锁而没有取到,
他至少要等待accept_mutex_delay定义的时间才能再次试图取锁。