Nginx简单使用
一、简介
Nginx
是一款高性能的 http
服务器/反向代理服务器及电子邮件(IMAP/POP3)
代理服务器。由俄罗斯的程序设计师伊戈尔·西索夫(Igor Sysoev
)所开发,官方测试 nginx
能够支支撑 5
万并发链接,并且 cpu
、内存等资源消耗却非常低,运行非常稳定。
1.1、应用场景
1、http
服务器。Nginx
是一个 http
服务可以独立提供 http
服务。可以做网页静态服务器。
2、虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
3、反向代理,负载均衡最常用。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用 nginx
做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
二、下载与安装
2.1、下载
进入官网:http://nginx.org/
可以直接进入下载页面:http://nginx.org/en/download.html
Mainline version
:开发版,如果是正常服务器搭建环境,不建议使用此版本,毕竟是开发版,还存在一些漏洞;
Stable version:
稳定版,如果是在生产线上搭建环境,建议使用此版本;
Legacy versions:
以往老版本的稳定版,如果要使用老版本的,可以在此进行下载;
2.2、安装前准备
- 需要安装
gcc
的环境
yum install gcc-c++
-
PCRE
PCRE(Perl Compatible Regular Expressions)
是一个Perl
库,包括perl
兼容的正则表达式库。nginx
的http
模块使用pcre
来解析正则表达式,所以需要在linux
上安装pcre
库。
yum install -y pcre pcre-devel
注:pcre-devel
是使用 pcre
开发的一个二次开发库,nginx
也需要此库。
zlib
zlib
库提供了很多种压缩和解压缩的方式,nginx
使用 zlib
对 http
包的内容进行 gzip
,所以需要在 linux
上安装 zlib
库。
yum install -y zlib zlib-devel
OpenSSL
OpenSSL
是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL
协议,并提供丰富的应用程序供测试或其它目的使用。nginx
不仅支持 http
协议,还支持 https
(即在 ssl
协议上传输 http
),所以需要在 linux
安装 openssl
库。
yum install -y openssl openssl-devel
上面这四个一个一个的安装会很麻烦,可以执行下面这行命令,一次性就把上面的全部安装了。
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
这样就安装成功了。
2.3、安装
将nginx
上传到服务器,并解压到制定目录。
tar zxvf nginx-1.18.0.tar.gz -C /opt/nginx/
加压完成之后,进入 nginx-1.18.0
目录,执行以下命令。注意:这里可以根据自己的需求来更改,例如安装目录,日志目录这些。
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
configure参数
./configure
–prefix=/usr \ 指向安装目录
–sbin-path=/usr/sbin/nginx \ 指向(执行)程序文件(nginx)
–conf-path=/etc/nginx/nginx.conf \ 指向配置文件
–error-log-path=/var/log/nginx/error.log \ 指向log
–http-log-path=/var/log/nginx/access.log \ 指向http-log
–pid-path=/var/run/nginx/nginx.pid \ 指向pid
–lock-path=/var/lock/nginx.lock \ 安装文件锁定,防止安装文件被别人利用,或自己误操作
–user=nginx
–group=nginx
–with-http_ssl_module \ 启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)
–with-http_flv_module \ 启用ngx_http_flv_module支持(提供寻求内存使用基于时间的偏移量文件)
–with-http_stub_status_module \ 启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态)
–with-http_gzip_static_module \ 启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)
–http-client-body-temp-path=/var/tmp/nginx/client/ \ 设定http客户端请求临时文件路径
–http-proxy-temp-path=/var/tmp/nginx/proxy/ \ 设定http代理临时文件路径
–http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ 设定http fastcgi临时文件路径
–http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ 设定http uwsgi临时文件路径
–http-scgi-temp-path=/var/tmp/nginx/scgi \ 设定http scgi临时文件路径
–with-pcre 启用pcre库
在nginx-1.18.0
目录下自动创建了Makefile
文件,这是一个文件。
Makefile是一种配置文件, Makefile 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
- 编译
在当前目录直接执行这个命令就可以编译了,和安装redis
一样。
make
- 安装
make install
安装完成之后,到安装目录下面看一下是否有nginx
。我这里的安装目录是 /usr/local/nginx
,在上面指定的。
cd /usr/local/nginx
注意:http客户端请求临时文件需要手动创建。
mkdir -p /var/temp/nginx/client
2.4、启动、关闭和刷新配置
进入nginx
安装目录下的sbin
目录,这个目录中只有一个名叫nginx
的文件,直接执行这个文件即可。
cd /usr/local/nginx/sbin
- 启动
启动你会发现很快,相当于执行的不是启动文件,而是一个命令一样。默认端口是 80
端口,注意服务器上的 80
端口一定要开发才能够访问到。
./nginx
- 查看启动进程
ps aux|grep nginx
在浏览器访问服务器地址,端口号可以不用添加,默认是80端口。能够看到下面这个欢迎界面,就表示安装成功了。
- 关闭
./nginx -s stop
或者
./nginx -s quit
- 刷新配置
./nginx -s reload
- 重启
重启就先关闭在启动就行了。
三、静态网页部署
在nginx
安装目录下有一个html
的目录,直接将你的静态网页放到html
目录下。最初这个目录下默认有两个html
文件,可以直接删掉,放自己需要的静态网页。
注意:安装目录是你创建文件指定的那个,不是你编译的那个。
nginx
访问的时候会访问html
这个目录下面的index.html
这个页面,如果你这里面没有这个页面的,需要在配置文件中配置。具体怎么配置,在“端口绑定”那里会讲到。
重新启动nginx
就可以访问了,启动、关闭这些命令都是在nginx安装目录下的sbin目录中执行。
案例
我在html
目录下放入一个 index.html
页面,重新启动nginx
服务器,在页面输入服务器访问。
四、配置虚拟主机
虚拟主机,也叫“网站空间”,就是把一台运行在互联网上的物理服务器划分成多个“虚拟”服务器。虚拟主机技术极大的促进了网络技术的应用和普及。同时虚拟主机的租用服务也成了网络时代的一种新型经济形式。
4.1、端口绑定
上面的静态网页部署里面会存在一个问题,如果我们部署的并不止一个静态资源,而是很多个静态资源。那么将需要部署的静态资源上传到nginx
安装目录下,与html
目录同级。
在配置文件中配置,配置文件在nginx
安装目录下的conf
目录中有一个名为nginx.conf
的文件,这个就是nginx
的配置文件了。
上传两个静态网站到nginx
安装目录下,当我访问80
端口显示 html/index.html
这个页面,81
端口显示 html/business/business.html
,82
端口显示 html/heart/heart.html
这个页面。
修改Nginx
的配置文件:/usr/local/nginx/conf/nginx.conf
在原来的 server
下面添加一下配置。
server {
listen 81;
server_name localhost;
location / {
root business;
index business.html;
}
}
server {
listen 82;
server_name localhost;
location / {
root heart;
index heart.html;
}
}
listen 端口号
root
nginx
目录下的静态资源目录index 静态资源目录下访问的页面。
重新启动,就可以访问到了。注意:需要将指定的端口开放了。并且建议直接访问IP地址,如果IP绑定了域名,域名必须要备案。
4.2、域名绑定
域名绑定的目的就是避免输入端口号,因为在客户端输入端口号是一件不太方便的事情,我们就可以统一使用80
端口,配置不同域名来区分访问的资源。
修改Nginx
的配置文件:/usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.it307.top;
location / {
root business;
index business.html;
}
}
将
server_name
更改成域名
- 刷新一下配置
./nginx -s reload
这样配置域名不备案也能访问到
五、Nginx
反向代理与负载均衡
5.1、反向代理和正向代理
- 反向代理
反向代理(Reverse Proxy)
,Internet访问私有主机。反向代理方式是指以代理服务器来接受internet
上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet
上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
- 正向代理
正向代理一般就说代理,例如:一个公司只有一台机器可以连接Internet
,那么其他员工需要连接外网,怎么办呢?这时就可以将这台机器做个代理服务器,然后公司其他机器连接这台代理服务器,代理服务器有去连接外网。外网返回来的资源又经过代理服务器转发给员工机器上,所有的外网资源都会经经过代理服务器。是内部私有机器访问外网资源,这就是正向代理。而反向代理刚好相反,是外网资源访问内部私有服务器。哪些访问国外网站的软件也是这个思路,他的服务器可以连接外网,而我们的不能。那么就把他的服务器作为一个代理服务器,我们连接他的服务器,他再转发我们的请求,这样我们就可以访问到国外的东西。
- 反向代理配置
upstream mcp-portal {
server 106.54.136.81:8081; # 需要访问转发的地址
}
server {
listen 80;
server_name www.it307.top; # 访问的域名,域名一定要备案
location / {
proxy_pass http://mcp-portal;
}
}
upstream 名称,这个名称可以随便写, proxy_pass http:// 对应前面的这个名称。
- 负载均衡
upstream mcp-portal {
server 106.54.136.81:8081; # 需要访问转发的地址
server 106.54.136.81:8082;
server 106.54.136.81:8083;
server 106.54.136.81:8084;
}
server {
listen 80;
server_name www.it307.top; # 访问的域名,域名一定要备案
location / {
proxy_pass http://mcp-portal;
}
}
upstream mcp-portal { 这里可以写多个web地址},但是直接这样配置,第一次访问第一个而地址,第二次访问第二个地址,一直这样循环执行。
upstream mcp-portal {
server 106.54.136.81:8081; # 需要访问转发的地址
server 106.54.136.81:8082 weight=2;
}
server {
listen 80;
server_name www.it307.top; # 访问的域名,域名一定要备案
location / {
proxy_pass http://mcp-portal;
}
}
weight=2 访问量而
2
倍一般8081访问一次,8082访问2次,但不是说绝对这样。
六、高可用方案
nginx
作为负载均衡器,所有请求都到了 nginx,可见 nginx 处于非常重点的位置,如果nginx 服务器宕机后端 web 服务将无法提供服务,影响严重。
为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务 IP 并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务 IP 地址,这样的主服务器就开始再次提供负载均衡服务。
keepalived简介
keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
Keepalived 的作用是检测 web 服务器的状态,如果有一台 web 服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的 web 服务器从系统中剔除,当 web 服务器工作正常后 Keepalived 自动将 web 服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的 web 服务器。
keepalived 是以 VRRP 协议为实现基础的,VRRP 全称 Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将 N 台提供相同功能的
路由器组成一个路由器组,这个组里面有一个 master 和多个 backup,master 上面有一个对外提供服务的 vip(VIP = Virtual IPAddress,虚拟 IP 地址,该路由器所在局域网内其他机器的默认路由为该 vip),master 会发组播,当 backup 收不到 VRRP 包时就认为 master 宕掉了,这时就需要根据 VRRP 的优先级来选举一个 backup 当 master。这样的话就可以保证路由器的高可用了。
keepalived 主要有三个模块,分别是 core、check 和 VRRP。core 模块为 keepalived 的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check 负责健康检查,包括常见的各种检查方式。VRRP 模块是来实现 VRRP 协议的。
七、最容易出现的错误
错误一
nginx: [emerg] unexpected end of file, expecting "}" in /usr/local/nginx/conf/nginx.conf:139
这个说139
有个毛病,一般出现这种情况有可能是少大括号,或者分号这种情况。去检查,如果139
行啥都没有,那么很有可能是少写大括号了。如果139
行有配置文件,那么很有可能是没有分号。因为在配置文件的途中少大括号定位是不准确的,他需要编译到配置文件最底部才发现你少了一个大括号。而配置语句不一样,编辑到哪里就能定位到。
错误二
启动、关闭或者重启的时候会报一下错误。
nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
原因是nginx/logs
目录下没有 nginx.pid
这个文件,因为在 nginx.conf
配置文件中,默认不生成 logs/nginx.pid
文件的。我们第一次配置nginx
的时候,需要把 nginx.conf
配置文件中将 pid logs/nginx.pid;
打开注释,在启动nginx
就会在 logs
目录下生成 nginx.pid
这个文件。
如果我们已经启动nginx了,停也停不掉,也不能重启,一直报这个错。我们先将配置文件中这个注释去掉,然后指定配置文件操作。
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx 启动
nginx
(如果重启或者关闭也可以直接在这里写命令)-c /usr/local/nginx/conf/nginx.conf 指定配置文件
例如实现关闭操作:
/usr/local/nginx/sbin/nginx -s stop -c /usr/local/nginx/conf/nginx.conf
如果这样都不行,可以直接强制结束nginx进程,重新启动,或者重启服务器,重新启动nginx。
八、卸载nginx
使用命令查询包含nginx
的文件,然后在将这些文件删除,如果是docker的就不用删除了。
find / -name nginx
rm -rf /文件名