nginx

1. nginx简介

nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。

nginx由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用。

第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

2. nginx的特性与优点

2.1 nginx的特性

nginx是一个很牛的高性能Web和反向代理服务器,它具有很多非常优越的特性:

在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应
使用epoll and kqueue作为开发模型
nginx作为负载均衡服务器:nginx既可在内部直接支持和PHP程序对外进行服务,也可支持作为HTTP代理服务器对外进行服务
nginx采用C进行编写,不论系统资源开销还是CPU使用效率都比Perlbal要好很多

2.2 nginx的优点

高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)
配置文件非常简单:风格跟程序一样通俗易懂
成本低廉:nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组
内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
稳定性高:用于反向代理,宕机的概率微乎其微
模块化设计:模块可以动态编译
外围支持好:文档全,二次开发和模块较多
支持热部署:可以不停机重载配置文件
支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化

3. nginx的功能及应用类别

3.1 nginx的基本功能

静态资源的web服务器,能缓存打开的文件描述符
http、smtp、pop3协议的反向代理服务器
缓存加速、负载均衡
支持FastCGI(fpm,LNMP),uWSGI(Python)等
模块化(非DSO机制),过滤器zip、SSI及图像的大小调整
支持SSL

3.2 nginx的扩展功能

基于名称和IP的虚拟主机
支持keepalive
支持平滑升级
定制访问日志、支持使用日志缓冲区提高日志存储性能
支持URL重写
支持路径别名
支持基于IP及用户的访问控制
支持速率限制,支持并发数限制

3.3 nginx的应用类别

使用nginx结合FastCGI运行PHP、JSP、Perl等程序
使用nginx作反向代理、负载均衡、规则过滤
使用nginx运行静态HTML网页、图片
nginx与其他新技术的结合应用

4. nginx的模块与工作原理

nginx由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

4.1 nginx的模块分类

nginx的模块从结构上分为核心模块、基础模块和第三方模块

HTTP模块、EVENT模块和MAIL模块等属于核心模块
HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块属于基本模块
HTTP Upstream模块、Request Hash模块、Notice模块和HTTP Access Key模块属于第三方模块
用户根据自己的需要开发的模块都属于第三方模块。正是有了如此多模块的支撑,nginx的功能才会如此强大

nginx模块从功能上分为三类,分别是:

Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handlers处理器模块一般只能有一个
Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由nginx输出
Proxies(代理器模块)。就是nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能
nginx模块分为:核心模块、事件模块、标准Http模块、可选Http模块、邮件模块、第三方模块和补丁等

nginx基本模块:所谓基本模块,指的是nginx默认的功能模块,它们提供的指令,允许你使用定义nginx基本功能的变量,在编译时不能被禁用,包括:
核心模块:基本功能和指令,如进程管理和安全。常见的核心模块指令,大部分是放置在配置文件的顶部
事件模块:在Nginx内配置网络使用的能力。常见的events(事件)模块指令,大部分是放置在配置文件的顶部
配置模块:提供包含机制

4.2 nginx的工作原理

nginx的模块直接被编译进nginx,因此属于静态编译方式。

启动nginx后,nginx的模块被自动加载,与Apache不一样,首先将模块编译为一个so文件,然后在配置文件中指定是否进行加载。

在解析配置文件时,nginx的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。

nginx的进程架构:
启动nginx时,会启动一个Master进程,这个进程不处理任何客户端的请求,主要用来产生worker线程,一个worker线程用来处理n个request。

5. nginx的安装与配置

5.1 nginx的安装
//创建系统用户nginx
[root@localhost ~]# useradd -r -M -s /sbin/nologin nginx

//安装依赖环境
[root@localhost ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
安装过程略....
[root@localhost ~]# yum -y groups mark install 'Development Tools'
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Marked install: Development Tools

[root@localhost s/创建日志存放目录
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx.nginx /var/log/nginx

//下载nginx
[root@localhost ~]# cd /usr/src/rc
[root@localhost ~]# wget http://nginx.org/download/nginx-1.12.0.tar.gz
--2019-03-01 09:29:57--  http://nginx.org/download/nginx-1.12.0.tar.gz
Resolving nginx.org (nginx.org)... 95.211.80.227, 62.210.92.35, 2001:1af8:4060:a004:21::e3
Connecting to nginx.org (nginx.org)|95.211.80.227|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 980831 (958K) [application/octet-stream]
Saving to: ‘nginx-1.12.0.tar.gz’

100%[=================================================================>] 980,831     14.4KB/s   in 59s    

2019-03-01 09:31:00 (16.1 KB/s) - ‘nginx-1.12.0.tar.gz’ saved [980831/980831]
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log
//配置nginx环境变量
[root@localhost nginx-1.12.0]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@localhost nginx-1.12.0]# . /etc/profile.d/nginx.sh
[root@localhost nginx-1.12.0]# which nginx
/usr/local/nginx/sbin/nginx
[root@localhost nginx-1.12.0]# nginx
[root@localhost nginx-1.12.0]# ss -antl
State       Recv-Q Send-Q        Local Address:Port                       Peer Address:Port              
LISTEN      0      128                       *:111                                   *:*                  
LISTEN      0      128                       *:80                                    *:*                  
LISTEN      0      128                       *:22                                    *:*                  
LISTEN      0      128                      :::111                                  :::*                  
LISTEN      0      128                      :::22                                   :::*                  
[root@localhost nginx-1.12.0]# 
5.2 nginx安装后配置
//服务控制方式,使用nginx命令
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
[root@localhost ~]# nginx -t      //检查配置文件语法
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    
[root@localhost ~]# nginx -v     //输出nginx的版本
nginx version: nginx/1.14.2
[root@localhost ~]# nginx -s stop       //发送服务控制信号,可选值有{stop|quit|reopen|reload} 
	 -c  //指定配置文件的路径
[root@localhost ~]# ss -antl
State       Recv-Q Send-Q        Local Address:Port                       Peer Address:Port              
LISTEN      0      128                       *:111                                   *:*                  
LISTEN      0      128                       *:51856                                 *:*                  
LISTEN      0      128                       *:22                                    *:*                  
LISTEN      0      128                      :::45995                                :::*                  
LISTEN      0      128                      :::111                                  :::*                  
LISTEN      0      128                      :::22                                   :::*                  
//启动nginx
[root@localhost ~]# nginx 
[root@localhost ~]# ss -antl
State       Recv-Q Send-Q        Local Address:Port                       Peer Address:Port              
LISTEN      0      128                       *:111                                   *:*                  
LISTEN      0      128                       *:80                                    *:*                  
LISTEN      0      128                       *:51856                                 *:*                  
LISTEN      0      128                       *:22                                    *:*                  
LISTEN      0      128                      :::45995                                :::*                  
LISTEN      0      128                      :::111                                  :::*                  
LISTEN      0      128                      :::22                                   :::*                  
5.3 用脚本来启动nginx服务
//在/etc/init.d/的目录下创建一个名为nginx的脚本,init.d目录包含许多系统各种服务的启动和停止脚本,service命令也是调用这里面的服务
[root@localhost ~]# cd /etc/init.d/
[root@localhost init.d]# vim nginx.sh 
[root@localhost init.d]# cat nginx.sh
#!/bin/bash
case "$1" in
start)
	/usr/local/nginx/sbin/nginx &> /dev/null
	if [ $? -ne 0 ];then
		echo " start faild,请检查是否已经开启" 
	fi
	;;
stop)
	/usr/local/nginx/sbin/nginx -s stop &> /dev/null
	if [ $? -ne 0 ];then
		echo "stop faild,请检查是否已将停止"
	fi
	;;
reload)
	/usr/local/nginx/sbin/nginx -s reload &> /dev/null
	if [ $? -ne 0 ];then
		echo "配置文件加载错误,请检查是否开启服务"
	fi
	;;
restart)
	$0 stop
	$0 start
	;;
*)
	echo "Please enter service nginx start|restart|stop|reload"
	;;
esac

[root@localhost init.d]# chmod 755 nginx.sh
[root@localhost init.d]# mv nginx.sh nginx
[root@localhost init.d]# ll
总用量 64
-rw-r--r--. 1 root root  17500 5月   3 2017 functions
-rwxr-xr-x. 1 7161 31415 10576 2月  28 17:29 mysqld
-rwxr-xr-x. 1 root root   4334 5月   3 2017 netconsole
-rwxr-xr-x. 1 root root   7293 5月   3 2017 network
-rwxr-xr-x. 1 root root    550 2月  28 18:18 nginx
-rwxr-xr-x. 1 root root   2402 2月  28 17:52 php-fpm
-rw-r--r--. 1 root root   1160 6月  27 2017 README
-rwxr-xr-x. 1 root root   2443 3月   6 2017 rhnsd

//用service命令来调用这个脚本
[root@localhost ~]# service nginx stop
[root@localhost ~]# ss -antl
State       Recv-Q Send-Q        Local Address:Port                       Peer Address:Port              
LISTEN      0      128                       *:22                                    *:*                  
LISTEN      0      100               127.0.0.1:25                                    *:*                  
LISTEN      0      128                       *:10050                                 *:*                  
LISTEN      0      128                       *:10051                                 *:*                  
LISTEN      0      128               127.0.0.1:9000                                  *:*                  
LISTEN      0      128                      :::22                                   :::*                  
LISTEN      0      100                     ::1:25                                   :::*                  
LISTEN      0      80                       :::3306                                 :::*                  
[root@localhost ~]# service nginx start
[root@localhost ~]# ss -antl
State       Recv-Q Send-Q        Local Address:Port                       Peer Address:Port              
LISTEN      0      128                       *:80                                    *:*                  
LISTEN      0      128                       *:22                                    *:*                  
LISTEN      0      100               127.0.0.1:25                                    *:*                  
LISTEN      0      128                       *:10050                                 *:*                  
LISTEN      0      128                       *:10051                                 *:*                  
LISTEN      0      128               127.0.0.1:9000                                  *:*                  
LISTEN      0      128                      :::22                                   :::*                  
LISTEN      0      100                     ::1:25                                   :::*                  
LISTEN      0      80                       :::3306                                 :::*                  
[root@localhost ~]# service nginx restart
[root@localhost ~]# ss -antl
State       Recv-Q Send-Q        Local Address:Port                       Peer Address:Port              
LISTEN      0      128                       *:80                                    *:*                  
LISTEN      0      128                       *:22                                    *:*                  
LISTEN      0      100               127.0.0.1:25                                    *:*                  
LISTEN      0      128                       *:10050                                 *:*                  
LISTEN      0      128                       *:10051                                 *:*                  
LISTEN      0      128               127.0.0.1:9000                                  *:*                  
LISTEN      0      128                      :::22                                   :::*                  
LISTEN      0      100                     ::1:25                                   :::*                  
LISTEN      0      80                       :::3306                                 :::*                  
[root@localhost ~]# service nginx reload
[root@localhost ~]# service nginx ll
Please enter service nginx start|restart|stop|reload

6 nginx的配置文件详解

主配置文件:/usr/local/nginx/conf/nginx.conf

默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件
可以在启动nginx时通过-c选项来指定要读取的配置文件

nginx常见的配置文件及其作用

配置文件作用
nginx.confnginx的基本配置文件
mime.typesMIME类型关联的扩展文件
fastcgi.conf与fastcgi相关的配置
proxy.conf与proxy相关的配置
sites.conf配置nginx提供的网站,包括虚拟主机
6.1 nginx.conf配置详解

nginx.conf的内容分为以下几段:

  • main配置段:全局配置段。其中main配置段中可能包含event配置段

  • event {}:定义event模型工作特性

  • http {}:定义http协议相关的配置

配置指令:要以分号结尾,语法格式如下:

derective value1 [value2 …]
支持使用变量:

  • 内置变量:模块会提供内建变量定义
  • 自定义变量:set var_name value
6.2 用于调试、定位问题的配置参数

daemon {on|off}; //是否以守护进程方式运行nginx,调试时应设置为off
master_process {on|off}; //是否以master/worker模型来运行nginx,调试时可以设置为off
error_log 位置 级别; //配置错误日志
error_log里的位置和级别能有以下可选项:

位置级别
file stderr syslog:server=address[,parameter=value] memory:sizedebug:若要使用debug级别,需要在编译nginx时使用–with-debug选项 info notice warn error crit alert emerg
6.3 正常运行必备的配置参数
user USERNAME [GROUPNAME];    //指定运行worker进程的用户和组
pid /path/to/pid_file;    //指定nginx守护进程的pid文件
worker_rlimit_nofile number;    //设置所有worker进程最大可以打开的文件数,默认为1024
worker_rlimit_core size;    //指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认即可
6.4nginx服务启动脚本
//创建脚本
[root@localhost init.d]# cat nginx 
#!/bin/bash
# chkconfig: 2345 20  80
# description: aassddf

case $1 in 
	'stop'|'STOP')
  	  /usr/local/nginx/sbin/nginx -s stop
    ;;
	'start'|'START')
  	  /usr/local/nginx/sbin/nginx
    ;; 
	'restart'|'RESTART')
  	  /usr/local/nginx/sbin/nginx -s stop
  	  /usr/local/nginx/sbin/nginx 
    ;;
	'reload'|'RELOAD')
  	  /usr/local/nginx/nginx -s reload
    ;;
    *)

	echo 'Usage:service nginx stop|restart|start|reload'
esac
	
[root@localhost ~]# mv nginx.sh /etc/init.d/nginx
[root@localhost init.d]# chmod +x nginx 
[root@localhost ~]# ll /etc/init.d/nginx -d
-rwxr-xr-x. 1 root root 434 3月  28 20:34 /etc/init.d/nginx

[root@jun ~]# service nginx start
[root@jun ~]# ss -antl
State       Recv-Q Send-Q      Local Address:Port                     Peer Address:Port              
LISTEN      0      128                     *:80                                  *:*                  
LISTEN      0      128                     *:22                                  *:*                  
LISTEN      0      128                     *:10050                               *:*                  
LISTEN      0      128                     *:10051                               *:*                  
LISTEN      0      128             127.0.0.1:9000                                *:*                  
LISTEN      0      128                    :::22                                 :::*                  
LISTEN      0      80                     :::3306                               :::*                  
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值