Linux下Nginx的安装与使用
博客: www.lstar.icu
开源地址
Gitee 地址: https://gitee.com/lxwise/iris-blog_parent
Github 地址: https://github.com/lxwise/iris-blog_parent
序言
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
优势
Nginx 可以在大多数 Unix Linux OS 上编译运行,并有 Windows 移植版。 Nginx 的1.20.0稳定版已经于2021年4月20日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license。
Nginx 是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性:
- 在连接高并发的情况下,Nginx是Apache服务不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应。
- Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
- 处理静态文件,索引文件以及自动索引,打开文件描述符缓冲。
- 无缓存的反向代理加速,简单的负载均衡和容错。
- FastCGI,简单的负载均衡和容错。
- 模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCG或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。
- 支持 SSL 和 TLSSNI。
- Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。Nginx有自己的函数库,并且除了zlib、PCRE和OpenSSL之外,标准模块只使用系统C库函数。而且,如果不需要或者考虑到潜在的授权冲突,可以不使用这些第三方库。
- 代理服务器。作为邮件代理服务:Nginx 同时也是一个非常优秀的邮件代理服务(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
- Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
Nginx安装
下载
1. Nginx的发行版本
Nginx发行版本 | 介绍 |
---|---|
Nginx 开源版 | https://nginx.org/:赤裸裸的Web服务器、反向代理、负载均衡(功能少,开发难度大) |
Nginx Plus 商业版 | https://www.nginx.com/:什么都有全家桶(付费版本) |
OpenResty | https://openresty.org/cn/:是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。 |
Tengine | https://tengine.taobao.org/:淘宝二开的Nginx。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。 |
2. 下载nginx安装包
通过网页下载,上传到服务器
下载地址: https://nginx.org/en/download.html
直接通过wget下载
mkdir /opt/nginx
cd /opt/nginx
#下载nginx安装包
wget -c http://nginx.org/download/nginx-1.22.1.tar.gz
wget下载链接来自于官网的下载页面,点击下载,复制下载链接得来
注意:如果没有wget命令,需要先安装:(centos版本命令:)yum install -y wget
安装
1. 安装Nginx相关依赖
解压 nginx 源码包,进入源码包目录,执行预编译命令
nginx 的安装目录默认是 /usr/local/nginx
,--prefix
配置项缺省时默认就是该目录,但不建议省略该参数选项
#解压
tar -zxf nginx-1.22.1.tar.gz
#进入目录
cd nginx-1.22.1
#编译
./configure --prefix=/usr/local/nginx
当预编译出现以下报错时,表示没有 gcc 编译器,使用 yum 安装即可
nginx 是使用 c 语言编写的程序,因此想要运行 nginx 就需要安装一个编译工具。gcc 就是一个开源的编译器集合,用于处理各种各样的语言,其中就包含了 c 语言,运行以下命令安装即可:
- 安装gcc
yum install -y gcc
- 安装perl库
yum install -y pcre pcre-devel
- 安装zlib库
yum install -y zlib zlib-devel
2. 编译安装
#基本编译
./configure --prefix=/usr/local/nginx
#带模块编译
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --pid-path=/var/run/nginx.pid --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_v2_module --with-http_realip_module --with-stream --with-stream_ssl_module
# make命令的功能是编译内核或源码文件。
make
# 安装已经编译好的程序。复制文件树中到文件到指定的位置
make install
# 卸载已经编译好的程序。暂不执行
make uninstall
一些常用的模块,如
http_stub_status_module
、http_ssl_module
、http_gzip_static_module
、http_v2_module
、http_realip_module
以及stream
和stream_ssl_module
。这些模块已经足够支持大部分常见的功能需求,包括SSL、gzip、HTTP/2、真实IP处理等。但如果你有特定的需求,可以考虑添加以下模块:
http_geoip_module
或http_geoip2_module
:用于根据IP地址获取地理位置信息。http_auth_request_module
:支持子请求来实现复杂的认证机制。http_secure_link_module
:可以用于安全的文件下载链接。http_sub_module
:用于对响应内容进行文本替换。http_headers_more_module
(第三方模块):允许设置和清除HTTP请求/响应头。以下是关于编译安装的基础知识:
configure文件:这个文件是一个Shell脚本,用于检测系统环境、配置编译选项以及生成相应的Makefile文件。
Makefile文件是软件工程中的一种自动化构建工具文件,主要用于Unix-like操作系统(如Linux、BSD等)和一些集成开发环境(IDEs),用于管理和自动化编译、链接程序的过程。在Makefile中,开发者定义了一系列规则来指导make工具如何编译和链接源代码文件,以生成最终的目标文件(通常是可执行文件或库文件)。
Makefile的核心功能包括:
- 依赖关系:声明源代码文件之间的依赖关系,当某个源文件或其依赖的头文件发生变化时,仅重新编译受影响的部分而不是整个项目。
- 规则:定义如何从源文件生成目标文件的规则,包括编译器选项、编译命令、链接命令等。
- 自动化:通过比较文件的修改时间和目标文件的存在与否,make能自动判断哪些目标需要更新,并执行相应的命令。
- 目标:可以定义多种目标,如编译调试版、发布版,或者执行测试、清理等任务。
- 变量和函数:Makefile支持变量和函数,可以用来简化命令行参数和路径名的管理。
- 模式规则:允许定义通用的转换规则,适用于多个源文件到目标文件的转换情况。
在实际使用中,程序员通过编写Makefile来组织和控制整个项目的构建流程,只需简单地运行
make
命令,make工具就会读取Makefile文件,分析依赖关系,并执行必要的编译和链接步骤来生成最终的产品。
启动
进入到nginx安装目录下:
cd /usr/local/nginx/sbin
启动命令:
./nginx 启动
./nginx -s stop 快速停止
./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload 重新加载配置
查询nginx是否启动:
ps -ef | grep nginx
访问nginx页面:
在浏览器中输入 ip + 端口号访问(端口默认80)
这样就算安装成功了
如果浏览器访问不通,请检查是否开启防火墙限制,将防火墙关闭或将端口加入到防火墙白名单中,这里nginx的默认端口为80,如果是与服务器,还要去安全组开通对应的对口
关闭防火墙 :
#查看已放行的端口
firewall-cmd --list-all
#将80端口加入到防火墙放行白名单中,并重载防火墙
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
禁止防火墙开机启动
systemctl disable firewalld.service
安装成系统服务
#创建服务脚本
vi /usr/lib/systemd/system/nginx.service
服务脚本内容 :
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重新加载系统服务
systemctl daemon-reload
启动服务
systemctl start nginx.service
查看服务是否自启动
systemctl list-unit-files|grep nginx.service
- 如不是enabled可以运行如下命令设置自启动
systemctl enable nginx.service
- 如果希望不进行自启动,运行如下命令设置
systemctl disable nginx.service
Nginx简介
1.目录结构
进入Nginx的主目录我们可以看到这些文件夹
#进入nginx目录
cd /usr/local/nginx/
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件
client_body_temp fastcgi_temp proxy_temp scgi_temp
- conf
用来存放配置文件相关 - html
用来存放静态文件的默认目录 html、css等 - sbin
nginx的主程序 - logs
用来存放日志
2.运行原理
3.配置文件说明
#user nobody;#运行nginx的默认账号
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 1;
#事件区块开始
events {
#单个进程最大链接数(最大连接数=连接数*进程数)
#根据硬件调整,与前面工作进程配合起来用,尽量大,但别把CPU跑到100%就行,每个进程允许的最多连接数,理论上为每台nginx服务器的最大连接数
worker_connections 1024;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#include:导入外部文件mime.types,将所有types提取为文件,然后导入到nginx配置文件中。
include mime.types;
#默认文件类型
default_type application/octet-stream;
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设置为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载,注意:如果图片显示不正常把这个改成off
#sendfile指令指定,nginx是否调用sendfile函数(zero copy方式)来输出文件,对于普通应用,必须设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime
sendfile on;
#长连接超时事件,单位是秒
keepalive_timeout 65;
#第一个server区块开始,表示一个独立的虚拟主机站点
server {
#提供服务的端口,默认80
listen 80;
#提供服务的域名主机名
server_name localhost;
#对 “/” 启动反向代理,第一个location区块开始
location / {
root html; #服务默认启动目录,可以改成指定的目录位置
index index.html index.htm; #默认的首页文件,多个用空格分开
}
#错误页面路由
error_page 500 502 503 504 /50x.html; # 出现对应的http状态码是,使用50x.html回应客户
location = /50x.html { # location区块开始,访问50x.html
root html; # 指定对应的站点目录为html
}
}
}
4.nginx.conf分块理解
- **全局区域:**从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。必须上面的第一行配置
#允许的work process数
worker_processes 1;
# 引入其他配置文件,其他配置文件可以放在conf目录下的test文件夹下(没有自己创建一个)
include test/test.conf
这是Nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理也越多,但是会受硬件、软件的设备的制约。
- **events区域:**events块涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多worker_process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个work process可以同时支持的最大链接数等。
worker_connections 1024;
样例中就表示每个work process支持的最大连接数为1024,这部分的配置对Nginx的性能影响较大,在实际中应该灵活配置。
-
**http区域块:**这块是Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。这里http块包含:http全局块、server 块
-
**http全局块:**http全局块配置的指定包括文件引入、MIME-TYPE定义、日志自定义、连接超时事件、单链接请求数上限等。
-
server块:
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。每个server块也分为server全局块以及可以同时包含多个location块。
- 全局server块:最常见的配置就是本虚拟机主机的监听配置和本虚拟机的名称或IP配置。
- **location块:**一个server块可以配置多个location块。这块的主要作用就是基于nginx服务器接收到的请求字符串(例如:server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等共鞥,还有许多第三方模块的配置也可以在这里进行。
Nginx基本使用
拓展Nginx常用命令
# 强制停止nginx命令
./nginx -s stop
# 优雅停止nginx命令,等最后一次交互执行完毕再停止
./nginx -s quit
# 重启nginx命令
./nginx -s reload
# 检查nginx配置文件是否有问题 -c参数指定了要加载的Nginx配置文件路径
./nginx -t
./nginx -t -c /usr/local/nginx/conf/nginx.conf
# 查看nginx版本信息
./nginx -v
# 查看nginx详细版本信息,注意是大写V
./nginx -V
# 重新打开日志文件
./nginx -s reopen