编译安装nginx
#安装前需要先准备好编译环境,和nginx需要的组件 [root@nginx ~]# yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y #下载需要安装的版本号 https://nginx.org/en/download.html #解压源码包 [root@nginx ~]# tar -zxvf nginx-xxx.tar.gz #进入解压目录,简单配置并安装 [root@nginx ~]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module [root@nginx ~]# make && make install #启动nginx [root@nginx ~]# /usr/local/nginx/sbin/nginx #重载配置 [root@nginx ~]# /usr/local/nginx/sbin/nginx -s reload #停止nginx [root@nginx ~]# /usr/local/nginx/sbin/nginx -s stop #检查配置文件 [root@nginx ~]# /usr/local/nginx/sbin/nginx -t
yum安装nginx
#配置nginx yum源,系统需要要换成对应的系统 [root@test ~]# vi /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 #安装 [root@test ~]# yum install nginx
nginx目录结构
conf 存放nginx所有配置文件的目录,主要nginx.conf html 存放nginx默认站点的目录,如index.html、error.html等 logs 存放nginx默认日志的目录,如error.log access.log sbin 存放nginx主程序的目录,sbin/nginx
整体配置文件
#定义Nginx运行的用户 user nobody; #nginx进程数,通常为物理cpu核心数-1。 worker_processes 8; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] error_log /usr/local/nginx/logs/error.log info; #进程pid文件 pid /usr/local/nginx/logs/nginx.pid; #指定进程可以打开的最大描述符个数,通常为ulimit -n的值 worker_rlimit_nofile 65535; events { #默认使用epoll模型 use epoll; #单个进程最大连接数(最大连接数=连接数*进程数) worker_connections 65535; #keepalive超时时间。 keepalive_timeout 60; #客户端请求头部的缓冲区大小。通常为getconf PAGESIZE取得的结果 client_header_buffer_size 4k; #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。 open_file_cache max=65535 inactive=60s; #这个是指多长时间检查一次缓存的有效信息,默认60s open_file_cache_valid 60s; #指明缓存inactive时间没有用过多少次就删掉,默认1次 open_file_cache_min_uses 1; #这个指令指定是否在搜索一个文件是记录cache错误,默认off open_file_cache_errors on; } http { #包含这个文件,文件扩展名与文件类型映射表 include mime.types; #默认文件类型 default_type application/octet-stream; #默认编码 charset utf-8; #服务器名字的hash表大小 server_names_hash_bucket_size 128; #客户端请求头部的缓冲区大小。 client_header_buffer_size 32k; #客户端请求头缓冲大小。 large_client_header_buffers 4 64k; #限制通过nginx上传文件的大小 client_max_body_size 8m; #开启高效文件传输模式,同时开启下面选项 sendfile on; tcp_nopush on; tcp_nodelay on; #开启目录列表访问,合适下载服务器,默认off。 autoindex off; #长连接超时时间,单位是秒 keepalive_timeout 120; #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压缩输出 gzip_min_length 1k; #最小压缩文件大小 gzip_buffers 4 16k; #压缩缓冲区 gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0) gzip_comp_level 2; #压缩等级 gzip_types text/plain application/x-javascript text/css application/xml; #压缩哪种文件 gzip_vary on; #开启限制IP连接数的时候需要使用 #limit_zone crawler $binary_remote_addr 10m; #负载均衡配置 upstream 负载组名1 { #轮询机制,weight是权重,值越高负载几率越大 server 192.168.1.1:80 weight=3; server 192.168.1.2:80 weight=2; server 192.168.1.3:80 weight=3 down; #关闭状态 server 192.168.1.4:80 weight=3; server 192.168.1.5:80 weight=3 backup;#当其他服务器都坏掉才使用这个 } upstream 负载组名2 { #源地址hash机制,按照请求ip的hash结果分配,每个访客可以固定访问一个后端服务器 ip_hash; server 192.168.1.1:80; server 192.168.1.2:80; } upstream 负载组名3 { #响应时间机制,按后端服务器的响应时间来分配请求,响应时间短的优先分配。 server 192.168.1.1:80; server 192.168.1.2:80; fair; } upstream 负载组名4 { #访问url hash机制,按照目标url的hash结果分配 server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; } server { #监听端口 listen 80; #域名可以有多个,用空格隔开 server_name www.a.cn b.cn; #网站默认首页 index index.html index.htm index.php; #网站页面存放路径 root html; #图片缓存时间设置 #日志格式设定 #$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址; #$remote_user:用来记录客户端用户名称; #$time_local: 用来记录访问时间与时区; #$request: 用来记录请求的url与http协议; #$status: 用来记录请求状态;成功是200, #$body_bytes_sent :记录发送给客户端文件主体内容大小; #$http_referer:用来记录从那个页面链接访问过来的; #$http_user_agent:记录客户浏览器的相关信息; #通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; #定义本虚拟主机的访问日志 access_log /usr/local/nginx/logs/host.access.log main; access_log /usr/local/nginx/logs/host.access.404.log log404; #对 "/" 启用反向代理 location / { #代理至http段的负载 proxy_pass http://负载组名; proxy_redirect off; 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_set_header Host $host; #允许客户端请求的最大单文件字节数 client_max_body_size 10m; #缓冲区代理缓冲用户端请求的最大字节数, client_body_buffer_size 128k; #表示使nginx阻止HTTP应答代码为400或者更高的应答。 proxy_intercept_errors on; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_connect_timeout 90; #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据 proxy_send_timeout 90; #后端服务器处理请求的时间 proxy_read_timeout 90; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffer_size 4k; #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小 proxy_buffers 4 32k; #高负荷下缓冲大小(proxy_buffers*2) proxy_busy_buffers_size 64k; } #设定查看Nginx状态的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file confpasswd; #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。 } #本地动静分离反向代理配置 #所有jsp的页面均交由tomcat或resin处理 location ~ .(jsp|jspx|do)?$ { 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:8080; } #所有静态文件由nginx直接读取不经过tomcat或resin location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 15d; } location ~ .*.(js|css)?$ { expires 1h; } } }
主配置段指令
正常运行的必备配置
1.user USERNAME [GROUPNAME];指定运行worker进程的用户和组,组省略代表跟用户名一样的组
2.pid /PATH/TO/PID_FILE;指定nginx守护进程的pid文件
3.worker_rlimit_nofile #;指定所有worker进程所能打开的最大文件数
性能优化的相关配置
1.worker_processes #; 指定worker进程的个数,通常为cpu物理核心-1个
2.worker_cpu_affinity CPU掩码 ;进程与cpu绑定,能够提升cpu缓存命中率
3.timer_resolution #; 计时器解析度,降低会提升性能
4.worker_priority #;指定worker进程的nice值
事件的相关配置
1.accept_mutex on|off;主进程调度用户请求至各工作进程使用的负载均衡锁,on表示能让多个工作进程轮流、有序的响应新请求
2.lock_file /PATH/TO/FILE;上面那个锁的路径
3.use [epoll|rtsig|select|poll];知名使用的事件模型,建议让nginx自行选择
4.worker_connections #;设定单个工作进程所能够处理的并发连接数量
调试、定位问题
1.daemon [on|off];是否以守护进程方式来运行nginx,调试时设置为off,会出现信息
2.master_process [on|off];是否以master/worker模型来运行nginx,调试时可以设置为off
3.error_log 记录位置 级别;记录日志,若要使用debug级别,需要在编译nginx时使用了--with-debug选项
http配置段
[root@test nginx]# grep -v "#" conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.a.com; location / { root /www; index index.html index.htm; } location /status { stub_status on; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
1.listen:监听地址或端口
2.sever_name:设置网站名,同时可以设置网站别名,用空格隔开
3.root:定义网页目录,可以用于server,location字段,右侧斜线"/"必须同时有或没有
location /aaa/{ root /nginx/www/ #访问aaa相当于/nginx/www/aaa }
4.alias:用于location配置段,定义路径别名,右侧斜线"/"必须同时有或没有
location /bbb/{ alisa /nginx/www/ #访问aaa相当于/nginx/www }
5.server_name匹配方法:
(1)先做精确匹配检查
(2)左侧通配符匹配检查,*.a.com
(3)右侧通配符匹配检查,www.*
(4)正则表达式匹配检查,
(5)默认虚拟主机
6.location [ = | ~ | ~* | ^~ ] URI { ... }:根据用户请求的URI做处理
=:精确匹配检查,最高优先级
^~:URI的前半部分匹配,不支持正则表达式
~:正则表达式模式匹配检查,区分字符大小写
~*:正则表达式模式匹配检查,不区分字符大小写
无符号:最低优先级
7.index:默认主页面
index index.php index.html;
8.根据http响应的状态码来指定错误页面:error_page # # [=#] /PATH/TO/FILE:
error_page 400 404 =100 100_error.html; 当http回应400或404状态码时,将他重置为100,并返回当前目录下100_error.html页面
9.基于ip的访问控制
allow IP/NETWORK;
deny IP/NETWORK;
10.基于账号的认证
auth_basic ""; 输入密码的提示
auth_basic_user_file "/PATH/TO/PASSWORD_FILE" 密码文件可以使用htpasswd创建
11.https服务
#server { listen 443 ssl; server_name localhost; ssl_certificate cert.pem; #指定证书 ssl_certificate_key cert.key; #指定证书私钥 location / { root html; index index.html index.htm; } }
12.状态信息
location /status { stub_status on; allow 172.17.148.112; deny all; }
13.状态信息解释
Active connections: 1 #当前所有处于打开状态的连接数 server accepts handled requests 13 13 25 #已经接受过的连接数 #已经处理过的连接数 #已经处理过的请求数,keepalive模式下,请求数量会多于连接数量 Reading: 0 Writing: 1 Waiting: 0 #正处于接收请求状态的连接数 #请求已经接收完成,正处于处理请求或发送响应的过程中的连接数 #keepalive模式处于活动状态的连接数
14.URL重写rewrite 正则 替换内容 标志
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
例:www.a.com/images/a/b.jpg就会换成www.a.com/imgs/a/b.jpg
标志:
last:会在location内一直循环匹配,直到都匹配完成才结束
break:替换一次就不会再替换了
redirect:以302响应码临时重定向返回新的URL
permanent:以301响应码永久重定向返回新的URL
15.if (表达式) {} 条件判断可以应用在srever、location
(1)变量名:变量名为空或者为0,则为false;其他的都为true
(2)比较表达式:=,>,<,!=类似的比较字符串进行比较
(3)正则表达式:~区分大小写,~*不区分大小写
(4)是否为文件:-f,!-f
(5)是否为目录:-d,!-d
(6)文件是否存在:-e,!-e
(7)文件是否有执行权限:-x,!-x
例:if ($http_usr_agent ~* MSIE){
rewrite ^(.*)$ /msie/$1 break; 假如浏览器类型为微软,就定向到msie目录下
}
16.定制访问日志,log_format 日志名 日志格式
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; ##log_format:用来定义记录日志的格式,取不同名字即可 ##main:定义后面日志的名字 ##access_log:用来指定日志文件的路径及使用哪种格式进行记录 ##$remote_addr:记录访问网站的客户端地址 ##$remote_user:远程客户端用户名称 ##$time_local:用户访问时间与时区 ##$request:用户的http请求起始行信息 ##$status:记录请求返回的状态码 ##$body_bytes_sent:服务器发送给客户端的响应主体字节数 ##$http_referer:记录此次请求时由哪个链接跳转而来 ##$http_user_agent:用户的浏览器类型 ##$http_x_forwarded_for:当前端是代理服务器时,记录由哪个代理转发而来
16.1错误日志
error_log /var/log/nginx/error.log warn; ##可以配置在main,http,server,location段。 ##错误日志级别有debug、info、notice、warn、error、crit、alert、emerg ##错误日志默认级别为error,配置较低等级会导致大量磁盘I/O
17.实现反向代理
location / { proxy_pass http://172.17.148.255/; #将访问的所有数据都代理给后面的 proxy_set_header ahost $proxy_host; #传送代理主机的ip,为了记录日志 proxy_set_header bhost $http_host; #从哪个代理过来的ip+端口 proxy_set_header Host $host; #当有多个虚拟主机时,代理服务器可以识别访问的是哪个虚拟主机 proxy_set_header dhost $proxy_port; #从哪个代理过来的端口 proxy_set_header X-Forwarded-For $remote_addr; #真实请求的主机ip } location /nginx.txt { proxy_pass http://172.17.148.255/nginx/nginx.txt; #将匹配到的内容定向后面 } location ~* \.(jpgg|pngg)$ { #假如这里是根据正则匹配的↓ proxy_pass http://172.17.148.255; #下面这里不能加任何路径,因为会在路径后面补全前面匹配到的内容 }
#######定义完传送的日志名称后,需在在后端服务器上修改对应的日志格式,以后端httpd为例
LogFormat "%{ahost}i %{bhost}i %{chost}i %{dhost}i %{ehost}i" combined
18.定义缓存
http { proxy_cache_path /cache/nginx levels=1:1:1 keys_zone=mycache:10m; } #定义缓存必须在http段,/cache/nginx/目录必须为worker进程的属主属组 #levels代表有几个层级目录,最多3层,1:1:1代表有三层目录,1代表目录名最多一个字符 #keysz_zone代表缓存名称,后面引用的时候会用,大小为10M
19.使用缓存
location / { proxy_cache mycache; #定义使用的缓存空间 proxy_cache_valid 200 1m; #状态码为200缓存1分钟 proxy_cache_valid 301 302 10m; #状态码为301 302 缓存10分钟 proxy_cache_valid any 1m; #状态码为其他缓存1分钟 proxy_cache_methods GET HEAD #设置http请求方法为get或head时才使用缓存 proxy_cache_use_stale error timeout #当后方服务器为什么状态时可以使用过期的缓存 proxy_cache_min_uses 2; #同一资源使用几次后才缓存 proxy_cache_bypass $ cookie_nocache $ arg_nocache $ arg_comment; #定义不从缓存中获取响应的条件 proxy_set_header ehost $remote_addr; #真实请求的主机ip proxy_pass http://172.17.148.255/; }
20.负载均衡,服务器组
upstream backend { #定义服务器组,只能在http段定义 server 10.1.1.1 weight=2; #设置权重为2,默认权重为1 server 10.1.1.2:8080; #可以加端口 server 10.1.1.3 fail_timeout=5s max_fails=3; #最多尝试3次,超时后每5秒检查一次 server 10.1.1.4 backup; #备份服务器,当其他节点都不可用时,才用这个 server 10.1.1.5 down; #标致服务器状态为不可用 server 10.1.1.6 weight=1 max_fails=1 fail_timeout=10s; #默认配置 server www.abc.com:8080; #同时可以使用域名加端口的方式 } server { listen 80; server_name www.aaa.com; location / { proxy_pass http://backend; #当访问www.aaa.com时,发送给上面定义的服务器组 } }
21.session保持
upstream keepsession{ ip_hash; server 10.1.1.1; server 10.1.1.2; } ##ip_hash,根据源ip进行会话保持,后端服务器在负载均衡调度中的状态不能有weight和backup ##fair,根据后端服务器的响应时间 ##least_conn,根据后端服务器节点的连接数 ##hash $request_rui,根据访问的URL ##consistent_hash $request_rui,一致性hash
网络相关的配置
1.keepalive_timeout #; 长连接超时时长,默认75秒
2.keepalive_request #; 在一个长连接上所能够允许请求的最大资源数
3.keepalive_disables [msie6|safari|none]; 为指定类型浏览器禁用长连接
4.tcp_nodelay on | off; 是否对长连接使用延迟功能
5.client_hearder_timeout #; 读取http请求报文首部超时时长
6.client_body_timeout #;读取http请求报文body部分超时时长
7.send_timeout #;发送响应报文的超时时长
fastcgi相关配置
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; }
相关优化
1.隐藏nginx的版本号信息
http { server_tokens off; #隐藏版本号 } ##可以放置在http、server、location段中,默认配置为on
2.进程数和cpu绑定
##假设单颗四核心cpu http{ worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; } ##配置4个工作进程,把这四个进程分别绑定到cpu的4个核心上 http{ worker_processes 2; worker_cpu_affinity 0101 1010; } ##配置2个工作进程,把第一个进程分配到1、3cpu上,把第二个进程分配到2、4cpu上
3.单个进程最大连接数
events { worker_connections 1024; } ##最大连接数=工作进程个数*单个进程做大连接数
4.连接超时设置
###都可以在http、server、location中做 keepalive_timeout 60; #长连接超时时间 client_header_timeout 60; #超过多长时间还没收到客户端的请求头部就断开 client_body_timeout 60; #超过多长时间还没收到客户端的请求主体就断开 send_timeout 60; #客户端如果超过多长时间没有接收数据就断开
5.上传文件大小的限制
###可以放置在http、server、location段 client_max_body_size 1m; #如果客户端请求主体大小超过1m,就返回413错误
6.压缩功能
#####压缩文本文件,图片和视频不要压缩 gzip on; #开启压缩功能 gzip_min_length 1k; #设置低于1k的文件不压缩,如果压缩低于1k的文件可能会变大 gzip_comp_level 2; #设置压缩比,1压缩比最小,压缩速度最快;9压缩比最大,压缩速度最慢 gzip_types text/html text/css text/xml;设置哪些类型的文件被压缩 gzip_vary on;
7.错误页面优雅显示
error_page 400 401 402 403 404 =200 /error.html ##当返回状态码为40...时,重置为200,并返回/error.html页面 error_page 500 501 http://www.abc.com ##当返回状态码为50..时,返回这个网页
·