资讯专栏INFORMATION COLUMN

Nginx(1)-创建一个静态 Web 站点

simpleapples / 764人阅读

摘要:的配置文件是以块形式组织,每个都是以一个块名称和一对大括号组成。这里注意的是,当打开的是首页依然是一个页面,只有中继续定义了查看静态网站文件系统目录中的某一目录时,才会将文件列出。使用此启动类型应同时指定,以便能够跟踪服务的主进程。

初识Nginx

Nginx 的三个主要应用场景:

静态资源服务:通过本地文件系统提供服务

反向代理服务:缓存加速与负载均衡

API服务:OpenResty

Nginx 背景和优点:

互联网的数据量快速增长、摩尔定律的性能提升以及低效的 Apache(一个连接对应一个进程)促使 Nginx 的出现。

Nginx 的优点

高并发、高性能:32核64G 内存可以处理数千万并发连接

可扩展性:得益于模块化设计

高可靠性:持续不间断运行数年

热部署:不停止服务情况下,升级 Nginx

BSD 许可证

Nginx 的组成

Nginx 二进制可执行文件:由各模块源码编译出的一个文件

Nginx.conf 配置文件:控制 nginx 的行为

access.log 访问日志:记录每一条 http 请求信息

error.log 错误日志:定位问题

Nginx 的版本发布

开源版本的 Nginx 中,奇数版本的 Nginx 如1.15.x 是 Mainline 主干版本,它会有新的功能,但可能并不稳定,偶数版本如1.14.x,是Stable 稳定版本。每个版本的 CHANGES 中,包含三部分:Feature新增功能、Bugfix 修复 bug、Change重构。

编译 Nginx

安装 Nginx 的方法主要用两种:编译 Nginx 或者直接安装二进制 nginx。二进制格式的 Nginx 中模块已经编译,但并不是每一个模块(功能)都开启(被编译),一些第三方模块,同样包含强大的功能就无法编译到二进制 Nginx 中。自主编译 nginx 可以根据自己的需求合理开启需要编译的模块。

下载 Nginx

下载你需要的 Nginx 版本,并解压缩。解压缩 Nginx 的源码包后,包含6个目录和5个文件

auto:有四个子目录,用于编译的 cc、lib库目录 lib、判断操作系统的 os、types 和19个文件用于辅助 configure判断当前系统支持哪些模块以及特性

conf:示例文件,安装成功后,会将此目录中的内容拷贝到安装目录

configure:执行编译前的必备动作,生成中间文件

contrib:提供两个 perl 脚本和一个vim 配置文件用于高亮显示 nginx 的配置文件,文件放置于~/.vim/中:cp -r contrib/vim/* ~/.vim/

html:提供两个标准 html 文件 index.html 和50X.html

src:源码目录

Configure

获取支持的的参数使用./configure --help,编译时支持的参数有三类:

指定 Nginx 各种文件的安装位置;

确定开启和关闭的模块。使用 with 开头的需要手动开启,使用 without 的默认会编译到 nginx 中,指定即可取消编译该模块;

指定 nginx 的安装过程中使用的特殊参数,如 c 编译器的路径等。

执行./configure --prefix=/usr/local/nginx检查系统环境是否符合满足安装要求,并将定义好的安装配置信息和系统环境信息写入Makefile文件中。 Makefile 文件包含了如何编译、启用哪些功能、安装路径等信息。

在预编译过程中,可以出现的错误大部分是因为软件包的缺失。编译 Nginx 需要依赖的软件包关系有:

yum install -y gcc gcc-c++ autoconf automake make /
yum install -y pcre pcre-devel /
yum install -y zlib zlib-devel

预编译后,会生成 objs 目录和 Makefile 文件

编译

执行make命令进行编译。make命令会根据Makefile文件进行编译。编译工作主要是调用编译器(如gcc)将源码编译为可执行文件,通常需要一些函数库才能产生一个完整的可执行文件。

编译生成的二进制文件存在于 src 目录中,如果使用了动态模块,编译产生的.so 文件,会存在于 objs 目录中。

安装

上面之所以没有使用 make && make install,是因为如果是升级 nginx,则需要将二进制文件拷贝到安装目录中。首次安装 nginx时,可以使用make install将编译的文件复制到指定目录中。

创建软链接:sudo ln -s /usr/nginx-1.14.2/sbin/nginx /usr/bin/nginx

Nginx 的配置文件

Nginx 的配置文件中,nginx.conf 为主配置文件,配置文件中,以#开始的行,或者是前面有若干空格或者 TAB 键,然后再跟#的行,都会被认为是注释。

Nginx 的配置文件是以 block(块)形式组织,每个 block 都是以一个块名称和一对大括号“{}”组成。block 分为几个层级,整个配置文件为 main 级别,即最大层级;在 main 级别之下会有 event、http、mail 等层级,而 http 中又会包含 server block,server block 中可以包含 location block。即块之间是可以嵌套的,内层 block 继承外层 block。最基本的配置项语法格式是“配置项名 配置项值1 配置项值2 配置项值3 ... ”;

每个层级可以有自己的指令(Directive),例如 worker_processes 是一个main层级指令,它指定 Nginx 服务的 Worker 进程数量。有的指令只能在一个层级中配置,如worker_processes 只能存在于 main 中,而有的指令可以存在于多个层级,在这种情况下,子 block 会继承 父 block 的配置,同时如果子block配置了与父block不同的指令,则会覆盖掉父 block 的配置。指令的格式是“指令名 参数1 参数2 … 参数N;”,注意参数间可用任意数量空格分隔,最后要加分号。

下图是 Nginx 配置文件的一般结构:

总结一下 Nginx 的配置语法:

配置文件由指令块和指令组成

每条指令以“;”结尾,指令与参数间以空格分隔

指令块以{}将多条指令组织在一起

include 语句允许组合多个配置文件以提升可维护性

使用“#”添加注释,以提高可读性

“$”使用变量

部分指令的参数支持正则表达式

Nginx 中时间参数的单位

时间单位 描述
ms milliseconds
s seconds
m minutes
h hours
d days
w weeks
M months(30 days)
y years(365 days)

Nginx 中空间参数的单位

空间单位 描述
不加任何单位 bytes
k/K Kilobytes
m/M Meagbytes
g/G Gigabytes

Nginx 服务运行时,需要加载几个核心模块和一个事件模块,这些模块运行时所支持的配置项称为基本配置;基本配置项大概分为四类:

用于调试、定位的配置项

正常运行的必备配置项

优化性能的配置项

事件类配置项

操作 Nginx 命令行
功能 命令行
一般格式 nginx -s reload
获取帮助 -?-h
使用指定的配置文件 -c
指定配置指令 -g
执行运行的目录 -p
发送信号 -s
立刻停止服务 stop
优雅停止服务 quit
重载配置文件 reload
重新开始记录日志文件 reopen
测试配置文件语法 -t -T
打印 nginx 的版本和编译信息 -v -v

这里需要说明的是:在修改配置文件后,使用nginx -s reload,在不停止服务的情况下,运行修改后的配置文件。

热部署 nginx(升级)

备份低版本的 nginx 二进制文件cp ngnx nginx.old

将编译好的新版本 nginx 二进制文件拷贝替换正在运行的 nginx 进程所使用的二进制文件

发送信号给旧 nginx master 进程,让其优雅关闭进程kill -WINCH [旧 ngix mater 进程号]。当前旧 nginx master还存在的原因是,如果新版本 nginx有问题,可以进行版本回退。

日志切割

将当前的日志文件复制到系统的另外一个位置

执行命令nginx -s reopen,nginx 会重新生成同名的日志文件

实际上日志切割会定期进行,应该使用 bash 脚本来实现,并有 crond 定时执行。

#!/bin/bash
#Rotate the Nginx logs to prevent a single logfile from consuming too much disk space.

LOGS_PATH=/usr/local/nginx/logs/history
CUR_LOGS_PATH=/usr/local/nginx/logs
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
mv ${CUR_LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
mv ${CUR_LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log
#向 Nginx 主进程发送 USR1 信号。USR1 信号试重新打开日志文件
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
使用 Nginx 搭建一个静态服务器

将静态网站部署在服务器中对外提供服务,在 nginx 安装目录中创建一个 dlib 目录用于存放静态网页

配置 nginx,修改配置文件中的 server 中的监听端口listen为80或8080,location 后面定义的"/"表示所有请求,指定 url的后缀与服务端文件系统路径一一对应,有两种用法,一种是使用 root,一种是使用 alias,如使用 alias dlib/就表示 url/后面的路径与 dlib/后面的路径是一一对应的。

节选配置文件:

user  simon;
...
http{
    gzip on;
    ...
    server{
        listen 8080;
        ...
        location / {
            alias dlib/;
        }
    }
}

优化:开启压缩

gzip  on; #开启 gzip 压缩
gzip_min_length 1; #压缩的最小单位,小于1字节不压缩
gzip_comp_level 2; #压缩级别
gzip_types text/plain application/x-javascript text/css application/xml text/javascript applicat
ion/x-httpd-php image/jpep image/gif image/png; #针对指定类型进行压缩

压缩前:

压缩后:

功能:将文件系统通过web 网页展示

通过 ngx_http_autoindex_module ,可以将以“/”结尾的 url 对应到相应文件系统目录中,并列出。在 location 块中加入“autoindex on;”即可开启。

这里注意的是,当打开的是首页依然是一个web 页面,只有 url 中继续定义了查看静态网站文件系统目录中的某一目录时,才会将文件列出。

优化:高并发时,限制大文件的传输速率

在 location 块中,设置“set $limit_rate 1k(http 模块的内置变量);”意思是限制 nginx 每秒传输1字节到浏览器中,

定义 nginx access 日志格式

定义日志格式需要命名,因为会根据不同的场景记录不同的日志信息,nginx 默认的日志记录名称为 main,记录了诸如客户端 IP、客户端名称、时间、状态码等。

定义日志,在 http 配置块下,使用 log_format,后面定义日志的名称,然后使用nginx 中指定的变量定义需要记录的日志格式。

定义日志存储位置,使用 access_log,定义 access_log的位置决定了记录日志的范围,也就是说,当在 server 配置块中定义了 access_log,那么发往server 指定的端口或者域名的请求,都会使用 access_log定义的级别和位置进行记录。

使用 goaccess 可以使日志可视化。

总结

如何编译、安装、升级 Nginx

部署一个静态网站常用的流程,以及 Nginx 的配置文件中相关指令的配置

参考

Nginx 配置文件

NGINX systemd service file

systemd 添加自定义系统服务

附录

预编译参数

mkdir -p /var/cache/nginx

./configure 
--prefix=/usr/local/nginx 
--sbin-path=/usr/sbin/nginx 
--conf-path=/etc/nginx/nginx.conf 
--error-log-path=/var/log/nginx/error.log 
--http-log-path=/var/log/nginx/access.log 
--pid-path=/var/run/nginx.pid 
--lock-path=/var/run/nginx.lock 
--http-client-body-temp-path=/var/cache/nginx/client_temp 
--http-proxy-temp-path=/var/cache/nginx/proxy_temp 
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 
--http-scgi-temp-path=/var/cache/nginx/scgi_temp 
--user=nobody 
--group=nobody 
--with-pcre 
--with-http_v2_module 
--with-http_ssl_module 
--with-http_realip_module 
--with-http_addition_module 
--with-http_sub_module 
--with-http_dav_module 
--with-http_flv_module 
--with-http_mp4_module 
--with-http_gunzip_module 
--with-http_gzip_static_module 
--with-http_random_index_module 
--with-http_secure_link_module 
--with-http_stub_status_module 
--with-http_auth_request_module 
--with-mail 
--with-mail_ssl_module 
--with-file-aio 
--with-ipv6 
--with-http_v2_module 
--with-threads 
--with-stream 
--with-stream_ssl_module

NGINX systemd service file

system 的有系统和用户的区分:系统(/lib/systemd/system/)、用户(/etc/lib/systemd/system/),一般系统管理员手工创建的单元文件建议存放在/etc/lib/systemd/system/目录下。

在/lib/systemd/system/目录下创建服务文件nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server #服务的简单描述
Documentation=http://nginx.org/en/docs/ #服务文档,可有可无
After=syslog.target network.target remote-fs.target nss-lookup.target
#定义启动顺序,After表示本服务在指定的服务之后启动,另外类似的还有 Before、Requires本单元启动,它需要的单元也会被启动;它需要的单元停止了,这个单元也停止了、wants推荐使用,这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,对本单元无影响。

[Service]
Type=forking 
#systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
PIDFile=/usr/nginx-1.14.2/logs/nginx.pid
ExecStartPre=/usr/bin/nginx -t
ExecStart=/usr/bin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40385.html

相关文章

  • 一键安装LNMP或LAMP Web环境实现Linux服务器部署 PHP MySQL Nginx/Ap

    摘要:目前,我们看到的老蒋采用的部署的环境,在镜像中配置,于是我们会称作为。有没有一件傻瓜式安装工具脚本呢这里老蒋要推荐的来自国内比较老牌且一直更新维护的一键安装包,我们可以较为直观且无人值守的安装需要的网站服务器环境。如今我们建站较多的还是会选择VPS云服务器,很少会去选择虚拟主机,固然前者有很多的优点。不过相比虚拟主机不同的是,VPS云服务器需要我们自己配置WEB环境,而且我们较多的还是会选择...

    IntMain 评论0 收藏0
  • 在 Ubuntu 14.04 服务器上部署 Hexo 博客

    摘要:本文将介绍如何在一台的云服务器上快速部署博客站点,如何快速发布一篇博文并通过云服务器上的私有仓库部署到服务器目录下。此外,还要在云服务器上安装和两个必备的软件包。在服务器上部署博客以下为文章正文。 推荐理由:Hexo 是用 Node.js 开发的一个静态站点生成器(Static Site Generator),支持 Markdown 语法写作,有着强大的插件系统,而且性能优异。下面我推...

    cyqian 评论0 收藏0
  • Cabloy-CMS:动静结合,解决Hexo痛点问题

    摘要:文章也不例外,只有提交进入正常状态,才会进行渲染。提交并预览首页文章页部署实例与子域名支持多实例,实例与网站子域名一一对应,不同实例的数据完全隔离。 介绍 Cabloy-CMS是什么 Cabloy-CMS是基于CabloyJS全栈业务开发框架开发的动静结合的CMS,可以快速构建企业网站、博客、社区、商城等Web应用。 在线演示 https://zhennann.com 特性 Cablo...

    alin 评论0 收藏0
  • 公司项目NODEJS实践0.1[ ubuntu,nodejs,nginx...]

    摘要:创建成功后进入文件夹执行执行作用创建文件,维护项目的依赖文件解释创建文件执行作用用系统的编辑器打开文件。我的技术新群上一篇前后端分离项目实践分析下一篇公司项目实践 一、前言 前端如何独立用nodeJs实现一个简单的注册、登录功能,是不是只用nodejs+sql就可以了?其实是可以实现,但离实际应用还有距离,那要怎么做才是实际可用的。 网上有很多nodeJs的示例,包括和 sql /...

    cppprimer 评论0 收藏0

发表评论

0条评论

simpleapples

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<