什么是Nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔•赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

nginx的特征特色及优点

1、模块化设计,较好的扩展性。旧版本的nginx仅支持在安装nginx时指定安装某个模块,不需要该模块了也不能卸载,除非卸载nginx重装,但现在nginx可以支持需要哪个模块就动态安装,不需要就卸载,这提高了nginx的可扩展性;
2、高可靠。
3、支持热部署。主要体现在:nginx支持不停机更新配置文件;不停机更换日志文件、不停机升级版本(当升级nginx版本时,已连接的用户仍使用旧版本nginx,用户下次连接就直接连接到新版本nginx,新建立的用户链接到新版本的nginx,实现了平滑升级)。
4、低内存消耗。10000个keep-alive连接模式下的非活动连接,仅需2.5M内存。
5、event-driven,aio,mmap,sendfile

nginx的基本功能

1、静态资源的web服务器;
2、http协议反向代理服务器;
3、pop3/imap4协议反向代理服务器;
4、FastCGI(LNMP),uWSGI(python)等协议;
5、模块化(非DSO),如zip,SSL模块。

nginx的程序架构

nginx的程序架构:Master/Worker结构(只有进程,没有线程)

1个master进程:负责加载和分析配置文件、管理worker进程、平滑升级; 1个worker或多个worker进程:负责处理并响应客户的请求;

缓存相关的进程:cache loader负责载入缓存对象,cache manager负责管理缓存对象。

nginx 离线安装包带依赖 nginx依赖包的安装顺序_nginx

2种Nginx安装方式介绍

首先第一步先安装好Nginx所需的依赖包:yum -y install gcc gcc-c++ make pcre pcre-devel zlib-devel zlib openssl-devel opensslnginx需要用到pcre库,pcre库全称是Perl compatible regular expressions ,翻译为Perl兼容正则表达式,是为了支持Nginx具备URL重写rewrite模块,若不安装pcre库,则Nginx无法使用rewrite模块。

1、使用tar包源码编译安装

进入 http://nginx.org/en/download.html网站下载最新的稳定版nginx源码包nginx-1.18.0.tar,把该源码包放到CentOS上解压即可使用 ./configure&&make&&make install安装即可。

2、使用yum方式安装

首先yum info nginx查看光盘可获得的nginx镜像,如果没有,需要到官网下载一个镜像仓库,如下图

nginx 离线安装包带依赖 nginx依赖包的安装顺序_html_02


根据自己的Linux版本,建立yum镜像仓库

nginx 离线安装包带依赖 nginx依赖包的安装顺序_html_03


最后 yum info nginx即可看到已经找到最新稳定的nginx包了,这时就可以使用 yum install nginx安装nginx即可。

nginx 离线安装包带依赖 nginx依赖包的安装顺序_nginx_04


注意:yum 方式安装的nginx,其默认安装路径可能与源码包方式安装的路径不一样,安装完后使用find / -name nginx查看nginx的安装路径即可,同时yum 方式安装的nginx默认会自动生成一个nginx的用户,源码包方式安装需要自己创建一个nginx用户,该nginx用户就是运行worker进程的用户,建议创建该用户为/bin/nologin,默认情况下worker进程使用nobody用户运行的。

源码包安装Nginx

先建立一个nginx用户及安装依赖:

useradd -s /sbin/nologin -M nginx
yum -y install  make zlib*  pcre* gcc gcc-c++  openssl*
或yum -y  install gcc gcc-c++  pcre pcre-devel zlib-devel zlib openssl-devel openssl

下面使用tar包源码编译安装nginx,下载好nginx-1.18.0.tar并上传到Linux上,tar -xf nginx-1.18.0.tar,然后就会解压出一个nginx-1.18.0目录,cd nginx-1.18.0/

nginx 离线安装包带依赖 nginx依赖包的安装顺序_html_05


执行 ./configure --help 查看安装帮助:

nginx 离线安装包带依赖 nginx依赖包的安装顺序_配置文件_06


可以看到执行./configure时可以带多个参数来指定安装路径以及要安装的模块,当然也可以不指定参数直接./configure,这样就会默认安装路径在/usr/local/nginx下,这里我就指定:

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module  --with-http_ssl_module  #(--with-http_stub_status_module是一个状态统计的模块)

预编译完没有报错,echo $? 输出0表示上一条命令执行没有问题,继续开始编译:

make -j 8

echo $? 输出0表示上一条命令执行没有问题,开始正式安装了:

make install

echo $? 输出0表示上一条命令执行没有问题,那么Nginx就安装完成了,如果安装过程中报错了,那就根据报错信息一步步解决,如果是依赖包没有安装那就安装依赖包吧。

安装成功输出页面信息:看,Nginx的安装目录默认在/usr/local/nginx下,这里建议建立一个指向/usr/local/nginx的软链接,如 ln -s /usr/local/nginx /usr/nginx 然后就将/usr/nginx作为开发人员使用,为什么要这样建立一份软链接呢,因为为了方便将来升级软件时,直接删除旧的软链接,再建立一个新的同名的指向新版本的软链接即可,这样作为开发人员使用的仍然是/usr/nginx,而实际已经升级版本了。

添加全局变量:

echo 'export PATH=/usr/local/nginx/sbin/:$PATH' >> /etc/profile
source /etc/profile

修改目录权限:

chown -R nginx.nginx  /usr/local/nginx
find / -name nginx 					#查找Nginx的安装路径

nginx 离线安装包带依赖 nginx依赖包的安装顺序_nginx_07


查看nginx命令帮助文档:nginx -h

nginx 离线安装包带依赖 nginx依赖包的安装顺序_配置文件_08

nginx的命令

nginx -h 	或 nginx -?		#打开nginx的帮助信息文档,查看帮助
启动nginx直接输入:nginx      	#启动Nginx  查看nginx命令 which nginx  输出/usr/local/nginx/sbin/nginx
nginx -v						#显示nginx的版本信息并退出
nginx -V 						#显示nginx版本以及查看安装了哪些配置模块信息等,然后退出
nginx -t						#检测nginx配置文件是否存在语法等错误,然后退出
nginx -T 						#检测nginx配置文件是否存在语法等错误,转储配置文件然后退出
nginx -s signal					#向 master 进程发送信号,可发送reopen 、reload、quit、stop等信号
nginx -s reopen 				#重新打开日志文件
nginx -s reload					#重新加载配置文件,使用新配置文件启动新的工作进程,优雅地关闭旧的工作进程
nginx -s quit 					#优雅的停止Nginx服务,即等待所有的请求都处理完成后才停止nginx服务
nginx -s stop 					#立即的、强行的停止nginx服务
nginx -q 						#在配置测试期间期间不显示、屏蔽非错误信息
nginx -p prefix 				#设置前缀路径(默认是:/usr/share/nginx/)
nginx -c filename 				#启动nginx时指定配置文件,不指定就使用默认配置文件(默认:/usr/local/nginx/conf/nginx.conf)
nginx -g directives 			#这是设置配置文件外的全局指令

这里讲一下reopen (重新打开日志文件)这个参数,在做访问日志切割时,Linux下我们知道,可以简单的把日志文件mv走,但是你会发现mv走后新的日志文件没有重新生成,一般linux下用的文件句柄,文件被打开情况下你mv走文件,但是原来操作这个文件的进程还是有这个文件的inode等信息,原进程还是读写原来的文件,因此简单的mv走日志文件无法令nginx重新生成新的日志文件,所以需要使用./nginx -s reopen来让nginx重新打开日志文件,nginx发现日志文件不见了,所以nginx才会重新生成新的日志文件,这样就做了到日志的切割。

查看nginx服务是否真正运行

ps -ef |grep nginx
netstat -tunlp|grep :80
lsof -i:80
nginx是一个web服务器,nginx默认的端口是:80端口
查看指定端口正在被哪个程序占用:netstat -tunlp|grep 80
lsof -i:端口号,用于查看某一端口的占用情况,比如查看80号端口使用情况,lsof -i:80

nginx的配置文件结构

nginx的配置文件可分为4大部分:

1、main block  									# 主配置段,即全局配置段,对所有http、mail都有效
	event{
			.........							# 事件驱动相关的配置
		}
2、http{
		........								# http/https协议的相关配置段
		}
3、mail{
		........								# mail协议的相关配置段
		}
4、stream{
		........								# stream协议的相关配置段
		}

这里我们讲一下http协议的相关配置段:

http{
		.....
		......								#各server的公共配置
	server{
			listen       80;
			server_name  虚拟主机名;
			location / {
            root   html;					#网站根目录
           	index  index.html index.htm;
      		}			   
		}
	server{
			listen       8080;
			server_name  虚拟主机名;
			location / {
            root   html;
           	index  index.html index.htm;
      		}
		}				
}

一个server就是一个虚拟机主机,也就是一个网站,可以有多个server,一个server里面可以有个多个location,也就是说一个nginx服务器可以搭建多个http网站。

nginx配置文件详解

http://nginx.org/en/docs/中可以得到nginx的配置文档说明书,非常有用,哪个命令不知道什么意思,就可以查一下。

打开nginx的配置文件:vim /usr/local/nginx/conf/nginx.conf先看全局配置段:

nginx 离线安装包带依赖 nginx依赖包的安装顺序_配置文件_09

user nobody;				#表示运行worker进程的用户是谁,默认是nobody用户,建议创建一个nginx用户来运行worker进程
worker_processes	1;		#表示worker进程数,应设为CPU的核心数(查看核心数:cat /proc/cpuinfo中cpu codes 值)

如图所示,只有1个worker进程:

nginx 离线安装包带依赖 nginx依赖包的安装顺序_nginx 离线安装包带依赖_10


将worker_processes改为2,如图所示,有2个worker_processes了:

nginx 离线安装包带依赖 nginx依赖包的安装顺序_nginx_11

#error_log  logs/error.log;
#error_log  logs/error.log  notice;		#这些是指定nginx的错误日志信息文件位置;
#error_log  logs/error.log  info;		#error_log级别分为debug,info,notice,warn,error, crit 默认为crit,该级别在日志名后定义

#pid   logs/nginx.pid;					#Nginx的pid文件,即存放master进程的PID号,nginx启动时就创建该nginx.pid文件,停止时就删除

events {								#events段
    worker_connetions  1024;	#每个worker的最大并发连接数,则nginx总的并发连接数就是:worker_processes*worker_connetions  
}
daemon	on|off					#是否使用守护进程,默认on就是守护进程后台执行,开发时为了方便可以设置为off前台进程实时显示

现在看http配置段

http {
    include       mime.types;					#使用include包含mime.types,这是一个文件,里面定义了很多解析类型
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '		#定义日志的格式,名叫main
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;		#访问日志路径并指定访问日志的记录格式是上面我们定义main格式

    sendfile        on;						#是否启用sendfile,高效文件传输模式     
    #tcp_nopush     on;

    #keepalive_timeout  0;					#配置长连接超时时间,0秒表示永不超时
    keepalive_timeout  65;					#配置长连接超时时间,默认单位秒,超过65秒内无动作则断开连接
	
    gzip  on;								#是否开启压缩功能,建议开启,能实现压缩传输增加传输效率

    server {								#定义一个虚拟主机
        listen       80;					#监听端口,默认80
        server_name  localhost;				#虚拟主机名称,网站一般定义为域名,如www.fujiseiko.com,server_name也可以设为IP地址

        #charset koi8-r;
		server_tokens	off;				#是否在响应报文的Server首部隐藏版本信息,off表示隐藏 curl -I www.fujiseiko.com
        access_log  logs/host.access.log  main;	#访问日志的路径及内容记录的格式为main格式

        location / {						#location后面紧跟的是对于URL的匹配规则,大括号里面的则是这个location的配置
            root   html;					#定义这个location的查找资源的根目录,这个目录可以是相对路径,也可以是绝对路径
            index  index.html index.htm;	#index:定义访问的默认首页
        }

        #error_page  404    /404.html;		#定义404展示的错误页,某些大型网站会把404错误页设计的很人性化,其实就是在这里设定的

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

优化并拆分nginx主配置文件

我们知道,在生产环境下虚拟主机不能是1个两个,频繁的修改nginx.config配置文件可能会造成系统异常宕机,为了减少错误率,我们可以将单个虚拟主机配置语句拎出来写成一个配置文件,如下:
假设有2个虚拟主机,www.fujiseiko.com、www.sn.com
创建目录专门存放这些配置文件,mkdir -p /usr/local/nginx/vhost
vim /usr/local/nginx/vhost/fujiseiko.conf 添加fujiseiko虚拟主机配置文本:

server {																				
        listen       80;						#使用80端口											
        server_name  fujiseiko;					#建立fujiseiko虚拟主机											
		server_tokens	off;															
        location / {									
            root   html;									
            index  index.html index.htm;				
        }

同理
vim /usr/local/nginx/vhostsn.conf 添加sn虚拟主机配置文本:

server {																				
        listen       8080;					#使用8080端口												
        server_name  sn;					#建立sn虚拟主机											
		server_tokens	off;															
        location / {									
            root   html;									
            index  index.html index.htm;				
        }

两个虚拟主机的配置文件都建立完了,使用include语句把他们加入到nginx的主配置文件当中去;

vim /usr/local/nginx/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
     sendfile        on;								
    keepalive_timeout  65;				
	include /usr/local/nginx/vhost/*.conf;						#使用include语句把他们加入nginx的主配置文件中。完美。
}

总结

1、 useradd -s /sbin/nologin -M nginx															#创建nginx用户
2、 yum -y  install gcc gcc-c++  pcre pcre-devel zlib zlib-devel  openssl openssl-devel			#yum安装依赖
3、./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module  --with-http_ssl_module			#预编译
4、make																							#编译
5、make install																					#安装
6、echo 'export PATH=/usr/local/nginx/sbin/:$PATH' >> /etc/profile								#添加环境变量,也可以在/usr/bin中创建一个链接到nginx的软链接
7、source /etc/profile 																			#使配置生效
8、chown -R nginx.nginx  /usr/local/nginx														#修改目录权限