配置文件主要包括以下几个部分:
创新互联建站专业为企业提供吉州网站建设、吉州做网站、吉州网站设计、吉州网站制作等企业网站建设、网页设计与制作、吉州企业网站模板建站服务,10年吉州做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。全局配置
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的描述
通常指令语法都是由下面的格式组成
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
...