nginx作为web服务器时使用的配置:
http {}:由ngx_http_core_module模块所引入;
最简单的server配置:
server {
listen 11.100.40.124:8080;
server_name nginx.cpe.com;
root /htdocs/web1/;
}
http配置:http core 配置一个静态web服务器
ngx_http_core_module
配置框架:
http {
upstream {
.,..
}
server {
listen IP:PORT;
# 虚拟主机
location /URL {
root “/path/to/somedir”
……
if …{
location {
} 类似于httpd中的<location>,用于定于URL与本地文件系统的映射关系
…
} # 每个server类似于httpd中的一个<VirtualHost>
root “/path/to/somewhere”;
…
}
}
server {
,,.
}
}
注意:与http配置相关的指令必须放在http、server、location、upstream、if块中;
1、虚拟主机相关的配置:
server {}定义一个虚拟主机;
例如:
server {
listen 11.100.40.124:80;
server_name name1.nginx.cpe.com;
root /htdocs/web2/;
}
server {
listen 11.100.40.124:80;
server_name name2.nginx.cpe.com;
root /htdocs/web3/;
}
server {
listen 11.100.40.124:8080;
server_name nginx.cpe.com;
root /htdocs/web1/;
}
2、listen
监听的端口
完整格式 :listen address[: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
backlog=number: 指明TCP协议backlog队列的大小。默认为-1,表示不设置;
rcvbuf=size:设定监听句柄的SO_RCVBUF参数;
例如:
listen 172.16.100.8:8080
3、server_name name […];
后可跟多个主机名;名称还可以使用通配符和正则表达式(~);
(1) 先做精确匹配;www.magedu.com:
(2) 左侧通配符匹配,例如:*.magedu.com;
(3) 右侧通配符匹配,例如:www.*;
(4) 正则表达式匹配,例如: ~^.*\.magedu\.com$
(5) default_server
例如:(缺省那个配置测试不成功未贴出)
server {
listen 11.100.40.124:80;
server_name name1.nginx.cpe.com;
root /htdocs/web2/;
}
server {
listen 11.100.40.124:80;
server_name name2.nginx.cpe.com;
root /htdocs/web3/;
}
server {
listen 11.100.40.124:80;
server_name *.nginx2.cpe.com;
root /htdocs/web4/;
}
server {
listen 11.100.40.124:80;
server_name www.*;
root /htdocs/web5/;
}
server {
listen 11.100.40.124:80;
server_name ~^.*\.nginx1\.cpe\.com$;
root /htdocs/web6/;
}
4、location [=|~|~*|^~] /uri {…}
location @name {…}
功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理;比如访问控制功能。
=: 精确匹配检查;
~: 正则表达式模式匹配,区分字符大小写;
~*:正则表达式模式 匹配,不区分字符大小写;
^~:URI的前半部分匹配,不检查正则表达式;
匹配优先级:精确匹配(=)、^~、~和~*、由不带符号的URL进行左侧匹配;
server {
listen 80;
server_name www.cpe.com
location / {
root “/vhosts/web1”
}
location /images/{
root “/vhosts/images”
}
localtion ~* \.php$ {
fcgipass
}
}
例如:
server {
listen 11.100.40.124:80;
server_name name1.nginx.cpe.com;
location / {
root /htdocs/web2/;
}
location /images/ {
root /htdocs/web3/images/;
}
location ~*.\.jpg {
root /htdocs/images/;
}
}
http://name1.nginx.cpe.com/ —-> /htdocs/web2/
http://name1.nginx.cpe.com/1.jpg —-> /htdocs/images/1.jpg
http://name1.nginx.cpe.com/images/1.jpg ——> /htdocs/web3/images/images/1.jpg
5、root
设置web资源路径映射;用于指明请求的URL所对应的文档的根目录路径;类似DocumentRoot不完全相同。
location /images/ {
root “/web/imgs/”;
}
6、alias path
用于location配置段,定义路径别名
location /images/ {
alias /www/pictures/;
}
注意:root表示指明路径为对应location的” /” URL;alias表示路径映射,即location中的URL是相对于alias所指明的路径而言;
例如:
server {
listen 11.100.40.124:80;
server_name name2.nginx.cpe.com;
location /images/ {
root /htdocs/web3/images/;
}
location /images1/ {
alias /htdocs/web3/images/;
}
}
http://name2.nginx.cpe.com/images/ ——> /htdocs/web3/images/images/index.html
http://name2.nginx.cpe.com/images1/ ——-> /htdocs/web3/images/index.html
7、index file;默认主页面
index index.html;
8、error_page code […] [=code] URI | @name
根据http状态码重定向错误页面
error_page 404 =200 /404.html
=[code]: 以指定的响应码进行响应;省略code表示以新资源的响应码为响应码;
例如:
server {
listen 11.100.40.124:8080;
server_name nginx.cpe.com;
root /htdocs/web1/;
error_page 404 =200 /404.html;
}
9、try_files
try_files path1[,path2,…] URI
10、基于ip访问控制
allow
deny
例如:
server {
listen 11.100.40.124:8080;
server_name nginx.cpe.com;
root /htdocs/web1/;
error_page 404 =200 /404.html;
allow 172.16.31.0/24;
deny all;
}
11、基于用户的访问控制
auth_basic “closed site”;
auth_basic_user_file conf/htpasswd;
账号文件建议用htpasswd创建:
编辑配置文件# vim /etc/nginx/nginx.conf
加入:
server {
listen 11.100.40.124:80;
server_name www.*;
root /htdocs/web5/;
auth_basic “Only for VIP!!”;
auth_basic_user_file /etc/nginx/users/.ptpasswd;
}
创建文件夹目录:
# mkdir -pv /etc/nginx/users
创建密码:-c新建(第一次使用) -m md5
htpasswd -c -m /etc/nginx/users/.ptpasswd tom
12、ssl配置
(1)创建根证书颁发机构
# (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
# cd /etc/pki/CA/
# touch index.txt
# echo 01 > serial
(2)创建web服务器证书
# mkdir -pv /etc/nginx/ssl
# (umask 077; openssl genrsa -out /etc/nginx/ssl/nginx1.cpe.com 2048)
# openssl req -new -key nginx1.cpe.com.key -days 365 -out nginx1.cpe.com.csr
(3)签署web服务器证书
# openssl ca -in /etc/nginx/ssl/nginx1.cpe.com.csr -out /etc/nginx/ssl/nginx1.cpe.com.pem
(4)配置nginx。
# vim /etc/nginx/nginx.conf
listen 443 ssl;
server_name www.nginx1.cpe.com;
ssl_certificate /etc/nginx/ssl/nginx1.cpe.com.pem;
ssl_certificate_key /etc/nginx/ssl/nginx1.cpe.com.key;
root /htdocs/web6/;
index index.html index.htm;
原配置文件(其它的建议不改变,可以提高性能):
server {
listen 443 ssl;
server_name www.nginx1.cpe.com;
ssl_certificate /etc/nginx/ssl/nginx1.cpe.com.pem;
ssl_certificate_key /etc/nginx/ssl/nginx1.cpe.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /htdocs/web6/;
index index.html index.htm;
}
}
13、stub_status 仅只能用于location上下文
配置例如:
location /status {
stub_status on;
allow 172.16.31.0/24;
deny all;
}
显示说明:
Active connections: 1 #当前已打开的连接数
server accepts handled keepalive_requests
101 101 125
Reading: 0 Writing: 1 Waiting: 0
server accepts: 已经接受过的连接数
handled: 已经处理过的连接数
keepalive_requests: 已经处理过的请求数,在保持连接模式下此数字会大于连接数。
Reading: 正处于接受请求状态的连接数
Writing: 请求接受已完成,正处于处理请求或发送响应的过程中的连接数。
Waiting: 处于保持连接状态,处于活动状态的连接,工作于保持连接模式。
14、rewrite regex replacement flag;
例如:
rewrite ^.*/image/(.*)$ http://name1.nginx.cpe.com/images/ last;
————————->循环请求循环重定向
rewrite ^.*/images/(.*)$ http://name1.nginx.cpe.com/image/ last;
location / {
root /htdocs/web2/;
rewrite ^/bbs/(.*)$ /from/$1 break;
} http://name1.nginx.cpe.com/bbs/index2.html
———-> http://name1.nginx.cpe.com/bbs/index2.html
实际是 在/htdocs/web2/from下 而客户端看着像是在/htdocs/web2/bbs下 不显示新路径
location / {
root /htdocs/web2/;
rewrite ^/bbs/(.*)$ https://www.nginx1.cpe.com/$1 redirect;
}
被302临时重定向到了https://www.nginx1.cpe.com/
flag:
last:一旦此rewrite规则重写完成后,就不再被后面其他的rewrite规则进行处理;而是由User Agent重新对重写后的URL再一次发起请求,并从头开始类似的过程;
break:一旦此rewrite规则重写后,由User Agent对新的URL重新发起请求,且不再会被当前location内的任何rewrite规则重新检查;
redirect: 以302响应码(临时重定向)返回新的URL
permanent: 以301响应码(永久重定向)返回新的URL;
15、if
语法:if(condition) {……}
应用环境:server,location
condition:
(1)变量名:
变量值为空串,或者以”0″开始,则为false;其它均为true。
(2)以变量为操作数构成比较表达式
可使用=,!=类似的比较操作符进行测试;
(3)正则表达式的模式匹配操作
~:区分大小写的模式匹配检查
~*:不区分大小写模式匹配检查
!~ 和!~*:对上面两种测试取反
(4)测试路径为文件可能性: -f ,!f
(5)测试制定路径为目录的可能性: -d,!-d
(6) 测试文件的存在性:-e,!-e
(7)检查文件是否有执行权限:-x,!-x
例如:
if ($http_user_agent ~* MSIE) {
rewite ^(.*)$ /msie/$1 break;
}
例如:
server {
listen 443 ssl;
server_name www.nginx1.cpe.com;
ssl_certificate /etc/nginx/ssl/nginx1.cpe.com.pem;
ssl_certificate_key /etc/nginx/ssl/nginx1.cpe.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
auth_basic “Only for VIP!!”;
auth_basic_user_file /etc/nginx/users/.ptpasswd;
location / {
root /htdocs/web6/;
if ($http_user_agent ~* Mozilla) {
rewrite ^(.*)$ /msie/$1 break;
}
index index.html index.htm;
}
location /status {
stub_status on;
allow 172.16.31.0/24;
deny all;
}
}
16、防盗链
location ~*\.(.jpg|gif|jpeg|png)$ {
valid_referers none blocked name2.nginx1.cpe1.com;
if ($invalid_referer) {
rewrite ^/ http://name2.nginx.cpe.com/images/index.html;
}
}
17、定制访问日志格式
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
18、连接相关的配置:
1、keepalive_timeout time;
保持连接的超时时长,默认为75s;
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;
发送响应报文的超时时长;