- 本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
前言
nginx
或多或少都听过,有些开发人员(例如:后端、运维)会经常与其接触,对于前端人员来说可能了解不是很多,本文便带你了解并入门nginx
。
什么是 nginx
- 百度百科 nginx
nginx
是一款 轻量级 的 Web 服务器/ 反向代理服务器及 电子邮件(IMAP/POP3
)代理服务器;nginx
可以作为一个HTTP
服务器进行网站的发布处理,另外nginx
可以作为反向代理进行负载均衡的实现。
特点
- 自由、开源、高性能、稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗。
下载安装
- 下载地址 nginx Download。
Windows
安装
- 找到下载的压缩文件并解压
- 启动
nginx
(1)双击nginx.exe
,双击后一个黑色的弹窗一闪而过 (2)打开cmd
命令窗口,并切换到nginx
解压目录下(例如:C:\Users\Admin\Downloads\nginx-1.20.1
),输入命令nginx.exe
或者start nginx
,回车即可。 - 检查
nginx
是否启动成功- 在浏览器地址栏输入网址
http://localhost:80
,回车,出现以下页面说明启动成功.
- 在浏览器地址栏输入网址
Mac
安装
- 使用
Brew
安装,安装 Brew。 - 检查是否已安装过
nginx
brew search nginx
- 没有则安装
brew install nginx
- 安装位置
/usr/local/etc/nginx/ // 配置文件
/usr/local/Cellar/nginx/ // 实际安装位置
Linux
安装
centOS
安装
作用
正向代理
- 一个位于客户端和原始服务器(
origin server
)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。 - 特点:
- 代理服务器和客户端处于同一个局域网内;
- 客户端明确要访问的服务器地址;
- 屏蔽或者隐藏了真实客户端信息。
- 作用:
- 访问原来无法访问的资源,如
Google
; - 可以做缓存,加速访问资源;
- 对客户端访问授权,上网进行认证;
- 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息。
- 访问原来无法访问的资源,如
反向代理
- 运行方式是代理服务器接受网络上的连接请求。它将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给网络上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
- 特点:
- 代理服务器和源站则处于同一个局域网内;
- 客户端是无感知代理的存在的,反向代理对外都是透明的;
- 隐藏了服务器的信息。
- 作用:
- 保证内网的安全,通常将反向代理作为公网访问地址,
Web
服务器是内网;; - 负载均衡,通过反向代理服务器来优化网站的负载。
- 保证内网的安全,通常将反向代理作为公网访问地址,
负载均衡
- 多在高并发情况下需要使用。其原理就是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,多台服务器(集群)完成工作任务,从而提高了数据的吞吐量。
- 负载均衡策略:轮询(默认)、加权(权重)、
ip_hash
、url_hash
(第三方)、fair
(第三方)
动静分离
nginx
提供的动静分离是指把动态请求和静态请求分离开,合适的服务器处理相应的请求,使整个服务器系统的性能、效率更高。nginx
可以根据配置对不同的请求做不同转发,这是动态分离的基础。静态请求对应的静态资源可以直接放在nginx
上做缓冲,更好的做法是放在相应的缓冲服务器上。动态请求由相应的后端服务器处理。- 基本代码示例:
server {
...
# 所有静态请求都由nginx处理,存放目录为html
location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
root e:\wwwroot;
}
# 所有动态请求都转发给 tomcat 处理
location ~ \.(jsp|do)$ {
proxy_pass http://test;
}
}
nginx
配置说明
文件结构
... # 全局块
events { # events块
...
}
http # http块
{
... # http全局块
server # server块
{
... # server全局块
location [PATTERN] # location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... # http全局块
}
- 全局块:配置影响
nginx
全局的指令。一般有运行nginx
服务器的用户组,nginx
进程pid
存放路径,日志存放路径,配置文件引入,允许生成worker process
数等。 events
块:配置影响nginx
服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。http
块:可以嵌套多个server
,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type
定义,日志自定义,是否使用sendfile
传输文件,连接超时时间,单连接请求数等。server
块:配置虚拟主机的相关参数,一个http
中可以有多个server
。location
块:配置请求的路由,以及各种页面的处理情况。
配置文件实例
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为 nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}
-
注意:
- 每个指令必须有分号结束(配置编写完成后,可使用
nginx -t
检查是否正确)。 $remote_addr
与$http_x_forwarded_for
用以记录客户端的ip
地址;$remote_user
用来记录客户端用户名称;$time_local
用来记录访问时间与时区;$request
用来记录请求的url与http协议;$status
用来记录请求状态(成功是200
);$body_bytes_s ent
记录发送给客户端文件主体内容大小;$http_referer
用来记录从那个页面链接访问过来的;$http_user_agent
记录客户端浏览器的相关信息。
- 每个指令必须有分号结束(配置编写完成后,可使用
-
惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。
nginx
常用命令
帮助
nginx -h
检查版本
nginx -v
检查配置文件是否有效
nginx -t
查看/停止进程
ps aux|grep nginx
sudo kill -9 [下图中的进程id(39349、...)]
启动
nginx
nginx -c /usr/local/etc/nginx/conf/nginx.conf // 启动指定配置文件
重启
nginx -s reload
停止服务
nginx -s stop // 暴力停止
nginx -s quit // 优雅停止
参考链接
结语
- 欢迎在评论区讨论,掘金官方将在掘力星计划活动结束后,在评论区抽送
100
份掘金周边,抽奖详情见活动文章。
往期精彩
- VS Code 提升开发效率、质量以及编码体验指南
- npm、yarn常用操作指南
- 金九前端面试总结!
- 从0搭建Vite + Vue3 + Element-Plus + Vue-Router + ESLint + husky + lint-staged
- 「前端进阶」JavaScript手写方法/使用技巧自查
- 公众号打开小程序最佳解决方案(Vue)
- Axios你可能不知道使用方式
「点赞、收藏和评论」
❤️关注+点赞收藏+评论+分享❤️,手留余香,谢谢🙏大家。