文档章节

nginx常见配置

异类深呼吸
 异类深呼吸
发布于 2014/08/07 21:50
字数 2574
阅读 72
收藏 0
点赞 0
评论 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

lnmp环境下 nginx.conf的常见配置

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

zhengminghao ⋅ 2016/04/03 ⋅ 0

民工哥公众号linux系统学习线路图大全

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

民工哥 ⋅ 2017/08/30 ⋅ 0

nginx + ngx_lua安装测试

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

小运 ⋅ 2013/09/03 ⋅ 0

linux下多版本php共存的原理、方法

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

zzc052 ⋅ 2017/11/04 ⋅ 0

nginx使用总结

nginx主页:http://nginx.org/ nginx for windows:http://nginx.org/en/docs/windows.html 学习nginx:http://wiki.nginx.org/GettingStarted 以下为location的demo,汇总常见配置以及它们的......

菜蚜 ⋅ 2014/11/24 ⋅ 0

Tengine + uwsgi + django平台搭建

环境介绍: [root@localhost opsdev]# nginx -vTengine version: Tengine/2.0.3 (nginx/1.4.7)[root@localhost opsdev]# cat /etc/redhat-release CentOS release 6.4 (Final)[root@localhos......

lovelace521 ⋅ 2015/01/08 ⋅ 0

Nginx基本配置

参考:Nginx 常见应用技术指南、nginx+tomcat集群负载均衡(实现session复制) user www-data;worker_processes 4;pid /var/run/nginx.pid; events {use epoll;worker_connections 20; multi_a......

cwalet ⋅ 2011/10/21 ⋅ 1

nginx(二) 反向代理配置详解

nginx(二)反向代理配置详解 nginx反向代理配置比如希望通过浏览器输入http://localhost 直接跳转到http://www.baidu.com 进入到百度首页 在nginx/conf.d/default.conf中配置: 下面对nginx.c...

陈小扁 ⋅ 2016/07/19 ⋅ 0

nginx升级及遇到的问题

Nginx于11月20日通过官方邮件列表更新了一个安全漏洞,该漏洞影响Nginx 0.8.41 至 1.5.6版本,攻击者可以通过该漏洞绕过Nginx的部分访问策略控制或通过上传功能向服务器植入后门。 漏洞描述 ...

lschao12345 ⋅ 2013/11/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 40分钟前 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

MVC——统一报文格式的异常处理响应

在我们写controller层的时候,常常会有这样的困惑,如果需要返回一个数据是,可能为了统一回去构造一个类似下列的数据格式: { status:true, msg:"保存成功!", data:[]} 而且在写...

alexzhu592 ⋅ 昨天 ⋅ 0

[知乎]SSH框架

网上图书馆管理系统包括管理员管理和图书管理,图书借阅,查询模块等等,网上商城包括前台页面和后台管理页面,两个都是以前别人的实际项目,只是别人用的不是SSH,我把他们改用SSH了,除了S...

颖伙虫 ⋅ 昨天 ⋅ 0

android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app

开发中常常有打开本地浏览器加载url或者指定浏览器加载, 还有打开第三方app, 如 打开高德地图 百度地图等 在Android程序中我们可以通过发送隐式Intent来启动系统默认的浏览器。 如果手机本身...

切切歆语 ⋅ 昨天 ⋅ 0

linux 安装docker

通过以下命令下载安装docker wget -qO- https://get.docker.com | sh 执行以上命令后输出以下内容说明安装成功,注意红框中的内容,docker安装成功后默认只有root能使用,红框中给出的提示是...

haoyuehong ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部