最近感觉很多东西在运用到一定的程度之后,会发现原来是自己了解到的不够。一方面限于实际运用到的不多,一方面可能是因为一开始没有进行全面认识。遂这里搜集整理了一番NGINX。

一、nginx启动和关闭

centos平台,源码安装的

/usr/local/nginx/nginx # 启动

/usr/local/nginx/nginx -s reload # 平滑重启

/usr/local/nginx/nginx.conf # 配置文件

mac平台,使用brew安装的

/usr/local/bin/nginx # 启动

/usr/local/bin/nginx -s reload # 平滑重启

/usr/local/etc/nginx/nginx.cnf # 配置文件

二、nginx.conf 配置文件详解

其实,对比,apache 的配置文件,它的相对比较清晰和简单,之前觉得很难,现在沉下心来想想,其实很简单。大致的分块下,基本就分为以下几块:

main

events {

....

}

http {

....

upstream myproject {

.....

}

server {

....

location {

....

}

}

server {

....

location {

....

}

}

....

}

以上我们可以看出,nginx配置文件主要分为六个区域:

1、main (全局设置)

2、events (nginx工作模式)

3、http (http设置)

4、sever (主机设置)

5、location (URL匹配)

6、upstream (负载均衡服务器设置)

2.1 main模块

下面是一个main区域,他是一个全局的设置

user nobody nobody; # 指定 Nginx Worker 进程运行用户以及用户组,默认由 nobody 账号运行

worker_processes 2; # 指定 Nginx 要开启的子进程数

error_log /usr/local/var/log/nginx/error.log notice; # 定义全局错误日志文件

pid /usr/local/var/run/nginx/nginx.pid; # 指定进程 id 的存储文件位置

worker_rlimit_nofile 1024; # 指定一个 nginx 进程可以打开的最多文件描述符数目,如果设置 65535,需要使用命令 “ulimit -n 65535” 来设置

user 来指定 Nginx Worker 进程运行用户以及用户组,默认由 nobody 账号运行。

worker_processes 来指定了 Nginx 要开启的子进程数。每个 Nginx 进程平均耗费 10M~12M 内存。根据经验,一般指定 1 个进程就足够了,如果是多核 CPU,建议指定和 CPU 的数量一样的进程数即可。我这里写 2,那么就会开启 2 个子进程,总共 3 个进程。

error_log 用来定义全局错误日志文件。日志输出级别有 debug、info、notice、warn、error、crit 可供选择,其中,debug 输出日志最为最详细,而 crit 输出日志最少。

pid 用来指定进程id的存储文件位置。

worker_rlimit_nofile 用于指定一个 nginx 进程可以打开的最多文件描述符数目,这里是 65535,需要使用命令 “ulimit -n 65535” 来设置。

2.2 events 模块

events 模块来用指定 nginx 的工作模式和工作模式及连接数上限,一般是这样

events {

use kqueue; # mac 平台,指定 Nginx 的工作模式

worker_connections 1024; # 定义 Nginx 每个进程的最大连接数,即接收前端的最大请求数,默认是 1024

}

use 用来指定 Nginx 的工作模式。Nginx 支持的工作模式有 select、poll、kqueue、epoll、rtsig 和 /dev/poll。其中 select 和 poll 都是标准的工作模式,kqueue 和 epoll 是高效的工作模式,不同的是 epoll 用在 Linux 平台上,而 kqueue 用在 BSD 系统中,因为 Mac 基于 BSD ,所以 Mac 也得用这个模式,对于 Linux 系统,epoll 工作模式是首选。

worker_connections 用于定义Nginx每个进程的最大连接数,即接收前端的最大请求数,默认是1024。最大客户端连接数由worker_processes 和 worker_connections 决定,即 Max_clients = worker_processes * worker_connections,在作为反向代理时,Max_clients 变为:Max_clients = worker_processes * worker_connections/4。

进程的最大连接数受 Linux 系统进程的最大打开文件数限制,在执行操作系统命令 “ulimit -n 65536” 后 worker_connections 的设置才能生效。

2.3 http 模块

http 模块可以说是最核心的模块了,它负责 HTTP 服务器相关属性的配置,它里面的 server 和 upstream 子模块,至关重要,等到反向代理和负载均衡以及虚拟目录等会仔细说。

http{

include mime.types; # 用来设定文件的 mime 类型,来告诉 nginx 来识别文件类型

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"';

# log_format 设置日志的格式,和记录哪些参数,这里设置为 main 类型的日志

access_log /usr/local/var/log/nginx/access.log main;

# access_log 记录每次的访问日志的文件地址,后面的 main 是日志的格式样式,对应于 log_format 的 main

sendfile on; # 开启高效文件传输模式

tcp_nopush on; # 设置为 on 用于防止网络阻塞

tcp_nodelay on; # 设置为 on 用于防止网络阻塞

keepalive_timeout 10; # 设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接

#gzip on;

upstream myproject {

.....

}

server {

....

}

}

下面详细介绍下这段代码中每个配置选项的含义。

include 用来设定文件的 mime 类型,类型在配置文件目录下的 mime.type 文件定义,来告诉 nginx 来识别文件类型。

default_type 设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置 asp 的 locate 环境时,Nginx 是不予解析的,此时,用浏览器访问 asp 文件就会出现下载了。

log_format 用于设置日志的格式(格式设置可参照 Nginx日志格式设置),和记录哪些参数,这里设置为 main,刚好用于 access_log 来记录这种类型。

main 的类型日志如下:也可以增删部分参数。

127.0.0.1 - - [21/Apr/2015:18:09:54 +0800] "GET /index.php HTTP/1.1" 200 87151 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36"

access_log 用来记录每次的访问日志的文件地址,后面的 main 是日志的格式样式,对应于 log_format 的 main。

sendfile 参数用于开启高效文件传输模式。将 tcp_nopush 和 tcp_nodelay 两个指令设置为 on 用于防止网络阻塞。

keepalive_timeout 设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。

2.4 server 模块

sever 模块是 http 的子模块,它用来定一个虚拟主机。

我们来看一个简单的 server 是如何做的?

server { # 标志定义虚拟主机开始

listen 8080; # 指定虚拟主机的服务端口

server_name localhost 192.168.12.10 www.yangyi.com; # 指定IP地址或者域名,多个域名之间用空格分开

# 全局定义,如果都是这一个目录,这样定义最简单。

root /Users/yangyi/www;

# root 表示在这整个 server 虚拟主机内,全部的 root web 根目录。注意要和 locate {} 下面定义的区分开来

index index.php index.html index.htm;

# index 全局定义访问的默认首页地址。注意要和 locate {} 下面定义的区分开来

charset utf-8; # 设置网页的默认编码格式

access_log usr/local/var/log/host.access.log main;

# access_log 指定此虚拟主机的访问日志存放路径,最后的 main 用于指定访问日志的输出格式

error_log usr/local/var/log/host.error.log error;

....

}

server 标志定义虚拟主机开始。

listen 用于指定虚拟主机的服务端口。

server_name 用来指定IP地址或者域名,多个域名之间用空格分开。

root 表示在这整个 server 虚拟主机内,全部的 root web 根目录。注意要和 locate {} 下面定义的区分开来。

index 全局定义访问的默认首页地址。注意要和 locate {} 下面定义的区分开来。

charset 用于设置网页的默认编码格式。

access_log 用来指定此虚拟主机的访问日志存放路径,最后的 main 用于指定访问日志的输出格式。

2.5 location 模块

location 模块是 nginx 中用的最多的,也是最重要的模块了,什么负载均衡啊、反向代理啊、虚拟域名啊都与它相关。慢慢来讲:

location 根据它字面意思就知道是来定位的,定位 URL,解析 URL,所以,它也提供了强大的正则匹配功能,也支持条件判断匹配,用户可以通过 location 指令实现 Nginx 对动、静态网页进行过滤处理。像我们的 php 环境搭建就是用到了它。

我们先来看这个,设定默认首页和虚拟机目录。

location / { # 表示匹配访问根目录

root /Users/yangyi/www; # 指定访问根目录时,虚拟主机的 web 目录

index index.php index.html index.htm; # 设定我们只输入域名后访问的默认首页地址

}

location / 表示匹配访问根目录。

root 指令用于指定访问根目录时,虚拟主机的web目录,这个目录可以是相对路径(相对路径是相对于nginx的安装目录)。也可以是绝对路径。

index 用于设定我们只输入域名后访问的默认首页地址,有个先后顺序:index.php index.html index.htm,如果没有开启目录浏览权限,又找不到这些默认首页,就会报403错误。

location 还有一种方式就是正则匹配,开启正则匹配这样:location ~。后面加个~。

下面这个例子是运用正则匹配来链接php。我们之前搭建环境也是这样做:

location ~ .php$ {

root /Users/yangyi/www;

fastcgi_pass 127.0.0.1:9000; # 链接的是 php-fpm 的地址

fastcgi_index index.php;

include fastcgi.conf;

}

.php$ 熟悉正则的我们直到,这是匹配 .php 结尾的 URL,用来解析 php 文件。里面的 root 也是一样,用来表示虚拟主机的根目录。

fast_pass 链接的是 php-fpm 的地址。

2.6 upstream 模块

upstream 模块负责负载均衡模块,通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡

upstream iyangyi.com{

ip_hash;

server 192.168.12.1:80;

server 192.168.12.2:80 down;

server 192.168.12.3:8080 max_fails=3 fail_timeout=20s;

server 192.168.12.4:8080;

}

在上面的例子中,通过 upstream 指令指定了一个负载均衡器的名称 iyangyi.com。这个名称可以任意指定,在后面需要的地方直接调用即可。

里面是 ip_hash 这是其中的一种负载均衡调度算法,下面会着重介绍。紧接着就是各种服务器了。用 server 关键字表识,后面接 ip。

Nginx 的负载均衡模块目前支持 4 种调度算法 :

1)weight 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。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软件包。

在 HTTP 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。

最后传播一个重要的消息,云计算现在白菜价了,2018年各大云计算厂商竞相降价,云服务器低至不到300元/年。现在不管是学习linux,运行长时间工作的爬虫,上线个人App或小程序,搭建网站做个人站长,都是时候上云服务了,错过这一波可能你就掉队。这里整理了一份云计算优惠活动产品列表,点击拿走不谢!


转自:http://blog.51cto.com/13883927/2163916

最新文章

  1. VC
  2. GETOBJECTOPTIONS
  3. Mac 安装Java JDK
  4. 161208、Java enum 枚举还可以这么用
  5. cacti 添加
  6. MySQL版本调研
  7. POJ 2378 Tree Cutting (DFS)
  8. 通过SPList Definition自定义ListItem打开编辑详细页面
  9. codeforces 148D Bag of mice(概率dp)
  10. Mysql group_concat
  11. highcharts分段显示不同颜色
  12. 查看oracle数据库的连接数以及用户 (转:http://blog.itpub.net/24558279/viewspace-752293/)
  13. MySQL字段操作与数据处理
  14. 小飞机ss端口被占用处理
  15. jQuery UI弹出新窗体
  16. vue-cli@2的原理解析
  17. python-闭包函数
  18. c/c++ 标准库 map set 插入
  19. UVA-10375 唯一分解定理
  20. JavaScript-DOM(1)

热门文章

  1. ffmpeg+libx264+facc交叉编译 实现264流录制avi文件
  2. mysql05---游标
  3. shinx索引部分源码分析——过程:连接到CSphSource对应的sql数据源,通过fetch row取其中一行,然后解析出field,分词,获得wordhit,最后再加入到CSphSource的Hits里
  4. Java简单的加密解密算法,使用异或运算
  5. UICollectionView与UITableView混用手势冲突
  6. DTV 常用功能
  7. robotframework 随机选中下拉框中的值
  8. UI:数据的解析XML与JSON
  9. MultipartResolver实现文件上传功能
  10. 关于Lucene全文检索相关技术