共计 9430 个字符,预计需要花费 24 分钟才能阅读完成。
一:基介绍
官网地址 www.nginx.org,nginx 是由 1994 年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯 rambler.ru 公司开发的,开发工作最早从 2002 年开始,第一次公开发布时间是 2004 年 10 月 4 日,版本号是 0.1.0
Nginx 是单进程单线程模型,即启动的工作进程只有一个进程响应客户端请求,不像 apache 可以在一个进程内启动多个线程响应可请求,因此在内存占用上比 apache 小的很多。Nginx 维持一万个非活动会话只要 2.5M 内存。Nginx 和 MySQL 是 CPU 密集型的,就是对 CPU 的占用比较大,默认 session 在本地文件保存,支持将 session 保存在 memcache,但是 memcache 默认支持最大 1M 的课 hash 对象。
nginx 的版本分为开发版、稳定版和过期版,nginx 以功能丰富著称,它即可以作为 http 服务器,也可以作为反向代理服务器或者邮件服务器,能够快速的响应静态网页的请求,支持 FastCGI/SSL/Virtual Host/URL Rwrite/Gzip/HTTP Basic Auth 等功能,并且支持第三方的功能扩展。
nginx 安装可以使用 yum 或源码安装,推荐使用源码,一是 yum 的版本比较旧,二是使用源码可以自定义功能,方便业务的上的使用,源码安装需要提前准备标准的编译器,GCC 的全称是(GNU Compiler collection),其有 GNU 开发,并以 GPL 即 LGPL 许可,是自由的类 UNIX 即苹果电脑 Mac OS X 操作系统的标准编译器,因为 GCC 原本只能处理 C 语言,所以原名为 GNU C 语言编译器,后来得到快速发展,可以处理 C ++,Fortran,pascal,objective-C,Java 以及 Ada 等其他语言,此外还需要 Automake 工具,以完成自动创建 Makefile 的工作,Nginx 的一些模块需要依赖第三方库,比如 pcre(支持 rewrite),zlib(支持 gzip 模块)和 openssl(支持 ssl 模块)
二:安装
1、环境准备:先安装准备环境
yum install gcc gcc-c++ automake pcre pcre-devel zlip zlib-devel openssl openssl-devel
gcc 为 GNU Compiler Collection 的缩写,可以编译 C 和 C ++ 源代码等,它是 GNU 开发的 C 和 C ++ 以及其他很多种语言 的编译器(最早的时候只能编译 C,后来很快进化成一个编译多种语言的集合,如 Fortran、Pascal、Objective-C、Java、Ada、Go 等。)gcc 在编译 C ++ 源代码的阶段,只能编译 C++ 源文件,而不能自动和 C++ 程序使用的库链接(编译过程分为编译、链接两个阶段,注意不要和可执行文件这个概念搞混,相对可执行文件来说有三个重要的概念:编译(compile)、链接(link)、加载(load)。源程序文件被编译成目标文件,多个目标文件连同库被链接成一个最终的可执行文件,可执行文件被加载到内存中运行)。因此,通常使用 g++ 命令来完成 C++ 程序的编译和连接,该程序会自动调用 gcc 实现编译。gcc-c++ 也能编译 C 源代码,只不过把会把它当成 C ++ 源代码,后缀为.c 的,gcc 把它当作是 C 程序,而 g ++ 当作是 c ++ 程序;后缀为.cpp 的,两者都会认为是 c ++ 程序,注意,虽然 c ++是 c 的超集,但是两者对语法的要求是有区别的。automake 是一个从 Makefile.am 文件自动生成 Makefile.in 的工具。为了生成 Makefile.in,automake 还需用到 perl,由于 automake 创建的发布完全遵循 GNU 标准,所以在创建中不需要 perl。libtool 是一款方便生成各种程序库的工具。pcre pcre-devel:在 Nginx 编译需要 PCRE(Perl Compatible Regular Expression),因为 Nginx 的 Rewrite 模块和 HTTP 核心模块会使用到 PCRE 正则表达式语法。zlip zlib-devel:nginx 启用压缩功能的时候,需要此模块的支持。openssl openssl-devel:开启 SSL 的时候需要此模块的支持。
2、下载 nginx 安装包:官网地址:http://nginx.org/
截止得到当前,最新的版本为 1.8.1,在 linux 使用 wget 下载:
[root@Server1 ~]# wget http://nginx.org/download/nginx-1.8.1.tar.gz
--2016-04-23 10:22:55-- http://nginx.org/download/nginx-1.8.1.tar.gz
Resolving nginx.org (nginx.org)... 206.251.255.63, 95.211.80.227, 2001:1af8:4060:a004:21::e3, ...
Connecting to nginx.org (nginx.org)|206.251.255.63|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 833473 (814K) [application/octet-stream]
Saving to:‘nginx-1.8.1.tar.gz.1’100%[==============================================================================================================>] 833,473 251KB/s in 3.2s
2016-04-23 10:23:00 (251 KB/s) -‘nginx-1.8.1.tar.gz.1’saved [833473/833473]
3、解压安装包:
[root@Server1 ~]# tar xvf nginx-1.8.1.tar.gz
[root@Server1 ~]# cd nginx-1.8.1
[root@Server1 nginx-1.8.1]$ ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
4、编译 nginx:make
编译是为了检查系统环境是否符合编译安装的要求,比如是否有 gcc 编译工具,是否支持编译参数当中的模块,并根据开启的参数等生成 Makefile 文件为下一步做准备:
[root@Server1 nginx-1.8.1]# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre
结果如下:
5、生成脚本及配置文件:make
编译步骤,根据 Makefile 文件生成相应的模块
6、安装:make install
创建目录,并将生成的模块和文件复制到相应的目录:
备注:nginx 完成安装以后,有四个主要的目录:
conf:保存 nginx 所有的配置文件,其中 nginx.conf 是 nginx 服务器的最核心最主要的配置文件,其他的.conf 则是用来配置 nginx 相关的功能的,例如 fastcgi 功能使用的是 fastcgi.conf 和 fastcgi_params 两个文件,配置文件一般都有个样板配置文件,是文件名.default 结尾,使用的使用将其复制为并将 default 去掉即可。html 目录中保存了 nginx 服务器的 web 文件,但是可以更改为其他目录保存 web 文件, 另外还有一个 50x 的 web 文件是默认的错误页面提示页面。logs:用来保存 nginx 服务器的访问日志错误日志等日志,logs 目录可以放在其他路径,比如 /var/logs/nginx 里面。sbin:保存 nginx 二进制启动脚本,可以接受不同的参数以实现不同的功能。
7、启动:
将监听端口改为 8090,避免 80 端口冲突:
listen 8090;
8、通过命令启动和关闭 nginx:
[root@Server1 sbin]# /usr/local/nginx/sbin/nginx/nginx
nginx: [emerg] getpwnam("nginx") failed #没有 nginx 用户
[root@Server1 sbin]# /usr/local/nginx/sbin/nginx/nginx
nginx: [emerg] mkdir() "/var/tmp/nginx/client/" failed (2: No such file or directory) #目录不存在
[root@Server1 sbin]# /usr/local/nginx/sbin/nginx/nginx #直到没有报错,才算启动完成
9、重读配置文件和关闭服务:
[root@Server1 local]# /usr/local/nginx/sbin/nginx/nginx #启动 服务
[root@Server1 local]# /usr/local/nginx/sbin/nginx/nginx -s reload #不停止服务重读配置文件
[root@Server1 local]# /usr/local/nginx/sbin/nginx/nginx -s stop #停止服务 #停止服务
10. 验证端口是否开启:
[root@Server1 sbin]# ps -ef | grep nginx
root 13228 1 0 Apr23 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx/nginx #nginx 的主进程, 只有一个主进程
nginx 13229 13228 0 Apr23 ? 00:00:00 nginx: worker process #nginx 工作进程,默认只有一个,可以通过修改 nginx.conf 中的 worker_processes 1; 参数启动多个工作进程
root 13295 1400 0 00:01 pts/0 00:00:00 grep --color=auto nginx
[root@Server1 local]# lsof -i:8090 #显示占用 8090 的进程
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 13337 root 6u IPv4 5932680 0t0 TCP *:8090 (LISTEN)
nginx 13338 nginx 6u IPv4 5932680 0t0 TCP *:8090 (LISTEN)
11、通过给 nginx 的主进程 ID 号发送信号启动或停止 nginx:
获取 nginx 主进程号的办法:
[root@Server1 nginx]# cat /var/run/nginx/nginx.pid #查看 nginx 的 pid 文件,此文件保存的就是 nginx 的主进程 id
13337 #次 ID 是随机的,每次启动都不一样的
[root@Server1 nginx]# ps -ef | grep nginx #过滤 nginx 的进程号
root 13337 1 0 00:05 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx/nginx
nginx 21568 13337 0 10:58 ? 00:00:00 nginx: worker process
支持的信号:
[root@Server1 nginx]# kill -QUIT 13337 #平缓关闭 Nginx,即不再接受新的请求,但是等当前请求处理完毕后再关闭 Nginx。[root@Server1 nginx]# kill -TERM 21665 #快速停止 Nginx 服务
[root@Server1 nginx]# kill -HUP 21703 #使用新的配置文件启动进程然后平缓停止原有的 nginx 进程,即平滑重启。[root@Server1 nginx]# kill -USR1 21703 #重新打开配置文件,用于 nginx 日志切割
日期切割的脚本:#!/bin/bash
PID=`cat /var/run/nginx/nginx.pid`
mv /var/log/nginx/access.log /var/log/nginx/`date +%Y_%m_%d:%H:%M:%S`.access.log
kill -USR1 $PID
[root@Server1 nginx]# kill -USR2 21703 #使用新版本的 nginx 文件启动服务,然后在平缓停止原有的 nginx 服务,即平滑升级。[root@Server1 nginx]# kill -WINCH 21703 #平滑停止 nginx 的工作进程,用于 nginx 平滑升级。
三:nginx 主配置文件:nginx.conf
3.1:默认配置:配置文件默认保存在 path/conf 当中,默认的配置文件为 nginx.conf,以下是编译安装后的默认配置:
[root@Server1 conf]# grep -v "#" nginx.conf | grep -v "^$"
#全局生效,主要设置 nginx 的启动用户 / 组,启动的工作进程数量,Nginx 的 PID 路径,日志路径等。worker_processes 1; #默认启动一个工作进程
events { #events 设置快,主要影响 nginx 服务器与用户的网络连接,比如是否允许同时接受多个网络连接,使用哪种事件驱动模型处理请求,每个工作进程可以同时支持的最大连接数,是否开启对多工作进程下的网络连接进行序列化等。worker_connections 1024; #设置 nginx 可以接受的最大并发,多个进程只和
}
http {#http 块是 Nginx 服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这设置,http 块可以包含多个 server 块,而一个 server 块中又可以包含多个 location 块,server 块可以配置文件引入、MIME-Type 定义、日志自定义、是否启用 sendfile、连接超时时间和单个链接的请求上限等。include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
sendfile on; #是否调用 sendfile 函数(zero copy -->零 copy 方式)来输出文件,普通应用打开,可以大幅提升 nginx 的读文件性能,如果服务器是下载的就需要关闭,keepalive_timeout 65; #长连接超时时间,单位是秒
server { #设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多个 locating 模块。比如本虚拟机监听的端口、本虚拟机的名称和 IP 配置,多个 server 可以使用一个端口,比如都使用 8090 端口提供 web 服务、listen 8090; #server 的全局配置,配置监听的端口
server_name localhost; #本 server 的名称,当访问此名称的时候 nginx 会调用当前 serevr 内部的配置进程匹配。location / { #location 其实是 server 的一个指令,为 nginx 服务器提供比较多而且灵活的指令,都是在 location 中提现的,主要是基于 nginx 接受到的请求字符串,对用户请求的 UIL 进行匹配,并对特定的指令进行处理,包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三方模块的配置也是在 location 模块中配置。root html; #相当于默认页面的目录名称,默认是相对路径,可以使用绝对路径配置。index index.html index.htm;
}
error_page 500 502 503 504 /50x.html; #错误页面的文件名称
location = /50x.html {#location 处理对应的不同错误码的页面定义到 /50x.html,这个跟对应其 server 中定义的目录下。root html; #定义默认页面所在的目录
}
}
}
3.2:配置 nginx 主进程的启动用户和工作进程数:
user xxxx; #每一条指令都要以分号结尾
worker_processes 1; #可以指定启动的固定 nginx 进程数,或使用 auto,auto 是启动与当前 CPU 线程相同的进程数,如 CPU 是四核八线程的就启动八个进程的 Nginx 工作进程。
3.3:绑定 Nginx 工作进程到不同的 CPU 上:
默认 Nginx 是不进行保定的,绑定并不能是当前 nginx 进程独占以一核心 CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了 nginx 工作进程在不同 cpu 上的跳转,减少了 CPU 对进程的资源分配与回收,因此可以有效的提升 nginx 服务器的性能,配置如下:
[root@Server1 nginx]# grep process /proc/cpuinfo | wc -l #确认 CPU 的核心数量
4
四个线程 CPU 的配置:worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
八个线程 CPU 的配置:worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
3.4:PID 和错误日志文件路径:
#pid logs/nginx.pid; #可以指定绝对路径
#error_log logs/error.log; #指定错误日志路径
#error_log logs/error.log notice; #指定一个日志记录级别
#error_log logs/error.log info;
支持的日志级别:语法:
error_log file [debug | info | notice | warn | error | crit ] | [{debug_core | debug_alloc | debug_mutex | debug_event | debug_http | debug_mail | debug_mysql } ]
日志级别 = 错误日志级别 | 调试日志级别; 或者
日志级别 = 错误日志级别;
错误日志的级别: emerg, alert, crit, error, warn, notic, info, debug,
调试日志的级别: debug_core, debug_alloc, debug_mutex, debug_event, debug_http, debug_mail, debug_mysql
error_log 指令的日志级别配置分为错误日志级别和调试日志级别,错误日志只能设置一个级别,而且错误日志必须书写在调试日志级别的前面,另外调试日志可以设置多个级别,其他配置方法可能无法满足需求。
3.5:配置文件的引入:include
include file;#file 是要导入的文件,支持相对路径,一般在 html 目录里面
导入一个 conf 文件,并配置不同主机名的页面, 编辑 nginx.conf 主配置文件:
include /usr/local/nginx/conf.d/samsung.conf; #在最后一个大括号里面加入一项,*是导入任何以 conf 结尾的配置文件
在 /usr/local/nginx/conf.d/ 创建一个 samsung.conf,内容如下:[root@Server1 nginx]# grep -v "#" conf.d/samsung.conf | grep -v "^$"
server {listen 8090;
server_name samsung.chinacloudapp.cn;
location / {
root html;
index index1.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {root html;}
}
下面关于 Nginx 的文章您也可能喜欢,不妨参考下:
CentOS 7.2 下编译安装 PHP7.0.10+MySQL5.7.14+Nginx1.10.1 http://www.linuxidc.com/Linux/2016-09/134804.htm
搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm
CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm
CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm
CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm
Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm
Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm
Nginx 的 500,502,504 错误解决方法 http://www.linuxidc.com/Linux/2015-03/115507.htm
CentOS 7 编译安装 Nginx1.10.2 脚本启动失败解决思路 http://www.linuxidc.com/Linux/2017-01/139794.htm
Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-02/140495.htm