1.Nginx介绍
官网:nginx.org
Nginx (“engine x”) 是一个开源的、支持高性能、高并发的WWW服务和代理服务软件。
它是由俄罗斯人IgorSysoev开发的,最初被应用在俄罗斯的大型网站www.rambler.ru上。
2.Nginx3大主要功能
1)网页服务:自身是静态Web服务,
还支持动态Web服务
PHP(fastcgi_pass)
JAVA(proxy_pass)
Python(uwsgi_pass)
==================================
memcache(memcache_pass)
......
2)负载均衡反向代理
haproxy,lvs,F5,netscaler
只支持http,现在tcp/udp。
3)缓存服务器
squid,varnish
3.特点
最大特点:静态小文件高并发,占用资源少。软件本身小。
企业面试时需要解答如下Nginx HTTP服务器的特色及优点:
1)支持高并发:能支持几万并发连接(特别是静态小文件业务环境)。
2)资源消耗少:在3万并发连接下,开启10个Nginx线程消耗不到200MB内存。
3)可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务
器健康检查功能,这相当于专业的haproxy软件或lvs的功能。
具备squid等专业缓存软件等的缓存功能。
4.Nginx主要应用场景:
1)静态Web服务器:
使用Nginx运行HTML、JS、CSS、小图片等静态数据(此功能类似lighttpd软件)。
2)配合运行动态Web服务器:
Nginx结合FastCGI运行PHP等动态程序(例如使用fastcgi_pass方式)。
Nginx结合proxy_pass支持Java动态程序(tomcat/resin服务)。Nginx结合uwsgi_pass支持Python。
3)反向代理/负载均衡
http负载均衡
4)做Web缓存服务器(把文件放入内存里)。
5.反向代理与负载均衡
(1)正向代理:由内向外。 代替 效率低
代替局域网内PC,请求外部应用服务。
(2)反向代理:由外向内 代替 效率低
代替外部的用户请求内部的应用服务器,也有负载均衡的功能,但不能混为一谈。
(3)负载均衡:转发、效率高
甩手掌柜。
6.为什么Nginx总体性能比Apache高?
(1)Nginx使用最新的epoll(Linux2.6内核)和kqueue(freebsd)异步网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid、Memcached软件都采用的是epoll模型。
(2)Apache则使用的是传统的select模型,Nginx使用高并发的epoll模型
(3)select模型:伙伴去宿舍找你,一个宿舍一个宿舍找。。效率低。
(4)epoll模型: 伙伴去宿舍找你,先问宿管大妈,看看在哪间宿舍,然后直奔具体宿舍。效率高。
7.软件安装方式
(1)rpm安装
优点:安装简单,速度快。
缺点:依赖多,解决依赖困难繁琐。
(2)yum安装
优点:简单快,自动解决依赖。
缺点:不能选择软件版本或软件存放路径。
(3)编译安装(源码编译)
缺点:安装速度慢,复杂,需要GCC编译器。
优点:可以自定义安装(版本、软件路径)
(4)将源码制作成rpm,然后放到yum仓库,实现yum自动安装。
缺点:一次性慢,复杂
优点:安装快,可以自定义安装(版本、软件路径)
(5)二进制安装
制作RPM YUM仓库搭建
https://blog.oldboyedu.com/autodeploy-rpm/
8. 安装Nginx
此处介绍两种安装方式
(1)YUM安装
yum安装又分为两种安装方式
1)epel源安装,安装版本低。
2)nginx官方源安装,版本高
(2)编译安装
8.1 YUM安装
(1)配置nginx官网源
1)配置nginx.repo文件
[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
2)yum安装nginx,并启动
[root@web01 ~]# yum -y install nginx
3)检查是否安装成功
[root@web01 ~]# rpm -qa nginx
nginx-1.18.0-1.el7.ngx.x86_64
4)启动nginx服务
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx
5)检查端口
[root@web01 ~]# netstat -lntup|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6825/nginx: master
6)浏览器访问测试
8.2 编译安装
(1)下载nginx的rpm包
[root@web01 ~]# mkdir -p /server/tools
[root@web01 ~]# cd /server/tools
[root@web01 /server/tools]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@web01 /server/tools]# ll -h
total 1016K
-rw-r--r-- 1 root root 1016K Apr 21 22:33 nginx-1.18.0.tar.gz
(2)安装依赖
1)安装Nginx所需的PCRE库
安装pcre库是为了使nginx支持具备URL重写功能的Rewrite模块(伪静态)。
[root@web01 /server/tools]# yum -y install pcre pcre-devel
2)安装openssl-devel
Nginx在使用https功能时要用到此模块,如果不装,安装nginx过程中,也会报错。
[root@web01 /server/tools]# yum -y install openssl openssl-devel
(3)编译安装步骤
[root@web01 /server/tools]# tar xf nginx-1.18.0.tar.gz
[root@web01 /server/tools]# cd nginx-1.18.0
[root@web01 /server/tools/nginx-1.18.0]# useradd -s /sbin/nologin www -M #创建nginx进程使用的用户(也就是nginx启动的时候,内部是由该用户启动的)
[root@web01 /server/tools/nginx-1.18.0]# id www
[root@web01 /server/tools/nginx-1.18.0]# rpm -qa gcc* #需要安装gcc编译器,,没装的一定要装
gcc-c++-4.8.5-36.el7.x86_64
gcc-gfortran-4.8.5-36.el7.x86_64
gcc-4.8.5-36.el7.x86_64
[root@web01 /server/tools/nginx-1.18.0]# ./configure --user=www --group=www --prefix=/application/nginx-1.18.0/ --with-http_stub_status_module --with-http_ssl_module --with-pcre #配置
#configure参数的作用
--prefix=PATH 路径
--user=USER 用户
--group=GROUP 组
--with-pcre 伪静态
--with-http_stub_status_module 状态
--with-http_ssl_module 加密 443
[root@web01 /server/tools/nginx-1.18.0]# make #编译,把源码编译成二进制
[root@web01 /server/tools/nginx-1.18.0]# make install #编译安装
[root@web01 /server/tools/nginx-1.18.0]# ln -s /application/nginx-1.18.0/ /application/nginx #生成软连接
[root@web01 /server/tools/nginx-1.18.0]# /application/nginx/sbin/nginx #启动
[root@web01 /server/tools/nginx-1.18.0]# netstat -lntup|grep nginx #查看启动情况
[root@web01 /server/tools/nginx-1.18.0]# curl -i localhost #查看返回状态码是否为200
9. Nginx目录结构说明
[root@web02 /application/nginx]# tree
.
├── conf
│ ├── fastcgi.conf #和动态服务的接口配置参数,配合php
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types #媒体类型
│ ├── mime.types.default
│ ├── nginx.conf #主配置文件
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default #和动态服务的接口配置参数
│ ├── uwsgi_params
│ ├── uwsgi_params.default #和动态服务的接口配置参数,配合Python
│ └── win-utf
├── fastcgi_temp
├── html #默认站点目录。
│ ├── 50x.html
│ └── index.html #默认的首页,10.0.0.8不指定文件,默认加载index.html首页。
├── logs
│ ├── access.log #访问日志
│ ├── error.log #Nginx错误日志。
│ └── nginx.pid #进程号对应文件。
├── sbin
│ └── nginx #启动命令。
10. Nginx启动疑难杂症汇总
10.1 启动Nginx报错:nginx: [emerg] getpwnam("nginx") failed。
这是因为没有对应的Nginx服务用户导致的,创建一个用户即可。
10.2 如何查看Nginx编译时的参数?
[root@web01 /server/tools/nginx-1.18.0]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/application/nginx-1.18.0/ --with-http_stub_status_module --with-http_ssl_module --with-pcre
10.3 浏览器、wget或者curl等软件访问不了Nginx页面。
此类问题的排查思路分为nginx服务端和客户端排查,服务端排查过程如下:
(1)首先关闭selinux
[root@web01 ~]# setenforce 0
[root@web01 ~]# vim /etc/selinux/config #把SELINUX=enforcing改成SELINUX=disabled
[root@web01 ~]# grep SELINUX=disabled /etc/selinux/config
(2)然后检查防火墙,如下:
[root@web01 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead) #表示没有开启
Docs: man:firewalld(1)
(3)检查端口和进程
[root@web01 ~]# netstat -lntup|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 9458/nginx: master
[root@web01 ~]# ps -ef | grep [n]ginx
root 9458 1 0 20:37 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx
www 9459 9458 0 20:37 ? 00:00:00 nginx: worker process
(4)在服务器本地wget http://192.168.1.51测试(如果前两步灭有通过,这步就不用进行了)
[root@web01 ~]# wget http://192.168.1.51
--2020-05-19 21:04:13-- http://192.168.1.51/
Connecting to 192.168.1.51:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 612 [text/html]
Saving to: ‘index.html.1’
100%[==================================================================================================================================================>] 612 --.-K/s in 0s
2020-05-19 21:04:13 (70.4 MB/s) - ‘index.html.1’ saved [612/612]
(5)查看nginx错误日志
[root@web01 ~]# cat /application/nginx/logs/error.log
客户端排查过程
(1)在客户端上telnet服务器端IP、端口
C:UsersAdministrator>ping 192.168.1.51
正在 Ping 192.168.1.51 具有 32 字节的数据:
来自 192.168.1.51 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.51 的回复: 字节=32 时间<1ms TTL=64 #通了,就可以排除物理链路问题
(2)在客户端telnet服务端I、端口等
[root@web01 ~]# telnet 192.168.1.51 80
Trying 192.168.1.51...
Connected to 192.168.1.51.
Escape character is '^]'. #这就表示端口开放了
(3)在客户端使用wget或curl命令检测
[root@web01 ~]# curl -I 192.168.1.51
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Tue, 19 May 2020 13:16:16 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 19 May 2020 12:36:58 GMT
Connection: keep-alive
ETag: "5ec3d2ea-264"
Accept-Ranges: bytes
10.4 部署一个web站点
[root@web01 /application/nginx/html]# cat index.html
<html>
<head>
<title>老男孩58期</title>
<meta charset="UTF-8">
</head>
<body bgcolor=green>
<br>
<div align=center>
<table border=1>
<tr>
<td>ID</td>
<td>NAME</td>
</tr>
<tr>
<td>001</td>
<td>项博</td>
</tr>
<tr>
<td>002</td>
<td>项伯</td>
</tr>
</table>
</div>
</body>
</html>
浏览器访问