一、安装Nginx
#创建nginx用户
groupadd -r nginx
useradd -r -g nginx -s /bin/false -M nginx
#安装依赖包
yum install gcc openssl-devel pcre-develzlib-devel -y
#下载解压源码
cd /usr/src/
wget ftp://172.16.0.1/pub/Sources/sources/nginx/nginx-1.6.2.tar.gz
tar xf nginx-1.6.2.tar.gz
#编译安装
cd /usr/src/nginx-1.6.2
./configure --prefix=/usr/local/nginx--conf-path=/etc/nginx/nginx/nginx.conf --user=nginx --group=nginx--error-log-path=/var/log/nginx/error.log--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid--lock-path=/var/lock/nginx.lock --with-http_ssl_module--with-http_stub_status_module --with-http_gzip_static_module--with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client--http-proxy-temp-path=/var/tmp/nginx/proxy--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi
make && make install
#启动nginx
mkdir /var/tmp/nginx/client -pv
/usr/local/nginx/sbin/nginx
#查看是否启动
lsof -i :80
[root@localhost sbin]# lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 22462 root 6u IPv4 57010 0t0 TCP *:http (LISTEN) nginx 22463 nginx 6u IPv4 57010 0t0 TCP *:http (LISTEN) |
#添加启动服务脚本
vi /etc/rc.d/init.d/nginx
#user nobody; 指定运行worker进程的用户 worker_processes 1; worker线程的个数,通常为物理CPU核心个数减1
#error_log logs/error.log; #error_log logs/error.log notice; 错误日志,后面是日志级别 #error_log logs/error.log info; #error_log /dev/null; 这样可以关闭日志记录
#pid logs/nginx.pid; 指定nginx的pid文件
#指定文件描述符数量
#工作模式及连接上限 events { worker_connections 1024; 单个进程的最大连接数 }
#设定http服务器 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"';
#日志名称,和日志记录格式采用main以及存放位置 #access_log logs/access.log main;
server_names_hash_bucket_size 128;
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件。请求的资源由内核获取后不再经过用户空间直接由内核封装后响应给请求方 sendfile on; #tcp_nopush on; 防止网络阻塞
#keepalive_timeout 0; keepalive_timeout 65; 保持连接的超时时长,默认为65s
fastcgi_connect_timeout 300;
#gzip on;开启gzip模块 #该指令允许压缩的页面最小字节数
#定义一个虚拟主机 server { listen 80; 虚拟机监听的服务器地址和端口号 server_name localhost; 可跟多个主机名,主机名可以使用通配符和正则表达式(~)
#charset koi8-r; 字符集,网站编码
#access_log logs/host.access.log main; 设定本虚拟机的访问日志
#允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理 location / { root html; 设置web资源路径映射,用于指明请求的URL所对应的文档的根目录路径 index index.html index.htm; 默认的主页面 }
#error_page 404 /404.html; 根据http状态码重定向错误页面
# redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; 根据http状态码重定向错误页面 location = /50x.html { root html; }
# proxy the PHP scripts to Apache listening on 127.0.0.1:80 #php脚本代理给127.0.0.1:80处理(比如可以做apache处理后端) #location ~ \.php$ { # proxy_pass http://127.0.0.1; #}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 #PHP脚本用FastCGI模式处理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; #} }
#HTTPS server #支持ssl协议的虚拟机相关设置 #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; # } #} } |
而后为此脚本赋予执行权限:
# chmod +x /etc/rc.d/init.d/nginx
添加至服务管理列表,并让其开机自动启动:
# chkconfig --add nginx
# chkconfig nginx on
而后就可以启动服务并测试了:
# service nginx start
二、配置Nginx
#nginx的配置文件
/etc/nginx/nginx/nginx.conf
#user nobody; 指定运行worker进程的用户 worker_processes 1; worker线程的个数,通常为物理CPU核心个数减1
#error_log logs/error.log; #error_log logs/error.log notice; 错误日志,后面是日志级别 #error_log logs/error.log info; #error_log /dev/null; 这样可以关闭日志记录
#pid logs/nginx.pid; 指定nginx的pid文件
#指定文件描述符数量
#工作模式及连接上限 events { worker_connections 1024; 单个进程的最大连接数 }
#设定http服务器 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"';
#日志名称,和日志记录格式采用main以及存放位置 #access_log logs/access.log main;
server_names_hash_bucket_size 128;
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件。请求的资源由内核获取后不再经过用户空间直接由内核封装后响应给请求方 sendfile on; #tcp_nopush on; 防止网络阻塞
#keepalive_timeout 0; keepalive_timeout 65; 保持连接的超时时长,默认为65s
fastcgi_connect_timeout 300;
#gzip on;开启gzip模块 #该指令允许压缩的页面最小字节数
#定义一个虚拟主机 server { listen 80; 虚拟机监听的服务器地址和端口号 server_name localhost; 可跟多个主机名,主机名可以使用通配符和正则表达式(~)
#charset koi8-r; 字符集,网站编码
#access_log logs/host.access.log main; 设定本虚拟机的访问日志
#允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理 location / { root html; 设置web资源路径映射,用于指明请求的URL所对应的文档的根目录路径 index index.html index.htm; 默认的主页面 }
#error_page 404 /404.html; 根据http状态码重定向错误页面
# redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; 根据http状态码重定向错误页面 location = /50x.html { root html; }
# proxy the PHP scripts to Apache listening on 127.0.0.1:80 #php脚本代理给127.0.0.1:80处理(比如可以做apache处理后端) #location ~ \.php$ { # proxy_pass http://127.0.0.1; #}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 #PHP脚本用FastCGI模式处理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; #} }
#HTTPS server #支持ssl协议的虚拟机相关设置 #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; # } #} } |
修改配置文件后检查语法错误:
/usr/local/nginx/sbin/nginx –t或者configtest
配置详解:
虚拟主机相关的配置
1、 server {}
定义一个虚拟主机
2、 listen
完整格式 :listenaddress[:port] [default_server] [ssl] [spdy] [proxy_protocol] [setfib=number][fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size][accept_filter=filter] [deferred] [bind] [ipv6only=on|off][so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
常用 listen address[:port] [default_server] ssl
例如:listen 172.16.100.8:8080
3、server_name name[...];
后可跟多个主机名;名称还可以使用通配符和正则表达式(~);
(1 先做精确匹配:www.test.com
(2 左侧通配符匹配:例如:*.test.com
(3 右侧通配符匹配:例如:www.*
(4 正则表达式匹配:例如:~^.*\.magedu\.com$
(5 default_server
4、location [=|~|*~|^~]
功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location模块中的配置所处理;
=:精确匹配检查
~:正则表达式模式匹配,区分字符大小写
~*:正则表达式模式匹配,不区分字符大小写
^~:做URI的前半部分匹配,不检查正则表达式
匹配优先级:精确匹配(=)、^~、~和~*、没有任何符号,由打头的URL进行左侧匹配
5、root
设置web资源路径映射;用于指明请求的URL所对应的文档的根目录路径
location/p_w_picpaths/ {
root“/web/imgs/”;
}
假如域名是www.test.com,则用户请求访问资源http://www.test.com/p_w_picpaths/1.jpg时,实际是/web/imgs/p_w_picpaths/1.jpg
6、alias path
用于location配置段,定义路径别名
location/p_w_picpaths/ {
alias/web/imgs/;
}
假如域名是www.test.com,则用户请求访问资源http://www.test.com/p_w_picpaths/1.jpg时,实际是/web/imgs/1.jpg
7、index file
默认主页面
indexindex.html;
8、error_page code[...] [=code] URI | @name
根据http状态码重定向错误页面
error_page404 /404.html
=[code]:以指明的响应码进行响应;省略code表示以新资源的响应码为响应码
9、try_files
try_filespath1[,path2,...] URI
当用户访问URI,先先从path1匹配,如果找不到则匹配path2...,如果都找不到,则匹配最后一个路径参数path#
网络连接相关的配置:
1、 keepalive_timeout time;
保持连接的超时时长,默认为75秒
2、 keepalive_requests #;
在一次保持连接上允许承载最大资源请求数
3、 keepalive_disable [msie6|safari|none]
为指定类型的浏览器禁用长连接
4、 tcp_nodelay on|off
对长连接是否使用TCP_NODELAY选项
5、 client_header_timeout time;
读取http请求报文首部的超时时长
6、 client_body_timeout time;
读取http请求报文body部分的超时时长
7、 send_timeout time;
发送响应报文的超时时长
对客户端请求进行限制:
1、 limit_except METHOD {...}
指定范围之外的其他方法的访问控制;
limit_except GET {
allow172.16.0.0/16;
deny all;
}
2、 client_body_max_size SIZE;
限制请求报文中body部分的上限;通过检测请求报文首部中的“Content_length”来判定;
3、 limit_rate speed;
限制客户端每秒传输的字节数,默认为0,表示无限制
对内存或磁盘资源进行分配:
1、client_body_in_file_only on|clean|off;
请求报文的body部分若大,是否可暂存于磁盘;on表示允许
2、client_body_in_single_bufferon|off
请求报文的body部分是否可暂存在内存的buffer中,默认off;允许会提高性能
3、client_body_buffer_sizesize;
暂存大小
4、client_body_temp_pathDIR [level1 [level2 [level3 [level4]]]]
暂存文件存储路径,[level1 [level2 [level3 [level4]]]]为多级目录,会自动创建
例如:client_body_temp_path /var/tmp/nginx/client 1 2
5、client_header_buffer_sizesize
正常接收用户请求报文的首部部分指定的内存空间的大小
MIME类型相关的配置:
1、types {}
定义MIME types至文件的扩展名;
type{
text/html.html
p_w_picpath/jpeg.jpg
}
2、 default_type MIME-TYPE;
指明默认的MIME类型
文件操作优化相关的配置:
1、 sendfile on|off 系统调用不经过用户态直接由内核封装后响应给请求方,启用能提搞性能
2、 aio on|off 异步I/O,启用性能更好
3、 directio size|off 直接I/O
是否使用O_DIRECT选项去请求读取文件;与sendfile功能互斥;
4、 open_file_cachemax=N[inactive=time]|off 是否打开缓存大小
nginx可以缓存以下三种信息:
(1)文件句柄、文件大小和最近一次修改时间
(2)打开目录的目录结构
(3)没有找到的或者没有权限操作的文件的相关信息
max=N表示可以缓存的最大条目上限;一旦达到上限,则会使用LRU从缓存中删除最近最少使用的条目
inactive=time在inactive指定的时长内没有被访问过的缓存条目将会被淘汰
5、open_file_cache_errorson|off;
是否缓存在文件中缓存打开文件时出现找不到路径,没有权限等的错误信息
6、open_file_cache_min_usestime
每隔多久检查一次缓存中缓存条目的有效性,默认60s
基于IP的访问控制:
在http、server、location
使用allow 、deny来定义允许和限制
例如:在server中加一段 location /admin{ root /nginx/htdocs; allow 192.168.0.0/24 deny all; } |
基于用户的basic认证配置:
auth_basic
auth_basic_user_file
htpassword命令创建用户账号文件
举例:
创建保存用户账户密码的文件 cd /usr/loca/nginx/ htpasswd –c –m .htpasswd tom
location /admin{ root /nginx/htdocs; auth_basic “admin area”; auth_basic_user_file/usr/local/nginx/.htpasswd; } |
基于gzip实现响应报文压缩:
ngx_http_gzip_module
gzip on|off 是否启用gzip功能
gzip_buffers number size 使用多大的空间来缓存压缩的结果
gzip_comp_level level 压缩级别
gzip_disable regex...; 对哪种内容不压缩,可以用正则匹配
gzip_min_length length; 文件最小是多少起始才启用压缩
gizp_http_version 1.0|1.1; gzip使用哪种版本协议
gzip_types mime-type ...;对哪种类型的文件进行压缩
gzip_vary on|off 启用或禁用在响应报文中插入一个首部“Vary:Accept-Encoding”
定制响应首部:
ngx_http_headers_module
add_headername value [always];
expirs24h; 指定有效期限
例如: location / { root /nginx/htdocs; index index.html; add_header x-header testheader; }
查看首部时就会多一项 x-header:testheader |
定制访问日志:
ngx_http_log_module
access_log 定义访问日志
log_fomat 定义日志格式
open_log_file_cache 开启日志文件缓存
定义合法引用:(可以防盗链)
ngx_http_referer_module
valid_referers none | blocked |server_names | string ...;
if ($invalid_referer){
return403;
}
URL rewrite(URL重写):
ngx_http_rewrite_module
rewrite regex replacement [flag]
四种flag:
last 服务器端匹配完规则从头再检测一遍,然后再响应给客户端
break 服务器端匹配完规则不再从头检测,直接响应给客户端
redirect 响应报文返回临时重定向状态码302
permanent 响应报文返回永久重定向状态码301
if (condition) {
...
}
比较表达式:=、!=、~、~*、!~、-f、!-f、-d、!-d、-e、!-e
return:
returncode URL;
set $variable value
例如: location / { root /nginx/htdocs; index index.html; add_header x-header testheader; rewrite ^/bbs/(.*) /forum/$1; } 比如用户访问www.test.com/bbs/1.jpg会变成www.test.com/forum/1.jpg |
状态页面
ngx_http_stub_status_module
location /status { stub_status on; }
Active connections:当前活动的连接数 accepts:已经接收的请求数 handled:已经处理的请求数 requests:总共处理的请求数 |
ssl功能
ngx_http_ssl_module
server { listen 443 ssl; server_name localhost;
ssl_certificate /etc/nginx/ssl/nginx.crt;服务器证书 ssl_certificate_key /etc/nginx/ssl/nginx.key; 服务器私钥
ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m;
ssl_ciphers HIGH: !aNULL: !MD5; ssl_prefer_server_ciphers on;
location / { root /nginx/htdocs; index index.html; } } |