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;

发送响应报文的超时时长;