初探Nginx
最近,本人负责前后端分离的项目的管理。其中前端部署在Nginx服务器,对后端反向代理也使用它。发现Nginx对于我们开发人员来说非常关键,因此希望借助这次学习的机会,将记录学到的知识,当然其中还是有非常多前辈大佬们整理过的内容,先在此处向前辈大佬们致敬。
整片文章将从是什么,为什么用,怎么用的几个方面对Nginx进行分步描述,其中部分内容会在其他文章中体现,本文讲作为一个大纲。
初次写文章,如果有写的不对的地方,还望前辈、大佬,以及和我一样一起奋斗的同学们指正。
什么是Nginx
当我们遇见一个东西时,第一时间都会问这个是什么,当我了解Nginx的时候,我也会问这个是啥?
Nginx,可以读作(“engine X”),它是一个俄罗斯程序员伊戈尔·赛索耶夫开发,并于2004年发布的轻量级web服务器。目前被F5网络公司收购[1]。从它发布到今天为止,已经过去了18年。该服务器还活跃在各个公司生产部署的第一线,可见他的影响力。
Nginx是高性能的 HTTP 和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。在我们日常部署时,经常用该服务器进行前端代码部署,正向代理以及反向代理。这时候,我们将引出我们第一个扩展点,什么是正向代理和反向代理呢?
正向代理
正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端[2]。
上面是关于正向代理的概念,其实以我的角度来看,正向代理需要从客户端为视角,我并不知道我具体的安段服务,但是我知道代理服务器,我通过代理服务器获取数据,代理服务器从具体的目标服务器帮助我们获取数据,整个流程为正向代理。
例如我们租房子之前在各个平台上找房子一样,中介(代理服务器)通过他们的手段获取了房子的具体照片(后端服务器资源),展示给我们看。
反向代理
是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器[2]。
对于反向代理来说,我们的立场可就不一样了,我们需要以代理服务器的视角来看这个事情。
我们再次祭出我们租房子理论,当然这次我们要当中介了,他面对很多的房东,也可能只有一个。但是对于客户来说,虽然中介只有一个,但是他却代表了很多的房东。所以,客户只要访问中介就好了。
为什么使用Nginx
我们了解了什么是Nginx后,我们开始了解它的强大之处。在说他的强大之前,我们要了解一下它的竞品:
- Tengine: 阿里巴巴开源的基于Nginx的Web服务器。
- Apache HTTP Server: 全球网站广泛使用的Web服务器软件。
- Lighttpd: 一款开源Web 服务器软件。
- IIS: 全称Internet Information Services,由微软公司提供的基于运行Microsoft Windows的互联网基本服务。
- Cloudflare
在这么多优秀的竞品中,Nginx杀出一条血路。我们可以看下Netcraft 发布的2022年8月的web服务器报告占用率数据。
从图中可看到,Nginx占了30%的占有率,遥遥领先第二名的apache。到底是什么让它拥有这么高的占有率呢?所以我们来看看它的优点:
Nginx优点:
- 可并发、高可用
- BSD-like协议
- 可扩展性好
- 热部署
- 高可靠性
因为Nginx有这么多优点,他经常被用于提供IMAP/POP3/SMTP服务。对于开发人员来说,nginx被用来做生产的代理和负载均衡
怎么使用Nginx
在了解完what,why之后,我们需要了解how了。本节将说明nginx的基本使用。
下载及安装
我们可以直接从官网,找到自己对应的版本下载。windows下载后,里面直接就有可执行文件,如果你是linux或者mac之类的系统,你可以选择使用包管理工具进行安装,也可以通过官网地址下载,通过编译源码获取可执行文件。其中通过源码编译的形式获取可执行文件,你可以编译自己需要的模块。
在线安装(yum)
如果你是用yum进行包管理的,你可以使用以下命令安装依赖包以及nginx。
# 使用包管理工具安装以下几个依赖 CentOS,如果是mac请使用brew包管理工具
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
# 安装
yum install nginx
离线安装(yum)
如果是私有化部署,那就涉及到离线安装。如果服务器是CentOS或者RHEL,那么你可以去找rpm仓库 获取.rpm包,也可以通过下载不安装获取相关的安装包
# 离线下载,并不安装,他可以将与你系统还缺失的依赖全部下载下来
yum -y install nginx --downloadonly --downloaddir=/home/packages
# 到目标机器后进行安装
rpm -ivh *.rpm
通过编译安装
如果你是通过下载编译的方式,你就可以去官网的下载页面,下载安装包。
然后我们开始对压缩包进行解压,开始编译源码:
// 进入到nginx路径
cd /path/to/nginx/nginx-1.23.1/
// 在编译前,最好也要保证存在gcc zlib zlib-devel pcre-devel openssl openssl-devel这几个依赖。
// 运行configure,进行配置,这里配置可以选择配置自己希望的模块
./configure
// 进入src开始编译
make & make install
目录结构
在Mac电脑上使用brew安装nginx,这样可以简化了安装的流程,但是目录结构并不太一样,他的html路径、conf路径以及主程序的路径不在一起。我们先看主程序的路径(/usr/local/Cellar/nginx/1.21.3)
我们可以看到这里有bin,logs,share三个目录:
- ./bin: 我们的nginx可执行文件
- ./logs: 放的是默认配置的日志目录
- ./share
- ./html: html目录是一个链接,在其他系统中,它是一个目录,用于放置默认的根目录的“文件夹”
- ./doc: 我们的结构里没有,如果有,这个是存放nginx相关的文档
- ./contrib: 防止组件jar包
- ./conf: 默认防止nginx配置文件,在mac上,这个路径是在 /usr/local/etc/nginx
启动
启动nginx,我们直接运行即可
// 直接运行nginx可执行文件,默认的配置文件在nginx目录下的
./nginx
// 如果你的配置文件与nginx跟路径分离,那么你可以指定使用配置文件
./nginx -c /paht/to/nginx/config/nginx.conf
常用命令
在日常生活中,我们比较常用的命令有:
- ./nginx -h: 帮助
- ./nginx -v: 查看nginx版本
- ./nginx -s reload: 向主进程发送重载配置文件命令
- ./nginx -s quit: 向主进程发送从容关闭工作进程
- ./nginx -s shutdown: 关闭
- ./nginx -t -c /paht/to/nginx/config/nginx.conf: 验证配置文件的准确性
配置信息
在这一章,我们来show一下默认配置文件,可能你们打开conf下默认配置文件跟我的不太一样,但是他都有类似的结构。我们还是以我的这份配置进行介绍:
# 运行的用户
#user nobody;
# 工作进程数量,默认 = CPU数量,或者是CPU数量*2
worker_processes 1;
# error日志的目录以及输出到error.log的日志级别
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 指定nginx进程运行文件存放地址
#pid logs/nginx.pid;
# 用于影响nginx服务器与用户的网络连接,通过选取模型来影响连接
events {
# 最大默认连接数
worker_connections 1024;
}
# 用于控制Nginx的HTTP进程
http {
# 引入类型映射
include mime.types;
# 默认的请求类型
default_type application/octet-stream;
# 日志格式,我们可以让access.log使用这种目录格式。
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# access.log日志配置: 路径 日志格式
#access_log logs/access.log main;
# 是否允许sendfile方式传输文件,启动高效传输模块。
sendfile on;
#tcp_nopush on;
# 长连接超时时间
keepalive_timeout 65;
# 是否开启压缩
#gzip on;
# http的子模块,它用来定一个虚拟主机
server {
# 监听的端口
listen 8080;
# 虚拟主机的名字
server_name localhost;
# 编码格式
#charset koi8-r;
# 这个上面介绍过了,如果重复配置,以最相近的作为配置。
#access_log logs/host.access.log main;
# 访问规则配置
location / {
# 配置服务器的默认网站根目录位置
root html;
# 主页面
index index.html index.htm;
}
# 错误页面配置: 错误码 返回页面
#error_page 404 /404.html;
# 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
#
# php方式,作用其实跟上面差不多
#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;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# 引入其他的server配置。
include servers/*;
}
参考
- [1] 维基百科中国站-Nginx词条