nginx基础介绍及源码编译详解

1.什么是nginx?

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件代理服务器,并在一个BSD-like协议下发行。由俄罗斯的程序设计师lgor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
Nginx相较于Apache\lighttpd具有占有内存少,稳定性高等优势,并且依靠并发能力强,丰富的模块库以及友好灵活的配置而闻名。在Linux操作系统下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于Epoll的高效事件模型kqueue.

2.Nginx VS Apache

(1)相同点:

1、都是HTTP服务器软件

2、功能上都采用模块化结构设计

3、都支持通用的语言接口,如PHP、Perl、Python等

4、支持正向、反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输

(2)不同点:

1、Apache处理速度很慢,占用很多内存资源

2、功能上,Apache所有模块支持动静态编译,Nginx模块都是静态编译的

3、对Fcgi的支持:Apache支持的很不好,Nginx支持非常好

4、处理连接方式:Nginx支持epoll,Apache不支持

5、空间使用上:Nginx安装包仅几百K

3.Nginx优势

1、作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高

2、作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度

3、作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡

4、在性能方面,Nginx是专门为性能优化而开发的,实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对5万个并发连接数的响应,而且只占用很低的内存资源

5、在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持1万个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的

6、在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7x24小时不间断地运行
 Nginx具有很高的稳定性;支持热部署;代码质量非常高,代码很规范,手法成熟,模块扩展也很容易;采用了一些os提供的最新特性如对sendfile(Linux2.2+),accept-filter(FreeBSD4.1+),TCP_DEFER_ACCEPT(Linux 2.4+)的支持,从而大大提高了性能。

4.Nginx多进程模式

 nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。

5.Nginx的事件处理机制

nginx采用异步非阻塞事件处理机制。

同步和异步、阻塞与非阻塞:
1、同步与异步:主要是针对应用程序与内核的交互方式而言的:
同步:进程发出数据后,等内核返回响应以后才继续下一个请求,即如果内核一直不返回数据,那么进程就一直等,直到天荒地老,死机error。
异步:进程发出数据后,不等内核返回响应,接着处理下一个请求,Nginx是异步的

2.阻塞与非阻塞
可以理解为内核与IO设备的交互方式,当内核收到进程请求IO数据时候的处理方式
也可以简单理解为内核需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞
阻塞:IO调用不能立即返回结果,即一个进程发起的IO请求不能得到立即满足时,进程就要一直等到内核响应,内核要把数据从IO设备复制到内核空间,再返回给进程,这是阻塞。
非阻塞:IO调用可以立即返回结果,一个进程发起的IO进程不能立即满足时,不在等待,而是一遍一遍的轮训查看IO是否完成

6.Nginx源码编译

本次实验使用7.5镜像封装的虚拟机作为nginx服务器,ip:172.25.33.1,hostname:server1
(1)官网下载安装包并解压

[root@server1 ~]# tar zxf nginx-1.17.1.tar.gz 
[root@server1 ~]# cd nginx-1.17.1/
[root@server1 nginx-1.17.1]# ll
total 748
drwxr-xr-x 6 1001 1001    326 Jul 24 17:31 auto        #该目录下的cc是用来编译的
-rw-r--r-- 1 1001 1001 297374 Jun 25 20:19 CHANGES      #各版本的差异性
-rw-r--r-- 1 1001 1001 453548 Jun 25 20:19 CHANGES.ru   #俄罗斯版上一文件
drwxr-xr-x 2 1001 1001    168 Jul 24 17:31 conf        #配置目录,nginx.conf为主配置文件,conf目录下的在编译好之后会到编译指定的目录中
-rwxr-xr-x 1 1001 1001   2502 Jun 25 20:19 configure
drwxr-xr-x 4 1001 1001     72 Jul 24 17:31 contrib     
drwxr-xr-x 2 1001 1001     40 Jul 24 17:31 html        #默认发布目录
-rw-r--r-- 1 1001 1001   1397 Jun 25 20:19 LICENSE
drwxr-xr-x 2 1001 1001     21 Jul 24 17:31 man
-rw-r--r-- 1 1001 1001     49 Jun 25 20:19 README
drwxr-xr-x 9 1001 1001     91 Jul 24 17:31 src         #源码目录  

在这里插入图片描述
(2)解压目录下修改两个文件

[root@server1 nginx-1.17.1]# vim auto/cc/gcc      #在该文件下关闭debug模式,否则会生成debug文件,导致nginx很大
[root@server1 nginx-1.17.1]# vim src/core/nginx.h    #在该文件下删掉显示版本号代码,否则在客户端请求时会看到版本号,不安全

在这里插入图片描述
在这里插入图片描述
(3)解压目录下进行编译

[root@server1 nginx-1.17.1]# ./configure --prefix=/usr/local/nginx --with-file-aio
./configure --prefix=/usr/local/nginx --with-file-aio
[root@server1 nginx-1.17.1]# make && make install

备注:(1)生成了两个文件 在解压目录下 makefile 是告诉怎么编译 怎么运行
objs中间文件 ngx_modulrs.c 编译生成了哪些模块
(2)make clean 清除编译的目录。第一次安装的时候才执行make install ,替换版本的时候不执行,因为会覆盖掉以前的nginx

在这里插入图片描述 在这里插入图片描述

切换到安装目录下,可以看到生成了四个目录
[root@server1 objs]# cd /usr/local/nginx
[root@server1 nginx]# ll
total 0
drwxr-xr-x 2 root root 333 Jul 24 17:52 conf         #conf为配置文件
drwxr-xr-x 2 root root  40 Jul 24 17:52 html         #html发布目录
drwxr-xr-x 2 root root   6 Jul 24 17:52 logs         #日志目录(access error pid 进程的pid)
drwxr-xr-x 2 root root  19 Jul 24 17:52 sbin         #主程序

##nginx启动的时候 会生成的错误日志error.log和连接(access.log,具体信息)日志

在这里插入图片描述

[root@server1 nginx]# ./sbin/nginx -v     #查看版本号,因为修改了配置所以看不到版本号
nginx version: nginx/
[root@server1 nginx]# ./sbin/nginx -V      #看到编译的具体信息
nginx version: nginx/
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-file-aio
[root@server1 nginx]# 

(4)添加nginx用户,修改主配置文件

[root@server1 sbin]# useradd -s /sbin/nologin nginx
[root@server1 sbin]# id nginx
uid=1000(nginx) gid=1000(nginx) groups=1000(nginx)
[root@server1 sbin]# cd ..
[root@server1 nginx]# cd conf
[root@server1 conf]# vim nginx.conf

在这里插入图片描述

在这里插入图片描述
(5)为使配置文件通过字体颜色可以判断语法错误,进行字体的设置

[root@server1 nginx-1.17.1]# ls
auto     CHANGES.ru  configure  html     Makefile  objs    src
CHANGES  conf        contrib    LICENSE  man       README
[root@server1 nginx-1.17.1]# cd contrib/
[root@server1 contrib]# ls
geo2nginx.pl  README  unicode2nginx  vim
[root@server1 contrib]# mkdir ~/.vim
[root@server1 contrib]# cp -r vim/* ~/.vim
[root@server1 contrib]# cd /usr/local/nginx/conf
[root@server1 conf]# vim nginx.conf
 此时打开配置文件nginx.conf后,字体颜色就改变了
可以根据字体颜色来判断配置的对错

在这里插入图片描述
(6)启动nginx

[root@server1 nginx]# ls
conf  html  logs  sbin
[root@server1 nginx]# cd sbin/
[root@server1 sbin]# ./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@server1 sbin]# ./nginx   #启动Nginx

备注:通过-t检查Nginx服务器配置文件是否有语法错误,可以与-c联用,使输出内容更详细,这对查找配置文件中的语法错误很有帮助,如果检查通过,将显示类似下面的信息: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

使用server2测试nginx主机是否正常访问,可以看到能够访问到其默认发布页面
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值