使用 Nginx 部署静态页面
Nginx 介绍
Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器, Nginx,它的发音为「engine X」,是一个高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/ POP3/ SMTP 代理服务器。Nginx 是由俄罗斯人 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor Sysoev 在建立的项目时,使用基于 BSD 许可。
英文主页:http://nginx.net 。
Nginx 作为 HTTP 服务器,有以下几项基本特性:
处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。
无缓存的反向代理加速,简单的负载均衡和容错。
FastCGI,简单的负载均衡和容错。
模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 Fast CGI 或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。
支持 SSL 和 TLSSNI。
即 Nginx 的优点:轻量、高性能、并发能力强。用来部署静态页面也是相当便捷。
这种高性能得益于 Nginx 的框架。在 Nginx 启动后,会有一个 master 进程和多个 worker 进程。master 进程主要用来管理 worker 进程,包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后 (异常情况下),会自动重新启动新的 worker 进程。而基本的网络事件,则是放在 worker 进程中来处理的。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。worker 进程的个数是可以设置的,一般我们会设置与机器 cpu 核数一致,这与 Nginx 的进程模型以及事件处理模型有关。
为何选用 Nginx?
说到 Nginx,可能第一反应就是「反向代理」和「负载均衡」了。那么什么是「反向代理」,什么又是「负载均衡」呢?
反向代理
首先了解一下什么是「前向代理」。代理 (Proxy) 也称网络代理,是一种特殊的网络服务,通俗来讲,就是在客户端和目标服务器之间的充当中间人,接收客户端的请求,再根据客户端请求向目标服务器发起相应的请求,从目标服务器获得指定资源后返回给客户端。且代理服务器可以对目标服务器的资源下载至本地缓存,如果客户端所要获取的资源在代理服务器的缓存之中,则代理服务器并不会再向目标服务器发起请求,而是直接返回缓存的资源。
其实代理服务器非常常见,就比如因为 GFW 而存在的一些科学上网的代理商,就是利用国外服务器作为代理服务器,从而正确解析域名来实现科学上网。代理服务器也可以实现隐藏真实 IP,比如著名的 Tor (洋葱路由器) 就是通过多重代理和一些加密技术来实现匿名交流。
而「反向代理」则是在服务器端作为代理使用,而不是客户端。也就是说,「前向代理」是代理内部网络用户访问 Internet 上服务器的连接请求,「反向代理」是以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时的代理服务器对外就表现为一个服务器。
负载均衡
反向代理负载均衡技术是把将来自 Internet 上的连接请求以反向代理的方式动态地转发给内部网络上的多台服务器进行处理,从而达到负载均衡的目的。
真巧,Nginx 都做到了
Nginx 作为一个优秀的代理服务器,反向代理和负载均衡必然是都具备的。想要更详细得了解这方面的知识和使用方法,可参见文末给出的参考资料:Nginx 入门指南。
Nginx 安装
本人使用的是腾讯云的服务器,版本为:Ubuntu Server 14.04.1 LTS 32 位。
$ apt-get install nginx
Mac OS 系统参考这篇文章:Installing Nginx in Mac OS X
Nginx 配置
简单地配置 Nginx 的配置文件,以便在启动 Nginx 时去启用这些配置。而本文的重点也是于此。
Nginx 的配置系统由一个主配置文件和其他一些辅助的配置文件构成。这些配置文件均是纯文本文件,一般地,我们只需要配置主配置文件就行了。例如在我的服务器上是在:/etc/nginx/nginx.conf 。
指令上下文
nginx.conf 中的配置信息,根据其逻辑上的意义,对它们进行了分类,也就是分成了多个作用域,或者称之为配置指令上下文。不同的作用域含有一个或者多个配置项。
其中每个配置项由配置指令和指令参数构成,形成一个键值对,# 后面地为注释,理解起来也非常容易。
一般配置文件的结构和通用配置如下:
user www-data; # 运行 nginx 的所属组和所有者
worker_processes 1; # 开启一个 nginx 工作进程,一般 CPU 几核就写几
pid /run/nginx.pid; # pid 路径
events {
worker_connections 768; # 一个进程能同时处理 768 个请求
# multi_accept on;
}
# 与提供 http 服务相关的配置参数,一般默认配置就可以,主要配置在于 http 上下文里的 server 上下文
http {
##
# Basic Settings
##
... 此处省略通用默认配置
##
# Logging Settings
##
... 此处省略通用默认配置
##
# Gzip Settings
##
... 此处省略通用默认配置
##
# nginx-naxsi config
##
... 此处省略通用默认配置
##
# nginx-passenger config
##
... 此处省略通用默认配置
##
# Virtual Host Configs
##
... 此处省略通用默认配置
# 此时,在此添加 server 上下文,开始配置一个域名,一个 server 配置段一般对应一个域名
server {
listen 80; # 监听本机所有 ip 上的 80 端口
server_name _; # 域名:www.example.com 这里 "_" 代表获取匹配所有
root /home/filename/; # 站点根目录
location / { # 可有多个 location 用于配置路由地址
try_files index.html =404;
}
}
# 邮箱的配置,因为用不到,所以把这个 mail 上下文给注释掉
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
这里需要注意的是 http 上下文里的 server 上下文。
server {
listen 80; # 监听本机所有 ip 上的 80 端口
server_name _; # 域名:www.example.com 这里 "_" 代表获取匹配所有
root /home/filename/; # 站点根目录
location / { # 可有多个 location 用于配置路由地址
try_files index.html =404;
}
}
这里的 root 字段最好写在 location 字段的外边,防止出现无法加载 css、js 的情况。因为 css、js 的加载并不是自动的,nginx 无法执行,需要额外的配置来返回资源,所以,对于静态页面的部署,这样做是最为方便的。
这里对 root 作进一步解释,例如在服务器上有 /home/zhihu/ 目录,其下有 index.html 文件和 css/ 以及 img/,root /home/zhihu/; 就将指定服务器加载资源时是在 /home/zhihu/ 下查找。
其次,location 后的匹配分多种,其各类匹配方式优先级也各不相同。这里列举一精确匹配例子:
server {
listen 80;
server_name _;
root /home/zhihu/;
location = /zhihu {
rewrite ^/.* / break;
try_files index.html =404;
}
}
此时,访问 www.example.com/zhihu 就会加载 zhihu.html 出来了。由于 location 的精确匹配,只有访问 www.example.com/zhihu 这个路由时才会正确响应,而且此时要通过 rewrite 正则匹配,把 /zhihu 解析替换成原来的 / 。关于更多 location 字段用法,可以在文章最后给出的参考资料中查看。
关于使用 nginx 部署静态页面,最简单便捷的配置方法
上面说了挺多关于配置的说明,下面推荐一种个人认为最为便捷的配置方法。(特此感谢 guyskk 学长的答疑解惑)
首先创建一个目录,例如: /home/ubuntu/website 然后在这个 website 文件夹下可以放置你需要部署的静态页面文件,例如 website 下我有 google、zhihu、fenghuang 这三个文件夹,其中 server 字段配置如下:
server {
listen 80;
server_name _;
root /home/ubuntu/website;
index index.html;
}
这里每个文件夹下面的静态页面文件名都是 index.html,我以前有个很不好的习惯,比如 zhihu 页面就喜欢命名为 zhihu.html,但就从前端来看,这也是不符合规范的。
更新:由于域名没有备案,之后也没有续费,所以下面所给的链接都失效了,但不影响配置的学习
这样配置的话,例如当你访问 www.showzeng.cn/google/ 时,nginx 就会去 website 目录下的 google 文件夹下寻找到 index.html 并把 google 页面返回,同理,访问 www.showzeng.cn/zhihu/ 时,会寻找到 zhihu 文件夹下的 index.html 并把 zhihu 页面返回。
而在 zhihu、google 、fenghuang 文件夹的同级目录上,再添加你的域名首页 index.html 时,访问 www.example.com 时就会返回了。
这里唯一美中不足的是,访问域名中 www.showzeng.cn/zhihu 末尾会自动加上 / ,在浏览器中按 F12 调试会发现 www.showzeng.cn/zhihu 为 301 状态码,因为 index.html 是在 zhihu/ 文件夹下,所以在搜索过程中会重定向到 www.showzeng.cn/zhihu/ ,起初我是接受不了的,那一 / 看起来太难受了,但是只要一想到要一个一个 location 字段去匹配,我一下子就接受了。不知道你怎么看,反正我是接受了。
Nginx 启动运行
$ sudo nginx -s reload
使用 reload 方法不用重启服务,直接重新加载配置文件,客户端感觉不到服务异常,实现平滑切换。当然你也可以重新启动 nginx 服务。
$ sudo service nginx restart
Nginx 停止运行
$ sudo nginx -s stop
参考资料
Nginx 入门指南
Nginx for Developers: An Introduction
Nginx for Developers: An Introduction (译文)
nginx 配置 location 总结及 rewrite 规则写法
使用 Nginx 部署静态页面的更多相关文章
- nginx部署静态页面
1.创建文件存放的目录: 2.vim nginx.conf 找到这个文件然后进入编辑模式 注:进入到文件后:点击a:可以编辑文件, server_name 127.0.0.1; 写上ip或 ...
- Nginx部署静态页面及引用图片有效访问的两种方式
nginx安装百度一下有很多,直接正题: 静态文件目录结构 file#文件位置 /home/service/file/ css js images html fonts 配置nginx.conf核心代 ...
- 在CentOS 上搭建nginx来部署静态页面网站
在centOs 上搭建nginx来部署静态页面网站 一.部署服务器环境 nginx:轻量级.高性能的HTTP及反向代理服务器,占用内存少,并发能力强,相比老牌的apache作为web服务器,性能更加卓 ...
- 使用Nginx部署静态网站
这篇文章将介绍如何利用Nginx部署静态网站. 之前写过2篇有关Nginx的文章,一篇是<利用nginx,腾讯云免费证书制作https>,另外一篇是<linux安装nginx> ...
- node部署静态页面;node上线静态页面
node部署静态页面上线 静态页面上线可以采用 nginx, tomcat或者node ,我们这里介绍下node部署静态页面 这里采用最简单的上线方式,我们就不用node + express + ej ...
- 腾讯云服务nginx部署静态项目
一直想要搭建自己的blog,买了基础云服务器练手 文章内容是根据腾讯文档(https://cloud.tencent.com/document/product/213/2131)总结 部署静态页面归纳 ...
- Nginx部署静态页
简答说一下如何用Nginx部署静态网页,并绑定域名访问 1.通过FTP上传静态页到服务器指定目录 2.编写nginx的.conf文件 3.重启nginx 如图,这是centos上传文件路径 nginx ...
- nginx 部署web页面问题
nginx 部署web页面的时候,路径都是对的,但是css文件就是不起作用,控制台提示如下,原来是格式的问题,截图如下: css 被转成了application/octet-stream,这个是ngi ...
- 【笔记】nginx部署静态网站
安装nginx 本地到官网下载,然后把压缩包传到服务器上 安装三个依赖 apt-get install libpcre3 libpcre3-dev apt-get install zlib1g-dev ...
随机推荐
- java启动RabbitMQ消息报异常解决办法
启动SpringCloud微服务,RabbitMQ报如下异常: 2019-08-12 18:15:49.543 ERROR 53096 --- [68.252.131:5672] o.s.a.r.c. ...
- Openshift 4.4 静态 IP 离线安装系列:准备离线资源
本系列文章描述了离线环境下以 UPI (User Provisioned Infrastructure) 模式安装 Openshift Container Platform (OCP) 4.4.5 的 ...
- 分布式数据库PolonDB 云端发力未来数据处理需求
企业数字化转型的不断深入,传统 IT 架构和数据库早已无法适应诸如物联网.新金融.新零售.新制造等行业对于数据高吞吐.灵活扩展等需求,企业对数据库有了更高的要求. 青云QingCloud 本次推出的 ...
- [原创][开源]SunnyUI.Net, C# .Net WinForm开源控件库、工具类库、扩展类库、多页面开发框架
SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...
- java第三阶段作业总结
Java第三阶段总结 前言 到这里,Java课程学习进入了尾声,在这学习过程中,我学习到很多,也发现了自己的很多不足,这篇博客主要针对的是Java整门课程学习的总结. 课程收获 对整门课程的学习,我有 ...
- @codeforces - 674G@ Choosing Ads
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定长度为 n 的序列,m 次询问以及参数 p.共有两类询问: ...
- LR字符串处理函数-lr_save_int
int lr_save_int(int value,const char * param_name); value:要分配给参数的整数值. param_name:参数的名称. lr_save_in ...
- Android学习笔记显示和隐藏ActionBar
要在应用中使用ActionBar 需要android:minSdkVersion:11以上,现在基本都可以用了 创建Android项目如果不做特殊设置默认都带有ActionBar 如果不想要Actio ...
- 【译】Announcing Entity Framework Core 5.0 Preview 5
今天我们宣布EF Core 5.0发布第五个预览版. 1 先决条件 EF Core 5.0 的预览版要求 .NET Standard 2.1.这意味着: EF Core 5.0 在 .NET Cor ...
- springboot mybatis plus多数据源轻松搞定 (上)
在开发中经常会遇到一个程序需要调用多个数据库的情况,总得来说分为下面的几种情况: 一个程序会调用不同结构的两个数据库. 读写分离,两个数据结构可能一样高,但是不同的操作针对不同的数据库. 混合情况,既 ...