前情提要:Linux系统安装软件方式

nginx安装

Nginx使用yum和编译安装两种方法,编译安装为一下介绍的方式(因为从企业实际来看,运维人员对于Nginx的使用还是倾向于编译安装)。对于使用yum安装Nginx也有两种方式,一种是采用epel源进行yum,缺点是其提供的Nginx软件版本往往要落后一些;另一种是直接采用Nginx官方源进行yum,特点是Nginx版本更新。

  • 编译安装Nginx

1.安装Nginx所需的PCRE库
PCRE(Perl Compatible Regular Expressions)意为“perl兼容正则表达式”,官方站点为http://www.pcre.org/,安装PCRE库是为了使Nginx支持具备URI重写功能的Rewrite模块,如果不安装PCRE库,则Nginx无法使用Rewrite模块功能,Nginx的Rewrite模块功能几乎是企业应用必须。
1)当前Linux系统环境情况
2)操作命令。采用yum安装方式安装PCRE),命令如下:

[root@nfs sersync]# yum install pcre pcre-devel -y

yum安装操作后检查安装结果:使用 rpm -qa
提示:yum安装的pcre版本有些低,不过一般情况不影响使用。

  • 安装Nginx

因此通常建议选择使用稳定版。当然,在实际工作中,选择稳定版本时,也尽量别用最新的稳定版,选择比已出来的最新版晚3~6个月的稳定版比较好。
Nginx的安装,具体的操作过程及屏幕输出如下:
1)检查及安装Nginx基础依赖包pcre-devel、openssl-devel。
要想正确安装Nginx,首先必须安装好pcre-devel、openssl-devel包,因此首先要检查这些Nginx基础依赖包是否安装,使用 rpm -qa 软件名 命令查询

[root@nfs sersync]# rpm -qa openssl-devel openssl
openssl-devel-1.0.2k-19.el7.x86_64
openssl-1.0.2k-19.el7.x86_64

提示:软件包名称中带有“ devel ”字符串的包是必须要安装的。
2)安装openssl-devel
Nginx在使用HTTPS功能的时候要用到此模块,如果不安装openssl相关包,安装Nginx的过程中也会报错。安装openssl-devel的命令及检查命令如下:

[root@nfs sersync]# yum install openssl openssl-devel -y

3)开始安装Nginx,操作命令及过程如下:
建立一个tools目录用于存放各种所需的软件,目录位置看需求

[root@wen01 nginx]# ll /home/oldboy/tools/
总用量 690508
-rw-r--r--   1 root  root     264634 6月   1 15:09 index.html
drwxrwxr-x  20 root  root       4096 6月   2 09:46 libiconv-1.16
-rw-r--r--   1 root  root    5166734 4月  27 2019 libiconv-1.16.tar.gz
-rw-r--r--   1 root  root  665389778 6月   1 15:25 mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz
drwxr-xr-x.  9 rsync rsync       204 9月  10 2020 nginx-1.19.2
-rw-r--r--.  1 root  root    1048727 9月  10 2020 nginx-1.19.2.tar.gz
drwxr-xr-x  17 nginx nginx      4096 6月   2 10:34 php-7.3.5
-rw-r--r--   1 root  root   19439026 5月   1 2019 php-7.3.5.tar.gz
-rw-r--r--   1 root  root   15750424 6月   3 08:53 wordpress-5.7.2.tar.gz

进入/home/oldboy/tools/ 使用wget命令下载nginx软件,可以自行下载后上传至服务器

[root@wen01 tools]# wget -q http://nginx.rog/download/nginx-1.16.0.tar.gz
[root@wen01 tools]# echo $?    #使用echo命令查看返回值,为0表示下载成功
0

提示:如果发现Nginx软件下载地址已不可用,表示可能版本已更新,可去官方地址http://www.nginx.org下载。
解压nginx压缩包

[root@wen01 tools]# tar xf nginx-1.19.2.tar.gz

添加nginx用户

[root@wen01 tools]# useradd nginx -u 1111 -s /sbin/nologin -M

编译安装nginx

[root@wen01 tools]# ./configure --user=nginx --group=nginx --prefix=/application/nginx-1.19.2/ --with-http_stub_status-module --with-http_ssl_module
#指定用户和用户组,指定路径,指定功能模块
[root@wen01 tools]# echo $?   #查看是否配置成功
[root@wen01 tools]# make     #编译
[root@wen01 tools]# make install #编译安装
[root@wen01 tools]# ln -s /app-lication/nginx-1.19.2 /application/nginx/
#设置软连接,将nginx的安装路径更改为/application/nginx/,方便运维人员使用,安装时指定的版本号路径是便于查看区分当前使用的nginx版本、方便后续升级。平常维护使用/application/nginx/,当nginx软件升级后,删除原来的软连接再重新设置新升级的版本号目录到/application/nginx的软连接即可。程序中如果有引用nginx路径的地方,不需要做修改,因为升级后的路径还是/application/nginx/。[root@wen01 tools]# ll /application/
总用量 0
drwxr-xr-x  6 root  root   56 6月   2 09:46 libiconv
lrwxrwxrwx  1 mysql mysql  26 6月   1 15:51 mysql -> /application/mysql-5.7.34/
drwxr-xr-x 10 mysql mysql 141 6月   1 16:01 mysql-5.7.34
lrwxrwxrwx  1 root  root   26 5月  25 11:49 nginx -> /app-lication/nginx-1.19.2
lrwxrwxrwx  1 root  root   22 6月   2 10:51 php -> /application/php7.3.5/
drwxr-xr-x  9 root  root   88 6月   2 10:50 php7.3.5

到此,Nginx的安装完成。
编译Nginx软件时,可以使用./configure --help查看相关参数帮助,下面是本次编译时指定的参数及简单说明:

提示:Nginx的大部分模块功能都会默认编译到软件中,不需要单独指定编译参数。

  • 启动并检查安装结果

1)启动前检查配置文件语法:

[root@wen01 tools]# /application/nginx/sbin/nginx -t
nginx: the configuration file /app-lication/nginx-1.19.2/conf/nginx.conf syntax is ok
nginx: configuration file /app-lication/nginx-1.19.2/conf/nginx.conf test is successful
[root@wen01 tools]# 

提示:在启动服务前检查语法,可防止因配置错误导致网站重启而重新加载配置对用户造成影响。
2)启动Nginx服务,命令如下:

[root@wen01 tools]# /application/nginx/sbin/nginx

注意:为了减少输入Nginx启动命令的路径,可以将路径加入到PATH环境变量里,步骤如下:

3)查看Nginx服务对应的端口是否成功启动,命令如下:

[root@wen01 tools]# netstat -luntp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6924/nginx: master
[root@wen01 tools]# 

centos7默认没有netstat命令,需要安装net-tools包后即可使用,或者使用ss,ps命令能查询到。
4)检查Nginx启动的实际效果。在Windows下通过浏览器检测的方式如下:
看到欢迎界面,即表示nginx已启动。在Linux下也可使用wget或curl命令检测。

  • Nginx启动的疑难杂症汇总

问题1:启动Nginx报错nginx: [emerg] getpwnam(“nginx”) failed。
解答:这是因为没有对应的Nginx服务用户所致,执行useradd nginx -u 1111-s/sbin/nologin -M创建Nginx用户即可。
问题2:如何查看Nginx编译时的参数?
解答:可采用如下命令查看:

[root@wen01 tools]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.19.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --prefix=/app-lication/nginx-1.19.2 --with-http_stub_status_module --with-http_ssl_module
[root@wen01 tools]# 

问题3:浏览器、wget或者curl等软件访问不了Nginx页面。
解答:此类问题的排查思路又分在Nginx服务端和客户端排查,服务端排查过程如下。
服务端:1、首先关闭selinux,
2、然后检查防火墙
3、再到服务器本地检查端口、进程和URL。其中,又分4步。
一是确认端口80是否存在,
二是查看是否有HTTP进程存在,
三是在服务器本地进行wget http://192.168.124.50测试。注意:如果第一步和第二步都不符合要求,那么就不用进行第三步骤了。直接进行步骤4即可。
四是查看Nginx的错误日志,确定是否有特殊异常。
注意:遇到问题时要在第一时间看屏幕返回的提示和Nginx服务的error.log,以获取有效信息解决问题。
客户端排查:排查网络

  • Nginx软件的功能模块说明

  • Nginx核心功能模块(Core functionality)
    Nginx核心功能模块负责Nginx的全局应用,主要对应主配置文件的Main区块和Events区块区域,这里有很多Nginx必需的全局参数配置。有关核心功能模块的详细信息官方地址为:http://nginx.org/en/docs/ngx_core_module.html。
  • 标准的HTTP功能模块集合
    这些标准的HTTP功能模块,虽然不是Nginx软件所必需的,但都是很常用的,因此绝大部分默认情况都会自动安装到Nginx软件中,见表。不建议擅自改动,保留软件的默认配置就好,除非你明确知道你在做什么,有什么额外影响。
    企业场景常用的Nginx HTTP功能模块汇总

    在生产环境中,配置、调整及优化Nginx软件,主要就是根据这些模块的功能修改相应的参数来实现的。通过官方地址http://nginx.org/en/docs/可以查看到上述及更多模块的详细使用帮助。
  • Nginx软件的目录结构说明

Nginx安装后整体的目录结构及文件功能。可通过执行tree /application/nginx/命令来查看,其内容如下:

  • Nginx主配置文件nginx.conf

Nginx主配置文件nginx.conf是一个纯文本类型的文件(其他配置文件大多也是如此),它位于Nginx安装目录下的conf目录,整个配置文件是以区块的形式组织的。一般,每个区块一一个大括号“{}”来表示,区块可以分为几个层次,整个配置文件中Main区位于最上层,在Main区下面可以有Events区、HTTP区等层级,在HTTP区中又包含有一个或多个Server区,每个Server区中又可有一个或多个Location区,整个Nginx配置文件nginx.conf的主体框架为:

  • Nginx其他的配置文件

如果是配合动态服务,Nginx软件还可能会用到扩展的FastCGI以及uwsgi等相关配置文件,这些配置是通过在nginx.conf主配置文件中嵌入include命令来实现的,不过默认情况是注释状态,不会生效。有关动态扩展配置后续学习到PHP等的服务在记录。
Nginx配合PHP动态服务相关配置文件为fastcgi.conf、fastcgi_params。
Nginx配合Python动态服务相关配置文件为uwsgi_params。

Nginx虚拟主机配置

  • 虚拟主机概念

1.虚拟主机概念所谓虚拟主机,在Web服务里就是一个独立的网站站点,这个站点既可以对应独立的域名(也可能是IP或端口),具有独立的程序及资源目录,又可以独立地对外提供服务供用户访问。
Nginx软件则使用一个Server{}标签来标示一个虚拟主机,一个Web服务里可以有多个虚拟主机标签对,即同时可以支持多个虚拟主机站点。
2.虚拟主机类型
常见的虚拟主机类型有如下几种:
(1)基于域名的虚拟主机,常用,通过不同的域名区分不同的虚拟主机
(2)基于端口的虚拟主机,内网常用,通过不同的端口来区分不同的虚拟主机,此类虚拟主机对应的企业应用主要为公司内部的网站,如一些不希望直接对外提供用户访问的网站后台等。访问基于端口的虚拟主机地址里要带有端口
(3)基于IP的虚拟主机,不常用,通过不同的IP区分不同的虚拟主机,一般不同业务需要使用多IP的场景都会在负载均衡器上进行VIP绑定,而不是在Web上通过绑定IP区分不同的虚拟机。

  • 基于域名的虚拟主机配置

1.配置基于域名的nginx.conf内容

[root@wen01 conf]# cat nginx.conf
worker_processes  1;
error_log logs/error.log;
events {worker_connections  1024;
}
http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       80;server_name  www.yeye.com yeye.com;location / {root   html/www;index  index.html index.htm;}access_log logs/access_www.log main buffer=32k flush=5s;}
}

2.创建域名对应的站点目录及文件
创建对应的域名站点目录及文件,如下创建了一个/application/nginx/html/www站点目录,对应于虚拟主机配置文件里root根目录的html/www设置(root html/www;)。然后生成一个默认的首页文件index.html,文件的内容自定义。

[root@wen01 nginx]# ll html/
总用量 12
-rw-r--r-- 1 root  root   494 5月  25 11:46 50x.html
drwxr-xr-x 2 root  root    24 5月  25 16:22 bbs
drwxr-xr-x 6 nginx nginx 4096 6月   4 10:04 blog
-rw-r--r-- 1 root  root   612 5月  25 11:46 index.html
drwxr-xr-x 2 root  root    24 6月   1 11:21 www

3.检查语法并重新加载Nginx
出现syntax is ok 和 successful 即表示无错误

[root@wen01 nginx]# /application/nginx/sbin/nginx -t
nginx: the configuration file /app-lication/nginx-1.19.2/conf/nginx.conf syntax is ok
nginx: configuration file /app-lication/nginx-1.19.2/conf/nginx.conf test is successful
[root@wen01 nginx]#

然后平滑重启Nginx,即重新加载配置文件。

[root@wen01 nginx]# /application/nginx/sbin/nginx -s reload

再检查Nginx重新加载后的情况,如进程和端口是否OK。操作后快速检查在工作场景十分重要。最后测试域名站点配置的访问结果。
由于没有配置dns服务器,则需要配置hosts文件有于域名解析。
提示:不管是Windows还是Linux,只要用域名访问,就要在访问的客户端做hosts解析
4.配置多个基于域名的虚拟主机
(1)增加新域名对应的配置
前面已经增加了一个www.yeye.com虚拟主机的配置,下面再增加两个虚拟主机的配置,站点域名分别为bbs.etiantian.org和blog.etiantian.org。增加的配置一定要在nginx.conf的HTTP{}区块内,最好放在www.etiantian.org虚拟主机配置的下面,增加的内容如下

在整体格式上,新增域名虚拟主机的配置和前文配置过的www.etiantian.org域名的虚拟主机是一样的,区别就是server_name和root参数的配置不同。

(2)创建新虚拟主机站点对应的目录和文件
创建上述两个新增域名分别对应的站点目录及文件,并创建各自的index.heml文件

[root@wen01 nginx]# ll html/
总用量 12
-rw-r--r-- 1 root  root   494 5月  25 11:46 50x.html
drwxr-xr-x 2 root  root    24 5月  25 16:22 bbs
drwxr-xr-x 6 nginx nginx 4096 6月   4 10:04 blog
-rw-r--r-- 1 root  root   612 5月  25 11:46 index.html
drwxr-xr-x 2 root  root    24 6月   1 11:21 www
[root@wen01 nginx]# 

也可以使用Shell脚本,还可以执行检查结果,如下:

(3)重新加载Nginx配置
同上,每次更改Nginx的配置都需要管理员重新加载,使配置生效,这是因为Nginx在启动时已把所有配置信息都加载到内存中了,若更改了磁盘上的nginx.conf配置文件,需要把新配置重新加载到内存中生效。这样设计的目的是可以大幅度提升Nginx服务访问性能。检查语法及重新加载配置的命令同上。
(4)在客户端测试
记得要配置hosts文件

  • 基于端口的虚拟主机配置

1.配置虚拟主机监听的端口
如果要配置基于端口的虚拟主机,就需要每个虚拟主机配置有不同的端口。这里采用上述基于域名的3个虚拟主机配置为例讲解,编辑nginx.conf主配置文件,然后把每个虚拟主机的“ listen80; ”的配置行的80数字端口部分分别修改修改掉,内容见下文,注意server_name域名位置可以不做任何变更,哪怕是相同域名也可以,因为,基于端口的虚拟主机就是通过端口来唯一区别不同的虚拟主机的,只要端口不同就是不同的虚拟主机。
2.修改虚拟主机配置
把每个虚拟主机的“ listen80; ”的配置行的80数字端口部分分别修改修改掉
3.检查语法重新加载配置生效
同上
4.测试不同端口的访问结果
URL地址需要在后面添加端口,浏览到的内容如果和URL地址栏里的域名部分一样,就表示配置正确了。

  • 基于IP的虚拟主机配置

1.在服务器网卡上增加多个IP
既然要配置基于IP的虚拟主机,就需要让每个虚拟主机有不同的IP地址,此处以增加辅助IP的形式临时在eth0网卡上增加2个不同的IP,实际工作环境中可能为多个网卡,或虚拟化软件的多个虚拟网卡。

2.增加虚拟主机配置
基于IP的虚拟主机实际配置,要使其基于IP,即每个虚拟主机的server_name字段都换成对应的IP地址。重新加载Nginx服务使得修改的配置生效。
提示:基于IP的虚拟主机配置在生产中不常使用,如果需要不同的IP对应不同的服务则在网站前端的负载均衡器上配置。
3.客户端测试

Nginx配置虚拟主机的步骤小结

Nginx配置虚拟主机步骤如下(适合各类虚拟主机类型):
1)增加一个完整的Server标签段到结尾处。注意,要放在HTTP的结束大括号前,也就是将Server标签段放入HTTP标签。
2)更改server_name及对应网页的root根目录,如果需要其他参数,可以增加或修改。
3)创建server_name域名对应网页的根目录,并且建立测试文件,如果没有index首页,访问会出现403错误。
4)检查Nginx配置文件语法,平滑重启Nginx服务,快速检查启动结果。
5)在客户端对server_name处配置的域名做host解析或DNS配置,并检查(ping域名看返回的IP对不对)。
6)在Win32浏览器中输入地址访问,或者在Linux客户端做hosts解析,用wget或curl接地址访问。

企业场景中重启Nginx后的检测策略

重启Nginx服务后,检查启动是否正常的脚本,可以把它包含在Nginx启动脚本(需要另行开发)内部的start等启动位置。

#! /bin/bash
#--------function split------
. /etc/init.d/functions
function checkURL()
{checkUrl=$1echo 'check url start ...'judge=($(curl -I -s --connect-timeout 2 ${checkUrl}|head -1|tr " " "\n"))if [[ "${judge[1]}" == '200' && "${judge[2]}" ]]thenaction "${checkUrl}" /bin/trueelseaction "${checkUrl}" /bin/falseecho -n "retrying again..."; sleep 3;judgeagain=($(curl -I -s  --connect-timeout 2 ${checkUrl}|head -1|tr " " "\n"))if [[ "${judge[1]}" == '200' && "${judge[2]}" == 'OK' ]]thenaction "${checkUrl}" /bin/tureelseaction "${checkUrl}" /bin/falsefifisleep 1;
}
#usage method
checkURL http://blog.yeye.net

检测方法可以是端口、URI、响应header等,具体将根据业务需求进行选择。

Nginx常用功能配置

  • 规范优化Nginx配置文件

Nginx的主配置文件为nginx.conf,主配置文件包含的所有虚拟主机的子配置文件会统一放入extra目录中,虚拟主机的配置文件按照网站的域名或功能取名,如www.conf、bbs.conf、03_blog.conf等。当然,如果虚拟主机的数量不是很多,也可以把多个虚拟主机配置成一个单独的配置文件,仅仅和Nginx的主配置文件nginx.conf分离开即可。
这里使用的参数是include,下面先看看它的语法:

它可以放置Nginx配置中任何位置。用法示例如下:

[root@wen01 nginx]# cat conf/nginx.conf
worker_processes  1;
error_log logs/error.log;
events {worker_connections  1024;
}
http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;include extra/01_www.conf;include extra/02_bbs.conf;include extra/03_status.conf;include extra/04_blog.conf;
}

优化Nginx配置实战的具体实施步骤如下:
在/application/nginx/conf下创建extra目录

[root@wen01 nginx]# ll conf/
总用量 76
drwxr-xr-x 2 root root  110 6月   4 20:40 extra

把nginx.conf配置文件中的server标签部分写入到extra目录中相应的配置文件,如01_www.conf,其余虚拟主机操作一样。删除主配置文件nginx.conf中所有虚拟主机的配置(包含Server{}标签)

[root@wen01 nginx]# tree conf/extra/
conf/extra/
├── 01_www.conf
├── 01_www.conf.ori2
├── 02_bbs.conf
├── 03_status.conf
└── 04_blog.conf0 directories, 5 files
[root@wen01 nginx]# cat conf/extra/01_www.conf
server {listen       80;server_name  www.yeye.com yeye.com;location / {root   html/www;index  index.html index.htm;}access_log logs/access_www.log main buffer=32k flush=5s;
}

删除虚拟主机后,把多个虚拟主机独立配置文件01_www.conf、02_bbs.conf、04_blog.conf信息包含到nginx.conf里,这样就把主配置和各个虚拟主机配置分离了,具体包含的配置内容为:

[root@wen01 nginx]# cat conf/nginx.conf
worker_processes  1;
error_log logs/error.log;
events {worker_connections  1024;
}
http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;include extra/01_www.conf;include extra/02_bbs.conf;include extra/03_status.conf;include extra/04_blog.conf;
}

也可以用*直接包含所有配置,如下:
3)重新加载配置,并测试更改后的结果。命令如下:

[root@wen01 nginx]# /application/nginx/sbin/nginx -t
nginx: the configuration file /app-lication/nginx-1.19.2/conf/nginx.conf syntax is ok
nginx: configuration file /app-lication/nginx-1.19.2/conf/nginx.conf test is successful
[root@wen01 nginx]# /application/nginx/sbin/nginx -s reload

通过使用在主配置文件中添加include包含的配置,可以让Nginx的配置更加简单、清晰、规范。

如果需要新增虚拟主机站点,可以按照上述的配置步骤在extra下创建新的虚拟主机文件,然后在主配置文件nginx.conf中使用 include 包含在extra下创建新的虚拟主机文件。

如果虚拟主机数量过多,也可以按业务分类,如几个同业务的虚拟主机配置放到一个文件里,这样不至于因虚拟主机太多而导致文件过于零碎,一切都可以灵活地调整,运维思想很关键,机器是死的,人是活的,要学会多变通才好。

如果想以后部经常改动nginx.conf配置,可以用includeextra/*.conf;来包含,然后,把每个主机的配置按文件名用数字排好序,这样在新增虚拟主机时就可以不用修改nginx.conf配置了。

  • Nginx虚拟主机的别名配置

1.虚拟主机别名介绍及配置
所谓虚拟主机别名,就是为虚拟主机设置除了主域名以外的一个或多个域名名字,这样能实现用户访问的多个域名对应同一个虚拟主机网站的功能。

虚拟主机别名的配置前后对比

配置仅在server_name所在行的行尾增加了etiantian.org内容,重新加载配置并测试访问结果(本地域名解析hosts文件需要在配置一下)。

  • Nginx状态信息功能实战

1.Nginx status介绍
Nginx软件的功能模块中有一个ngx_http_stub_status_module模块,这个模块的主要功能是记录Nginx的基本访问状态信息,让使用者了解Nginx的工作状态,如连接数等信息。要想使用状态模块,在编译Nginx时必须增加http_stub_status_module支持


可通过如下方法检查编译安装Nginx时是否设定支持上述模块:

[root@wen01 nginx]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.19.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --prefix=/app-lication/nginx-1.19.2 --with-http_stub_status_module --with-http_ssl_module
[root@wen01 nginx]# 

2.配置Nginx status
具体配置过程如下:
1)生成状态配置,并增加状态配置参数。操作命令如下:

[root@wen01 nginx]# cat conf/extra/03_status.conf
server {listen       80;server_name  status.yeye.com;location / {stub_status on;access_log off;}
}

2)将配置文件03_status.conf包含到nginx.conf主配置文件中

[root@wen01 nginx]# cat conf/nginx.conf
worker_processes  1;
error_log logs/error.log;
events {worker_connections  1024;
}
http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;include extra/01_www.conf;include extra/02_bbs.conf;include extra/03_status.conf;      #这里include extra/04_blog.conf;
}

3)检查语法,并重启服务。命令如下:

[root@wen01 nginx]# /application/nginx/sbin/nginx -t
nginx: the configuration file /app-lication/nginx-1.19.2/conf/nginx.conf syntax is ok
nginx: configuration file /app-lication/nginx-1.19.2/conf/nginx.conf test is successful
[root@wen01 nginx]# /application/nginx/sbin/nginx -s reload

3)配置hosts解析(Windows客户端),并测试结果。

也可以用Location的方式实现状态信息配置,如在任意一个虚拟主机里,为Server标签增加如下配置:

3. Nginx status显示结果详解

Active connections: 2   这里表示nginx正在处理的活动连接数 2 个
server accepts handled requests311 311 930
Reading: 0 Writing: 1 Waiting: 1

其中:❑ Server表示Nginx启动到现在共处理了311个连接。
❑ accepts表示Nginx启动到现在共成功创建311次握手。请求丢失数=(握手数-连接数),可以看出,本次状态显示没有丢失请求。
❑ 第三个handled requests,表示总共处理了930次请求。
❑ Reading为Nginx读取到客户端的Header信息数。
❑ Writing为Nginx返回给客户端的Header信息数。
❑ Waiting为Nginx已经处理完正在等候下一次请求指令的驻留连接。在开启keep-alive的情况下,这个值等于active - (reading+ writing)。
提示:为了安全起见,这个状态信息要防止外部用户查看。

  • 为Nginx增加错误日志(error_log)配置

Nginx软件会把自身运行的故障信息及用户访问的日志信息记录到指定的日志文件里。

1.Nginx错误日志信息介绍

配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(ngx_core_module)的参数,该参数名字为error_log,可以放在Main区块中全局配置,也可以放置不同的虚拟主机中单独记录虚拟主机的错误信息。

error_log的语法格式及参数语法说明如下:


其中,关键字error_log不能改变,日志文件可以指定任意存放日志的目录,错误日志级别常见的有[debug |info |notice |warn |error |crit|alert |emerg],级别越高记录的信息越少,生产场景一般是warn|error |crit这三个级别之一,注意不要配置info等较低级别,会带来巨大磁盘I/O消耗。

error_log的默认值为:

可以放置的标签段为:

2. Nginx错误日志配置
编辑主配置文件nginx.conf,增加错误日志的配置方法如下:

[root@wen01 nginx]# cat conf/nginx.conf
worker_processes  1;
error_log logs/error.log;     <==在这里,新增这一行,在主配置中增加,所有虚拟主机生效。
events {worker_connections  1024;
}
http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;include extra/01_www.conf;include extra/02_bbs.conf;include extra/03_status.conf;include extra/04_blog.conf;
}

Nginx访问日志

Nginx软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户浏览行为等,此功能由ngx_http_log_module模块负责。

  • 访问日志参数

Nginx的访问日志主要由表中的两个参数控制。

Nginx日志格式中默认的参数配置如下:

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';

Nginx记录日志的默认参数配置如下:

  • 访问日志配置说明

1.日志格式定义说明

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';

其中,log_format为日志格式关键参数,不能变。main是为日志格式指定的标签,记录日志时通过这个main标签选择指定的格式。其后所接的所有内容都是可以记录的日志的信息。注意,所有的日志段以空格分隔,一行可以记录多个,不同列的意义在下表中进行了说明。

Nginx日志变量说明

在没有特殊要求的情况下,采用默认的配置即可,更多可以设置的记录日志信息的变量见:可参看官网文档

2.记录日志的access_log参数说明

buffer=size为存放访问日志的缓冲区大小,flush=time为将缓冲区的日志刷到磁盘的时间,gzip[=level]表示压缩级别,[if=condition]表示其他条件,一般的场景,这些参数都无需配置,极端优化才可能会考虑这些参数。

access_log off中的off,表示不记录访问日志。

默认配置:access_log logs/access.log combined;放置位置:HTTP、Server、Location、if in location、limit_except。

  • 配置访问日志实战

编辑主配置文件nginx.conf,配置日志的格式如下:

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';

然后配置在每个虚拟主机里使用上述格式记录用户访问日志,以www.yeye.com站点为例:

[root@wen01 nginx]# cat conf/extra/01_www.conf
server {listen       80;server_name  www1.yeye.com yeye.com;location / {root   html/www;index  index.html index.htm;}access_log logs/access_www.log main buffer=32k flush=5s;
}

如果不指定日志格式就会用默认的combined格式记录日志。

接下来,要检查语法,重新加载配置:同上

下面用浏览器模拟用户访问生成日志,在服务器上查看日志结果:

[root@wen01 nginx]# tail logs/access_www.log
192.168.124.10 - - [02/Jun/2021:11:26:46 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36" "-"
192.168.124.10 - - [02/Jun/2021:11:26:46 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "http://www.yeye.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36" "-"
192.168.124.45 - - [02/Jun/2021:11:31:24 +0800] "GET /test_info.php HTTP/1.1" 404 153 "-" "curl/7.29.0" "-"
192.168.124.45 - - [02/Jun/2021:11:31:29 +0800] "GET /test_info.php HTTP/1.1" 404 153 "-" "curl/7.29.0" "-"
192.168.3.3 - - [04/Jun/2021:20:26:02 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36" "-"
192.168.3.3 - - [04/Jun/2021:20:26:03 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "http://blog.yeye.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36" "-"
192.168.3.3 - - [04/Jun/2021:20:29:05 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36" "-"
192.168.3.3 - - [04/Jun/2021:20:29:07 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36" "-"
192.168.3.99 - - [04/Jun/2021:22:39:13 +0800] "GET / HTTP/1.1" 200 18 "-" "curl/7.29.0" "-"
192.168.3.99 - - [04/Jun/2021:22:39:18 +0800] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"
对应说明:
❑ $remote_addr对应的真实日志里的10.0.0.100,即客户端的IP。
❑ $remote_user对应的是第二个中杠“-”,没有远程用户,所以用“-”填充。
❑ [$time_local]对应的是[05/Apr/2015:12:16:00 +0800]。
❑“$request”对应的是“GET / HTTP/1.1”。
❑ $status对应的是200状态码,200是正常访问。
❑ $body_bytes_sent对应的是25字节,响应body的大小。
❑“$http_referer”对应的是“-”,直接打开的域名浏览,因此,referer没有值。
❑“$http_user_agent”对应的是“Mozilla/5.0 (Windows NT6.1; WOW64) AppleWeb-Kit/537.36 (KHTML, like Gecko)Chrome/39.0.2171.95 Safari/537.36”。
❑“$http_x_forwarded_for”对应的是“-”,因为Web服务没有使用代理,因此此处为“-”。

可以在记录日志参数中加上buffer和flush选项,这样做会在高并发场景下提升网站访问性能。加该选项的命令如下:

[root@wen01 nginx]# cat conf/extra/01_www.conf
server {listen       80;server_name  www1.yeye.com yeye.com;location / {root   html/www;index  index.html index.htm;}access_log logs/access_www.log main buffer=32k flush=5s;   《==这里添加
}
  • Nginx访问日志轮询切割

默认情况Nginx会把所有的访问日志生成到一个指定的访问日志文件access.log里,但这样一来,时间长了就会导致日志内容很多,不利于分析日志和处理,因此,有必要对Nginx按天或按小时切割成不同的文件进行保留,Nginx日志轮询有很多方法,如利用系统默认的logrotate工具(后续yum安装Nginx会实验操作),这里使用Shell脚本实现按天切割的方法。

[root@wen01 nginx]# cat /server/scripts/cut_nginx_log.sh
#! /bin/sh
Dateformat=$(date +%Y%m%d -d -1day)
Basedir="/application/nginx"
Nginxlogdir="$Basedir/logs"
Logname="access_www"
[ -d $Nginxlogdir ] && cd $Nginxlogdir||exit 1
[ -f ${Logname}.log ]||exit 1
/bin/mv ${Logname}.log ${Dateformat}_${Logname}.log
$Basedir/sbin/nginx -s reload

python脚本

[root@wen01 nginx]# cat /server/scripts/cut_nginx_log.py import subprocess
import timeDateformat = str(time.strftime("%Y-%m-%d", time.localtime()))
Basedir = subprocess.run(["[ -d /application/nginx ]"], shell=True)
print(Basedir.returncode)
if Basedir.returncode==0:test = subprocess.run(["cd /application/nginx/logs"], shell=True)print(test.returncode)Logname = subprocess.run(["[ -f access_www.log ]" ], shell=True)print(Logname.returncode)if Logname.returncode==0:subprocess.run(["/bin/mv access_www.log " + Dateformat + "_access_www.log"], shell=True)subprocess.run(["/application/nginx/sbin/nginx -s reload"], shell=True)

注意:脚本实现切割Nginx日志的思想为将正在写入的Nginx日志(access_www.log)改名为带日期的格式文件(20150417_access_www.log),然后平滑重新加载Nginx,生成新的Nginx日志(access_www.log)。

下面通过定时任务实现每天00:00点整定时执行/Server/script/cut_nginx_log.sh切割日志。

也可以直接使用 crontab -e 命令添加。

最终日志切割效果:

[root@wen01 nginx]# ll logs/
总用量 292
-rw-r--r-- 1 root root      0 5月  26 15:25 2021-05-26_access_www.log  《==这里为切割出来的文件
-rw-r--r-- 1 root root      0 6月   5 10:53 access_bbs.log
-rw-r--r-- 1 root root      0 6月   5 10:53 access_blog.log
-rw-r--r-- 1 root root 233437 6月   5 10:03 access.log
-rw-r--r-- 1 root root   4318 6月   4 22:39 access_www.log
-rw-r--r-- 1 root root  50279 6月   5 10:53 error.log
-rw-r--r-- 1 root root      5 5月  25 11:52 nginx.pid

Nginx常用日志收集及分析工具有rsyslog、awstats、flume、ELK(Elasticsearch log-stash Kibana)、storm等。在学习学习

Nginx Location 加强理解

  • Location作用

Location指令作用是可以根据用户请求URI来执行不同的应用,其实就是根据用户请求的网站的地址URL匹配,匹配成功即进行相关的操作。

  • Location语法

Location使用的语法例子为:

对Location语法列表说明

上述语法中的URI部分是关键,这个URI可以是普通的字符串地址路径或者是正则表达式,当匹配成功则执行后面大括号里面的相关指令。正则表达式的前面还可以有~ 或 ~* 等特殊的字符。这两种特殊字符匹配的区别为:“~” 用于区分大小写(大小写敏感)的匹配; “~” 用于不区分大小写的匹配。还可以用逻辑操作符!对上面的匹配取反,即!~ 和 !~* 。此外,“^~” 作用是在常规的字符串匹配检查之后,不做正则表达式的检查,即如果最明确的那个字符串匹配的Location配置中有此前缀,那么不做正则表达式的检查。

  • Location匹配示例

官方的例子

[root@wen01 nginx]# cat conf/extra/01_www.conf.ori2
server {listen       80;server_name  www.test.com;root html/www;location / { return 401;}location = / {return 402;}location /documents/ {return 403;}location  ^~ /images/ {return 404;    }location ~* \.(gif|jpg|jpeg)$ {return 500;}access_log logs/access_www.log main buffer=32k flush=5s;
}

检查语法并使得修改的配置生效:
然后以Linux客户端为例对上述Location匹配进行真实测试,记得配置hosts文件。结果如下

用户请求的URI说明

不用URI及特殊字符组合匹配的顺序说明

实际应用:可以匹配任意URI地址,然后做特定的事情,例如:匹配静态扩展名,然后,把请求发给静态服务器,实现动静分离。

Nginx Rewrite

Nginx Rewrite的主要功能也是实现URL地址重写,Nginx的Rewrite规则需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配,前文在安装Nginx软件时就已经安装了这个PCRE软件,以及让Nginx支持Rewrite的功能,默认参数编译Nginx就会安装支持Rewrite的模块,但是,也必须要PCRE软件的支持,Nginx Rewrite的典型企业应用就是伪静态功能的实现。

  • Nginx Rewrite语法

  • Rewrite指令语法指令语法:Rewrite regex replacement [flag];
  • 默认值:none;
  • 应用位置:server、location、if。
  • rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement部分内容,结尾是flag标记。下面是一个简单的URL Rewrite跳转的例子:

    在上述指令中,Rewrite为固定关键字,表示开启一条Rewrite匹配规则,regex部分是^/(.*),这是一个正则表达式,匹配所有,匹配成功后跳转到http://www.etiantian.org/$1,这里的$1是取前面regex部分()里的内容,结尾permanent;表示永久301重定向标记,即跳转到后面的http://www.etiantian.org/$1地址上。
  • regex常用正则表达式说明

以下为regex常用正则表达式字符的一部分。

  • Rewrite指令结尾的flag标记说明

Rewrite指令最后一项参数为flag标记该标记说明

在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏URL地址不变,但在服务器端访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。last和break标记的实现功能类似,但两者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条Rewrite规则执行完毕后,会对其所在的server{…}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配,不再匹配后面的规则。

有关Rewrite特殊flag标记last与break的说明:在根location(即location /{……})中或者server{……}标签中编写Rewrite规则,建议使用last标记,而在普通的Location(例location/oldboy/ {……}或if{}中编写Rewrite规则,则建议使用break标记。

Nginx认证访问

使用账号密码才可以访问网站的功能主要应用在企业内部人员访问的地址上,如企业网站后台、MySQL客户端phpmyadmin、企业内部的CRM、WIKI等网站平台等。下面介绍一个配置示例:

其中,有两个参数需要说明。
❑ auth_basic语法: auth_basic string | off;默认值: auth_basic off;使用位置:http, server, location, limit_except
❑ auth_basic_user_file语法: auth_basic_user_file file;默认值: —使用位置:http, server, location, limit_exceptauth_basic_user_file参数后接认证密码文件,file的内容如下:

可以使用Apache自带的“htpasswd”或者“openssl passwd”命令设置用户和密码到认证文件里,注意,密码是加密的。

下面进行实战配置。选择一个虚拟主机配置在Server标签里,配置内容如下:
注意:/application/nginx/conf/是认证文件路径,htpasswd是存放账号及密码的文件。

[root@wen01 nginx]# cat conf/extra/02_bbs.conf
server {listen       80;server_name  bbs.yeye.com;location / {root   html/bbs;index  index.html index.htm;auth_basic "test"auth_basic_user_file /application/nginx/conf/htpasswd;}access_log logs/access_bbs.log main buffer=32k flush=5s;}

生成认证账号和密码的步骤如下:
1)获取htpasswd设置账号密码命令。
如果没有htpasswd命令,使用yum安装 httpd-tools 包

[root@wen01 nginx]# htpasswd -bc /application/nginx/conf/htpasswd test 123456
Adding password for user test
[root@wen01 nginx]# cat /application/nginx/conf/htpasswd test 123456
test:$apr1$mAJzpWSa$N0BLl0u2sXSErrh7b37E11

4)进行浏览器访问测试
会有输入密码的弹框

Nginx静态Web服务搭建相关推荐

  1. 浅析Nginx中各种锁实现丨Nginx中手写一个线程池丨Nginx中反向代理,正向代理,负载均衡,静态web服务丨C++后端开发

    学会nginx中锁的使用,让你对锁豁然开朗 1. 反向代理,正向代理,负载均衡,静态web服务 2. nginx 中 accept 锁实现 自旋锁 信号量 3. nginx 中 线程池 实现以及详解虚 ...

  2. nodejs静态web服务

    项目准备 Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等 Web 客户端提供文档,也可以放置网站文件,让全世界浏览:可以放置数据文件,让全世界下载.目前最主流的 ...

  3. 玩转CVM:Web服务搭建

    本教程将讲解如何依托腾讯云主机(CVM),搭建前沿的安全高性能Web服务.具体将包括:配置域名解析.SSL证书申请等Web服务的前置依赖,以及安装部署最新版Nginx Web服务器,并支持当前最新的T ...

  4. Web服务搭建 - Apache

    Web服务搭建 - Apache Web服务器搭建 Web服务介绍 服务器与浏览器利用HTTP协议进行交互的过程 统一资源定位符URL Apache服务器 配置Apache服务 搭建基础web服务 建 ...

  5. python自带静态web服务器搭建代码实现(一)

    一.静态web服务器 静态web法服务器:可为发出请求的浏览器提供静态文档的程序,平时上网浏览的页面都是动态的,而开发的是静态的,页面数据不会发生变化 搭建python自带的静态web服务器 命令:p ...

  6. nginx作为web服务以及nginx.conf详解

    Nginx系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1.nginx简介 nginx是一个优秀的web服务程序.反向代理程序.它采用非 ...

  7. nginx作为web服务应用

    Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强.我的应用主要有3个,端口转发.反向代理和web服务.我的网络架构是 ...

  8. docker之搭建nginx静态资源服务

    简单四步搭建完成 第一步安装docker启动 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/cento ...

  9. 使用Docker搭建nginx静态资源服务

    背景 回到老家后,发现github网络受限,有时候能打开,但是如果需要阅读源码.下载的时候特别慢,有时候根本下载不动,想着利用阿里云服务器做下载,本地去访问阿里云静态资源就可以解决这一问题.至于怎么去 ...

  10. Windows nginx静态资源服务器搭建

    第一次搭建本地静态资源服务器nginx,记录以供后续学习 实现页面如下 1. 了解nginx: Nginx是一个开源的Web服务器,同时Nginx也提供了反向代理和负载均衡的功能.为了实现将Windo ...

最新文章

  1. NLP被英语统治?打破成见,英语不应是「自然语言」同义词
  2. 为啥程序员下班后只关显示器从不关电脑?看看各大网站的答案~
  3. 【luogu P3377 左偏树(可并堆)】 模板
  4. openAI general intuition
  5. 使用SAP Spartacus快速创建一个电商店铺网站
  6. Codeforces Round #614 (Div. 2) D. Aroma‘s Search 暴力 + 思维
  7. python安装scrapy_Python安装Scrapy的种种
  8. java 并发 set_高并发下的Java数据结构(List、Set、Map、Queue)
  9. 为什么Go的自定义error有时候会内存溢出
  10. 对比图像分类五大方法:KNN、SVM、BPNN、CNN和迁移学习
  11. 计算机word上下左右边距,Word页边距调整设置(上下左右边距,2003-2013)
  12. 安卓AndroidStudio设计计算器实现简单的计算
  13. 在SATA SSD + NVMe SSD双硬盘中安装ubuntu双系统
  14. 【智能优化算法】基于融合改进 Logistics 混沌和正弦余弦算子的自适应 t 分布海鸥算法求解单目标优化问题附matlab代码
  15. 移动拼图游戏(八数码问题) BFS版
  16. 2023年兔年好看的头像
  17. conda虚拟环境中 安装 jupyter notebook
  18. 在AID Learning中用IPad或电脑连接手机
  19. SKCTF Writeup
  20. jq click()方法无反应?

热门文章

  1. ECDSA私钥der格式
  2. 如何删除电脑上的$RECYCLE.BIN文件夹
  3. 12306火车票查询
  4. python查询12306余票_python命令行查询12306火车票
  5. Excel根据快递单号自动识别快递公司
  6. Python正则提取
  7. 高德API实现地理逆编码
  8. 【云原生】理解k8s中的Pod和容器设计模式
  9. 恒指赵鑫:07.09今日实盘喊单记录与小结
  10. “开心偷菜”一梦8年终成空,终究还是输给了时间和规则!