首页
文章
留言
首页
文章
留言
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
相关文章
Python爬虫之Beautiful Soup的使用
Redis缓存击穿、穿透、雪崩
PHP开发之字符串处理
PHP开发之PDO使用总结
Sphinx使用总结
全部分类
前端
后端
运维
架构
算法
数据库
移动应用
桌面应用
程序开发
热门标签
Kafka
多线程
CentOS
Objective-C
JavaScript
GUI
OpenResty
macOS
MySQL
Redis
Sphinx
NoSQL
Shell
CSS
C++
爬虫
Git
Kubernetes
Nginx
Android
HTML
Composer
iOS
Lua
PHP
MongoDB
Elasticsearch
Qt
Linux
Python
Docker
Supervisor
热门文章
Redis、MemCache、MongoDB比较
macOS常用命令
OpenResty+Lua+Kafka收集日志
Nginx常用配置说明
Elasticsearch详解
Supervisor使用总结
Docker使用总结
Git使用总结
CentOS常用命令总结
Qt实现TCP通讯