nginx常见配置

  • 来源:
  • 更新日期:2018-04-28

摘要:配置文件 配置文件主要包括以下几个部分: 全局配置 http smtp server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { #这里就是定义主页的位置 root html; #安装的“/”下的html目录 index index.html index.htm;

配置文件

配置文件主要包括以下几个部分:

全局配置

timg.jpg

http

smtp

server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / { #这里就是定义主页的位置
root html; #安装的“/”下的html目录
index index.html index.htm;
} 常用指令

nginx的指令都是由相应的模块安装之后提供

nginx的wiki中关于module的描述

通常指令语法都是由下面的格式组成

<directive><value>; 全局指令 1、error_log

Syntax: error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];
Default:
error_log logs/error.log error;
Context: main, http, server, location

示例:
error_log syslog:server=192.168.1.1 debug;
error_log syslog:server=unix:/var/log/nginx.sock;
error_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx error; 2、events

设定nginx的工作模式和连接数的指令,且具有上下文

events {
use epoll; #使用的事件模型[ kqueue | rtsig | epoll | /dev/poll | select | poll ]
worker_connections 1024; #连接数
#这里有个计算公式 clients = worker_connections * work_processes
} 3、nginx进程设置

worker_processes 4; #指定工作进程个数,可以指定也设置成auto
worker_cpu_affinity 0001 0010 0100 1000; #上面4个进程一个进程绑定一个cpu核心
worker_rlimit_nofile 65535; #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致

#定义Nginx运行的用户和用户组
user www www;

pid /var/run/nginx.pid; #进程文件 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"\';

#access_log logs/access.log main; #定义访问日志
sendfile on; #开启sendfile的事件机制
#tcp_nopush on;
keepalive_timeout 5; #keepalive时长

#gzip on; #是否开启压缩

server {
listen 80; #监听端口
server_name localhost; #该server的主机名
#charset koi8-r; #字符集
#access_log logs/host.access.log main; #设置访问日志

location / { # 设定具体URL的访问路径,
root html; # 访问路径,网页存放位置
index index.html index.htm; #默认页面名称
}

#这里location的有几种匹配模式
#不加任何符号就是从访问的“/”开始都受此location限定
#=:做精确匹配
#~:模式匹配,支持正则表达式,区分大小写
#~*:模式匹配,不区分大小写
#^~:不做模式匹配,不匹配正则表达式
#如果以上location在同一个server中出现,从上往下的顺序优先级进行生效,没有任何符号的优先级最小

#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;
} 1、启动,检查语法

service nginx configtest #检查配置文件
service nginx reload #不中断当前访问的情况下重载配置文件
service nginx restart #重新启动nginx 2、自定义错误页面

利用error_page指令完成

#error_page 404 /404.html;
error_page 404 /404.html;
location = /404.html {
root errorpages;
} 3、虚拟主机

在http的段落中加入另一个server段,这里仅仅只是演示,一个虚拟主机的基本配置
server {
listen 192.168.122.140:80; #基于不同IP的虚拟主机,前提是这个IP必须存在
server_name vir2;
root vhost1;
} 4、访问控制

基于module ngx_http_access_module提供的访问控制

location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}

基于module ngx_http_auth_basic_module提供的访问控制

location / {
auth_basic "closed site";
auth_basic_user_file .htpasswd;
}

#生成访问账号和口令,需要借助httpd-tools的包
htpasswd -cm /etc/nginx/.htpasswd test 5、用于显示当前目录下的内容

仅适合某些下载站点,一般情况下关闭

location / {
root test;
autoindex on; #显示当前目录内容,如非必要,一般不开启
add_header TEST $server_addr; #在响应的用户头部增加TEST头部信息
index none.html;
} 6、启用stats状态页

stub_status
syntax: stub_status on
default: None
context: location

示例:
状态页由HttpStubStatusModule提供,需要编译的时候启用
--with-http_stub_status_module

在server中增加一段location
location /stats {
stub_status on; #启用
access_log off; #通常不需要记录该访问日志

#访问控制,是用下面任何一种都可,一般不会让非管理访问该页面
auth_basic "stats page";
auth_basic_user_file .htpasswd;

allow 192.168.122.0/24; #允许的网段
deny all; #拒绝其他
}

active connections:所有的打开连接数
server accepts handled requests:已接受连接数,已处理连接数,处理的请求数
reading:正在接受的用户请求
writing:正在处理的用户请求
waiting:活动的连接 7、gzip

 

gzip on; #开启gzip
gzip_min_length 1000; #最小压缩长度
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/xml; #压缩文件类型 8、rewrite

break:防止循环匹配rewrite module的指令

Syntax: break;
Default: —
Context: server, location, if

实例:
if ($slow) {
limit_rate 10k;
break; #防止循环匹配rewrite module的指令
}

if

Syntax: if (condition) { ... }
Default: —
Context: server, location

rewrite

Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if

[flag]
last: 停止当前检测指令直接重新开启url匹配规则,当某条URL被某条规则匹配之后,直接停止后续的检测直接从头开始重新检测匹配规则
break:当某条URL被某条规则匹配之后,直接停止后续的检测
redirect:返回302错误代码,临时重定向
permanent:返回301错误代码,永久重定向

return

Syntax: return code [text]; return code URL; return URL;
Default: —
Context: server, location, if

示例:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}

if ($request_method = POST) {
return 405;
}

if ($slow) {
limit_rate 10k;
}

if ($invalid_referer) {
return 403;
}

if的逻辑判断中逻辑判断方法:
- 正则表达式匹配
~:与指定的正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写;
~*:与指定的正则表达式模式匹配时返回“真”,判断匹配与否时不区分字符大小写;
!~:与指定的正则表达式模式不匹配时返回“真”,判断匹配与否时区分字符大小写;
!~*:与指定的正则表达式模式不匹配时返回“真”,判断匹配与否时不区分字符大小写;

- 文件及目录匹配判断
-f,!-f:判定指定的路径是否存在且为文件;
-d,!-d:判断指定的路径是否存在且为目录;
-e,!-e:判断指定的路径是否存在,文件和目录均可;
-x,!-x:判断指定的路径文件是否存在且可执行;

rewrite_log

Syntax: rewrite_log on | off;
Default: rewrite_log off;
Context: http, server, location, if

set

设定自定义变量

Syntax: set $variable value;
Default: —
Context: server, location, if 9、SSL

如果是需要CA证书,生成证书请求文件发送给证书厂商,获取证书;如果是自签名,完全自理

 

HTTPS部署

#生成一个RSA密钥
openssl genrsa -des3 -out server.key 1024

#生成一个证书请求文件,如果需要购买CA,则就是将这个证书发送给CA厂商获取颁发的证书
openssl req -new -key server.key -out server.csr

#为了后期启动nginx的时候不需要输入秘钥,生成一个不需要输入密码的密钥文件
openssl rsa -in server.key -out server_nopass.key

#这部分其实应该是CA中心的操作,颁发证书,我们这里自行颁发自己
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

配置文件中加入另一个server块处理443的请求
server {
listen 443;
server_name www.example.com;
ssl on; #开启ssl
ssl_certificate server.crt; #CA证书文件
ssl_certificate_key server_nopass.key; #私钥证书文件
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; #指定客户端连接使用的协议
ssl_ciphers RC4:HIGH:!aNULL:!MD5; #指定客户端使用的加密算法
ssl_prefer_server_ciphers on; #使用更优的加密算法
...

HTTPS的优化

之所以进行优化,https固然安全,但是对服务器的性能开销却不容忽视

- SSL操作需要消耗CPU资源,所以在多处理器的系统,需要启动多个工作进程,而且数量需要不少于可用CPU的个数。最消耗CPU资源的SSL操作是SSL握手

- 有两种方法可以将每个客户端的握手操作数量降到最低:

第一种是保持客户端长连接,在一个SSL连接发送多个请求
第二种是在并发的连接或者后续的连接中重用SSL会话参数,这样可以避免SSL握手的操作

会话缓存用于保存SSL会话,这些缓存在工作进程间共享,可以使用ssl_session_cache指令进行配置。1M缓存可以存放大约4000个会话。默认的缓存超时是5分钟,可以使用ssl_session_timeout加大它。下面是一个针对4核系统的配置优化的例子,使用10M的共享会话缓存

worker_processes 4;
http {
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
server {
listen 443;
server_name www.example.com;
ssl on;
ssl_certificate server.crt;
ssl_certificate_key server_nopass.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
...

合并HTTP/HTTPS主机

配置的方法是删除ssl on的指令,并在*:443端口添加参数ssl

server {
listen 80;
listen 443 ssl;
server_name www.example.com;
ssl_certificate server.crt;
ssl_certificate_key server_nopass.key;
...
}

为多个主机名配置ssl证书

多个名字的证书和它的密钥文件配置在http配置块中,这样可以只保存一份内容拷贝,所有主机的配置都从中继承

ssl_certificate server.crt;
ssl_certificate_key server_nopass.key;

server {
listen 443;
server_name www.example.com;
ssl on;
...
}

server {
listen 443;
server_name www.example.org;
ssl on;
...
}

一个IP上运行多个HTTPS主机

TLS主机名指示扩展(SNI,RFC6066),它允许浏览器和服务器进行SSL握手时,将请求的主机名传递给服务器,因此服务器可以知道使用哪一个证书来服务这个连接。但SNI只得到有限的浏览器的支持。下面列举支持SNI的浏览器最低版本和平台信息:

Opera 8.0;
MSIE 7.0(仅在Windows Vista操作系统及后续操作系统);
Firefox 2.0和使用Mozilla平台1.8.1版本的其他浏览器;
Safari 3.2.1(Windows版需要最低Vista操作系统);
Chrome(Windows版需要最低Vista操作系统)。

那么无论是在编译nginx时使用的OpenSSL类库,还是在运行nginx时使用的OpenSSL运行库,都必须支持SNI。从0.9.8f版本开始,OpenSSL通过“--enable-tlsext”配置选项加入SNI支持,从0.9.8j版本开始,此选项成为默认选项。

$ nginx -V
...
TLS SNI support enabled
...