文档章节

nginx常见配置

异类深呼吸
 异类深呼吸
发布于 2014/08/07 21:50
字数 2574
阅读 73
收藏 0

配置文件

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

  • 全局配置

  • 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的描述:http://wiki.nginx.org/Modules

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

<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

模块主页:http://nginx.org/en/docs/http/ngx_http_gzip_module.html

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证书,生成证书请求文件发送给证书厂商,获取证书;如果是自签名,完全自理

传送门:http://nginx.org/en/docs/http/configuring_https_servers.html

  • 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
...

© 著作权归作者所有

共有 人打赏支持
异类深呼吸
粉丝 5
博文 46
码字总数 42368
作品 0
朝阳
系统管理员
私信 提问
CentOS 7 编译安装 Nginx 1.9.7

环境说明 VMware 12 中搭建的 CentOS 7 x64 4cpu 2G内存 环境中已经安装了《CentOS 7 编译安装 MySQL-5.7.9》《CentOS 7 编译安装PHP7》 配置ip 参考《CentOS 7 编译安装 MySQL-5.7.9》中的 ...

lizer2016
2015/12/05
0
0
lnmp环境下 nginx.conf的常见配置

做个lnmp环境下 nginx.conf的常见配置说明 vim /usr/local/nginx/conf/nginx.conf 使用如下配置 user nobody nobody; //nginx子进程的用户worker_processes 2; //nginx子进程个数errorlog /u......

zhengminghao
06/29
0
0
民工哥公众号linux系统学习线路图大全

民工哥公众号linux系统学习线路图大全 <-----------点击链接进入 友侃有笑公众号Linux学习路线图 1、基础篇 Linux 基础优化配置 Linux系统根目录结构介绍 linux系统重要子目录介绍 Linux文件...

民工哥
2017/08/30
0
0
nginx + ngx_lua安装测试

nginx lua模块淘宝开发的nginx第三方模块,它能将lua语言嵌入到nginx配置中,从而使用lua就极大增强了nginx的能力.nginx以高并发 而知名,lua脚本轻便,两者的搭配堪称完美.接下来请看如何安装n...

小运
2013/09/03
0
0
jeesz分布式架构-分布式高可用

什么是高可用 高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。 常见互联网分布式架构如上,分为: (1)客户端...

壹玖
08/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python中sort和sorted函数小结

L.sort(cmp=None, key=None, reverse=False) sorted(iterable, cmp=None, key=None, reverse=False) 这样看,sorted函数只比sort函数多一个iterable参数,其余没什么不同,iterable是一个迭代......

上官夏洛特
27分钟前
1
0
thinkphp 常用SQL执行语句总结

第一条:Db::tablera('vr_panomas')->where(['delete_time'=>0,'id'=>['in',$pids]])->field(['id'=>'id','post_thumb'=>'thumb','post_title'=>'title','post_tags'=>'tags','post_price'=>......

koothon
36分钟前
1
0
支付宝返回状态resultStatus意思

上一篇集成支付宝的时候,会有一些支付宝返回的resultStatus,具体意思是: 9000 订单支付成功 8000 正在处理中 4000 订单支付失败 6001 用户中途取消 6002 网络连接出错 还有memo,意思就是...

RainOrz
40分钟前
1
0
electron webview 页面加载事件顺序

1.did-start-loading 页面开始加载 2.load-commit 主页面文档加载 3.page-title-updated title 4.dom-ready 主页面 dom 加载完成 5.load-commit frame文档加载 6.did-frame-finish-load fram......

dubox
45分钟前
1
0
cron语法格式

Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth Month DayofWeek...

JavaSon712
45分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部