首页
文章
留言
首页
文章
留言
Nginx常用配置说明
2017 年 04 月 02 日
后端
Nginx
Nginx 是一款轻量级高性能的的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强。事实上 Nginx 的并发能力在同类型的网页服务器中表现较好。 #### 一、常用命令 ```plaintext # 查看配置文件是否正确 nginx -t # 重载配置 nginx -s reload # 重启 nginx -s reopen # 停止 nginx -s stop ``` #### 二、配置文件详解 基本就分为以下几块: ```plaintext main events { .... } http { .... upstream myproject { ..... } server { .... location { .... } } server { .... location { .... } } .... } ``` 以上我们可以看出,Nginx 配置文件主要分为六个区域: ```plaintext 1、main (全局设置) 2、events (nginx工作模式) 3、http (http设置) 4、sever (主机设置) 5、location (URL匹配) 6、upstream (负载均衡服务器设置) ``` ##### 1、main 模块 下面是一个 main 区域,他是一个全局的设置: ```plaintext # 指定 Nginx Worker 进程运行用户以及用户组,默认由 nobody 账号运行 user nobody nobody; # 指定 Nginx 要开启的进程数,建议设置为等于CPU总核心数 worker_processes 2; # 定义全局错误日志文件。类型:[ debug | info | notice | warn | error | crit ] error_log /usr/local/var/log/nginx/error.log notice; # 指定进程 id 的存储文件位置 pid /usr/local/var/run/nginx/nginx.pid; # 指定进程可以打开的最大描述符:数目 # 工作模式与连接数上限 # 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。 # 现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。 # 这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。 worker_rlimit_nofile 1024; ``` ##### 2、events 模块 events 模块来用指定 Nginx 的工作模式和工作模式及连接数上限,一般是这样: ```plaintext events { # 参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型 # 是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。 # 补充说明: # 与apache相类,nginx针对不同的操作系统,有不同的事件模型 # A)标准事件模型 # Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll # B)高效事件模型 # Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X。使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。 # Epoll:使用于Linux内核2.6版本及以后的系统。 # /dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。 # Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。 use epoll; # 定义 Nginx 每个进程的最大连接数 worker_connections 1024; } ``` ##### 3、http 模块 http 模块可以说是最核心的模块了,它负责 HTTP 服务器相关属性的配置。 ```plaintext http{ # 用来设定文件的 mime 类型,来告诉 nginx 来识别文件类型 include mime.types; # 设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式 default_type application/octet-stream; # 设置日志的格式,和记录哪些参数,这里设置为 main 类型的日志 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 记录每次的访问日志的文件地址,后面的 main 是日志的格式样式,对应于 log_format 的 main access_log /usr/local/var/log/nginx/access.log main; # 开启高效文件传输模式 sendfile on; # 设置为 on 用于防止网络阻塞 tcp_nopush on; # 设置为 on 用于防止网络阻塞 tcp_nodelay on; # 设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接 keepalive_timeout 10; # gzip on; upstream myproject { ..... } server { .... } } ``` ##### 4、server 模块 sever 模块是 http 的子模块,它用来定一个虚拟主机。 ```plaintext server { # 指定虚拟主机的服务端口 listen 8080; # 指定IP地址或者域名,多个域名之间用空格分开 server_name localhost 192.168.0.66 www.pengyunjing.com; # root 表示在这整个 server 虚拟主机内,全部的 root web 根目录。注意要和 locate {} 下面定义的区分开来 root /Users/pengyunjing/www; # index 全局定义访问的默认首页地址。注意要和 locate {} 下面定义的区分开来 index index.php index.html index.htm; # 设置网页的默认编码格式 charset utf-8; # 指定此虚拟主机的访问日志存放路径,最后的 main 用于指定访问日志的输出格式 access_log usr/local/var/log/host.access.log main; error_log usr/local/var/log/host.error.log error; .... } ``` ##### 5、location 模块 location 模块是 Nginx 中用的最多的,负载均衡、反向代理、虚拟域名等都会用到。它提供了强大的正则匹配功能,也支持条件判断匹配,用户可以通过 location 指令实现 Nginx 对网页进行过滤处理。 设定默认首页和虚拟机目录: ```plaintext location / { # 表示匹配访问根目录 # 指定访问根目录时,虚拟主机的 web 目录 root /Users/pengyunjing/www; # 设定我们只输入域名后访问的默认首页地址 index index.php index.html index.htm; } ``` 正则匹配来链接php: ```plaintext location ~ \.php$ { root /Users/pengyunjing/www; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } ``` ##### 6、upstream 模块 upstream 模块负责负载均衡模块,通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡。 ```plaintext upstream pengyunjing { ip_hash; server 192.168.0.1:80; server 192.168.0.2:80 down; server 192.168.0.3:8080 max_fails=3 fail_timeout=20s; server 192.168.0.4:8080; } ``` 在上面的例子中,通过 upstream 指令指定了一个负载均衡器的名称 pengyunjing。这个名称可以任意指定,在后面需要的地方直接调用即可。 里面是 ip_hash 这是其中的一种负载均衡调度算法,下面会着重介绍。紧接着就是各种服务器了。用 server 关键字表识,后面接 ip。 Nginx 的负载均衡模块目前支持4种调度算法: 1)weight 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight 指定轮询权值,值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。 2)ip_hash 每个请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效解决了动态网页存在的 session 共享问题。 3)fair 比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 的,如果需要使用这种调度算法,必须下载 Nginx 的 upstream_fair 模块。 4)url_hash 按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法,必须安装 Nginx 的 hash 软件包。 在 upstream 模块中,可以通过 server 指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有: - down,表示当前的 server 暂时不参与负载均衡。 - backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻。 - max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。 - fail_timeout,在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用。 注意 当负载调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能是 weight 和 backup。
0
相关文章
Sphinx使用总结
Kafka使用总结
Composer使用总结
Python爬虫之Beautiful Soup的使用
Redis、MemCache、MongoDB比较
全部分类
前端
后端
运维
架构
算法
数据库
移动应用
桌面应用
程序开发
热门标签
Composer
Qt
Lua
NoSQL
HTML
Redis
Docker
OpenResty
Git
PHP
MongoDB
Supervisor
CentOS
多线程
Kafka
Kubernetes
GUI
Android
Nginx
MySQL
Linux
Elasticsearch
Sphinx
爬虫
Shell
iOS
macOS
C++
CSS
JavaScript
Python
Objective-C
热门文章
10种常见的软件架构模式
Nginx常用配置说明
Redis缓存击穿、穿透、雪崩
Kubernetes介绍
OpenResty+Lua+Kafka收集日志
Elasticsearch详解
C/C++基础知识总结
jquery.tmpl使用总结
Docker使用总结
Supervisor使用总结