文档章节

nginx常见配置

异类深呼吸
 异类深呼吸
发布于 2014/08/07 21:50
字数 2574
阅读 72
收藏 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
linux下多版本php共存的原理、方法

服务器当前PHP版本5.4,新项目中使用了Laravel,PHP版本最低要求5.6。希望保持现有应用同时使用PHP5.6.*。也就是说需要两个版本的PHP同时存在,供nginx根据需要调用不同版本。 一、原理: Ng...

zzc052
06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway真的有那么差吗?

前言 Spring Cloud从一开始最受大家质疑的就是网关性能,那是由于Spring Cloud最初选择了使用Netflix几年前开源的Zuul作为基础,而高性能版的Zuul 2在经过了多次跳票之后,对于Spring这样的整...

Java小铺
45分钟前
1
0
SpringBoot远程调试,远程debug你的线上项目

开发环境中代码出错了,可以利用IDE的debug功能来进行调试。那线上环境出错呢? 一、假设我们的项目是部署在tomcat中,那我们就需要对tomcat进行一定对配置,配置如下。 1. windows系统中,找...

nonnetta
50分钟前
0
0
JAVA秒杀优化方向

秒杀优化方向 将请求尽量拦截在系统上游:传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小,我们可以通过限流、...

小贱是个程序员
58分钟前
0
0
C# 统计字符串中大写字母和小写字母的个数

static void Main() { int count1 = 0; int count2 = 0; Console.WriteLine("请输入字符串"); string str = Convert.ToString(Consol......

熊二的爸爸是谁
今天
0
0
分布式服务框架之远程通讯技术及原理分析

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是...

老道士
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部