1.安装
1.1准备依赖包
1.1.1pcre
--下载
cd /usr/local/src
wget https://ftp.pcre.org/pub/pcre/pcre-8.32.tar.gz
--解压
tar -zxvf pcre-8.32.tar.gz
cd pcre-8.32
./configure
make
make install
--链接nginx所需的so
cd /lib64
ln -s libpcre.so.0.0.1 libpcre.so.1
1.2安装
下载安装包
cd /usr/local/src
wget http://nginx.org/download/nginx-1.10.3.tar.gz
解压
tar -zxvf nginx-1.10.3.tar.gz
配置并检查,设置安装位置为/usr/local/nginx,不指定prefix,则可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc
./configure --prefix=/usr/local/nginx
如提示安装依赖包如PCRE,见上一节
安装
make && make install
1.3服务设置
创建服务文件
touch /etc/rc.d/init.d/nginx
将以下内容写入到该文件,文件需要在linux环境下编辑
#!/bin/sh
# chkconfig: 2345 85 15
# Startup script for the nginx Web Server
# description: nginx is a World Wide Web server.
# It is used to serve HTML files and CGI.
# processname: nginx
# pidfile: /usr/local/nginx/logs/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx deamon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
SCRIPTNAME=/etc/init.d/$NAME
test -x $DAEMON || exit 0
d_start(){
$DAEMON || echo -n "already running"
}
d_stop(){
$DAEMON -s quit || echo -n "not running"
}
d_reload(){
$DAEMON -s reload || echo -n "can not reload"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
d_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
d_stop
echo "."
;;
reload)
echo -n "Reloading $DESC conf..."
d_reload
echo "reload ."
;;
restart)
echo -n "Restarting $DESC: $NAME"
d_stop
sleep 2
d_start
echo "."
;;
*)
echo "Usage: $ScRIPTNAME {start|stop|reload|restart}" >&2
exit 3
;;
esac
exit 0
设置执行权限
chmod +x /etc/init.d/nginx
添加系统服务
chkconfig --add nginx
设置为开机启动
chkconfig nginx on
1.4运行
service nginx start #启动服务
service nginx stop #停止服务
service nginx restart #重启服务
service nginx reload #重新读取配置文件
nginx正常运行后,会启动N个进程,其中一个是父进程,负责监控其子进程。其他的是工作进程
默认日志存放在系统日志:/usr/local/nginx/logs下
2、配置
配置文件位于/usr/local/nginx/conf/nginx.conf
2.1进程配置
worker_processes
- 配置工作进程数量,一般不超过CPU数量
示例:
worker_processes 2
error_log
- 配置错误日志位置及日志级别(debug|info|notice|warn|error|crit)
- 示例: error_log logs/error.log info;
pid
- 配置主进程的进程ID记录文件位置
示例:
pid logs/nginx.pid;
worker_connections
- 配置每个工作进程的最大并发连接数
- Nginx总的最大并发连接数为worker_processes* worker_connections。如果Nginx作为反向代理将动态请求转发给Tomcat等,这部分的最大并发连接数为 worker_processes* worker_connections/4
示例:
worker_connections 2048
2.2日志配置
access_log
- 作用:设置日志文件位置及输出方式
- 语法:
- 普通日志:access_log path [format [buffer=size [flush=time]] [if=condition]];
- Gzip压缩日志:access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
- 关闭日志:access_log off;
示例:
access_log logs/access.log main buffer=5k flush=1m
表示日志文件输出在logs/access.log,使用main格式,日志输出缓存为5k,最大输出时间为1分钟
log_format
- 作用:配置日志格式
- 语法:log_format name string …;
示例:
log_format main '$request_time,"$request",$body_bytes_sent';
日志格式名为main,输出请求处理时间、请求地址、响应数据量
格式参数包括
参数 | 含义 |
---|---|
remoteaddr, http_x_forwarded_for | 记录客户端IP地址 |
$remote_user | 记录客户端用户名称 |
$request | 记录请求的URL和HTTP协议 |
$status | 记录请求状态 |
$body_bytes_sent | 发送给客户端的字节数,不包括响应头的大小; |
$bytes_sent | 发送给客户端的总字节数。 |
$connection | 连接的序列号。 |
$connection_requests | 当前通过一个连接获得的请求数量。 |
$msec | 日志写入时间。单位为秒,精度是毫秒。 |
$pipe | 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。 |
$http_referer | 记录从哪个页面链接访问过来的 |
$http_user_agent | 记录客户端浏览器相关信息 |
$request_length | 请求的长度(包括请求行,请求头和请求正文)。 |
$request_time | 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,到把最后一个字符发送给客户端后进行日志写入为止。 |
$time_iso8601 | ISO8601标准格式下的本地时间。 |
$time_local | 通用日志格式下的本地时间。 |
性能监控技巧
性能测试时,可以将log作如下配置
log_format main '$request_time,"$request",$body_bytes_sent'; access_log logs/access.log main;
以上配置将处理时间、请求url等信息记录到logs/access.log文件中,并按照csv格式以“,”分割。
- 可在MySQL中建立一张表,表字段对应记录的字段,使用Navicat for MySQL的导入向导使用csv格式将数据导入到表中
- 使用SQL预计统计分析,找出处理时间长需要优化的请求
2.3文件传输配置
sendfile
- 作用:配置是否启用sendfile,sendfile一般能够提升文件读性能
- 语法:sendfile on|off
示例:
sendfile on
gzip
- 作用:配置是否启用压缩
- 语法: gzip on|off
gzip_min_length
- 作用:配置启用gzip的最小文件大小
gzip_types
- 作用:配置gzip的MIME类型
- 示例:
gzip on;
gzip_min_length 1024;
gzip_types text/plain text/css application/x-javascript application/javascript;
2.4服务器配置
#语法规则: location [=|~|~|^~] /uri/ { … }
#= 开头表示精确匹配
#^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
#~ 开头表示区分大小写的正则匹配
#~*开头表示不区分大小写的正则匹配
#!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
#/ 通用匹配,任何请求都会匹配到。
server {
#监听80端口
listen 80;
location = / {
#A: 只匹配 / 查询。
root "../tomcat1/webapps/";
}
location / {
#B: 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
[ configuration B ]
}
location ^~ /images/ {
#C: 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
#D: 匹配任何已 gif、jpg 或 jpeg 结尾的请求。
[ configuration D ]
}
}
示例:
/ #请求匹配A
/documents/document.html #匹配B
/images/1.gif #匹配C
/documents/1.jpg #匹配D
2.5反向代理
upstream
定义后台处理服务器tomcat ,支持集群服务器
server
定义nginx的http服务,并指定使用定义的tomcat作为代理转发目的地
注:需要在tomcat的server.xml文件中配置Connector属性proxyPort=“80”(nginx监听端口),防止redirect操作出现问题
定义服务器,支持集群
upstream tomcat{
server 127.0.0.1:81;
server 127.0.0.1:82;
}
server {
listen 80;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#使用upstream定义的服务器处理
proxy_pass http://tomcat/;
}
}
或者
upstream tomcat{
least_conn;
server 10.0.0.1:80 weight=3 max_fails=1 fail_timeout=10s;
server 10.0.0.2:80 max_fails=1 fail_timeout=10s;
server 10.0.0.3:80 backup; server 10.0.0.4:80 down;
}
集群调度机制 | 参数 | 方式 | 特点 |
---|---|---|---|
轮询 | 默认 | 将请求轮流发送到各台服务器 | |
IP Hash | ip_hash | 将同一IP一直发送到一台服务器 | 避免了集群Session问题 |
最少连接机制 | least_conn | 将请求发送到连接最少的服务器 | 最优的集群性能 |
weight 比重
以上文配置为例,每4次请求,平均有3次访问服务器1,1次访问服务器2(受IP Hash、最少连接机制影响略有不同)
健康检测
- 出现了max_fails次失败后,在fail_timeout时间内,不访问该后端服务器,超过该时间可再次进行健康检测;
- 当服务器1、2全部宕机时,标记为backup的第三台机器开始接收请求;
- 标记为down的服务器表示服务器不可用于处理请求。
2.6WebSocket支持
默认后端服务器60s内未发送数据Nginx将会关闭连接,可通过proxy_read_timeout增大时间或者后端服务器使用心跳机制
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
...
location /chat/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}
2.7完整配置示例
#user nobody;
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 {
#使用网络IO模型linux建议epoll,FreeBSD建议采用kqueue,window下不指定
#use epoll;
#允许最大连接数
worker_connections 2048;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$request_time] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
log_format main '$request_time,"$request",$body_bytes_sent';
#access_log logs/access.log main;
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
gzip on;
gzip_min_length 1024;
gzip_types text/plain text/css application/x-javascript application/javascript;
#定义服务器,支持集群
upstream tomcat {
#在fail_timeout时间内出现了max_fails次失败后,不访问该后端服务器,超过该时间可再次访闿
#server 127.0.0.1:81 max_fails=1 fail_timeout=10s;
#server 127.0.0.1:82 max_fails=1 fail_timeout=10s;
server 127.0.0.1:81;
}
server {
listen 80;
server_name tomcat;
#charset koi8-r;
#access_log logs/host.access.log main;
#语法规则_location [=|~|~|^~] /uri/ { ?}
#= 开头表示精确匹酿
#^~ 开头表示uri以某个常规字符串开头,理解为匹酿url路径即可。nginx不对url做编码,因此请求丿static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)?
#~ 开头表示区分大小写的正则匹酿
#~ 开头表示不区分大小写的正则匹配
#!~咿~*分别为区分大小写不匹配及不区分大小写不匹酿的正刿
#/ 通用匹配,任何请求都会匹配到?
#处理静态文仿
location ~ \.(js|css|png|jpg|jpeg|gif|ico|xml|swz|swf|svg)$ {
root "../Tomcat/webapps/";
}
#处理所有非静态文仿
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#确定在何种情况下请求将转发到下一个服务器,值包括[error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off]
proxy_next_upstream error timeout invalid_header;
proxy_connect_timeout 40s;
proxy_read_timeout 40s;
proxy_send_timeout 40s;
#使用upstream定义的服务器处理
proxy_pass http://tomcat/;
#使用upstream服务器时,必须添加proxy_set_header设置请求主机地址,否则请求地址将变丿http://tomcat/1.jpg而不是http://192.168.1.22/1.jpg
#root html;
#index index.html index.htm;
}
#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;
# }
#}
}