Nginx教程

【Linux学习笔记】之【Web服务器搭建——Nginx】

本文主要是介绍【Linux学习笔记】之【Web服务器搭建——Nginx】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Nginx


安装与配置


安装

yum install -y epel-release
yum install nginx
# 安装 EPEL源和nginx服务

配置文件

  • Nginx服务名称:nginx
  • Nginx服务的默认站点:/usr/share/nginx/html
  • Nginx服务的主配置文件:/etc/nginx/nginx.conf
    • 全局配置
    • I/O事件配置
    • HTTP配置
  1. 全局配置
    包括Nginx的运行用户、工作进程数、错误日志、PID存放位置等基本设置。
user nginx;                         # 运行用户
worker_processes auto;
# 工作进程数量
error_log /var/log/nginx/error.log;
# 错误日志文件的位置
pid /run/nginx.pid;
# PID文件的位置
  1. I/O事件配置
    用来指定Nginx进程的I/O响应模型、每个进程的连接数等设置。
events {
    Use epoll;
    # 使用epoll模型
    worker_connections 1024;
    # 每个进程处理1024个连接
}
  1. HTTP配置
    含访问日志、HTTP端口、网页目录、默认字符集、连接保持以及虚拟WEB主机、PHP解析等一系列设置。
http {
    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  /var/log/nginx/access.log  main;  # 访问日志
    sendfile            on;  # 支持文件发送(下载)
    tcp_nopush          on;       
    tcp_nodelay         on;
    keepalive_timeout   65;  # 连接保持超时
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
   # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;  # 监听端口配置
        listen       [::]:80 default_server;
        server_name  _;  # 网站名称
        charest utf-8  # 网页的默认字符集
        root         /usr/share/nginx/html;  # 默认首页
        include      /etc/nginx/default.d/*.conf;
        location / {  # 根目录配置
        }
        error_page 404 /404.html;      
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
  1. 允许浏览文件
location / {
        root /data/www/file
        # 指定实际目录绝对路径;
        autoindex on;
        # 开启目录浏览功能;
        autoindex_exact_size off;
        # 关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;
        autoindex_localtime on;
        # 开启以服务器本地时区显示文件修改日期!
}

访问状态统计

Nginx内置了HTTP_STUB_STATUS状态统计模块,可使用nginx -V查看安装的Nginx是否包含这个模块。

vim /etc/nginx/nginx.conf
# 配置访问状态统计

location /status {  # 设置访问位置
    stub_status on;  # 打开状态统计功能
    access_log off;  # 关闭此位置的日志记录
}

systemctl restart nginx

访问localhost/status

Active connections: 1  # 当前的活动连接数
server accepts handled requests  # 已经处理的连接信息
 2 2 3  # 己处理的连接数  成功的TCP握手次数  已处理的请求数
Reading: 0 Writing: 1 Waiting: 0

Nginx 访问控制


基于授权的访问控制

Nginx基于授权的访问控制配置与Apache网页认证实现步骤基本一致:

# 第一步:使用htpasswd生成用户认证用户文件
htpasswd -c /etc/nginx/passwd.db admin
New password:
Re-type new password:

# 如何命令不能使用,安装 httpd-tools
chmod 400 /etc/nginx/passwd.db
chown nginx /etc/nginx/passwd.db

# ---------------------------------

# 第二步:修改主配置文件,添加认证配置项
location /status {
    auth_basic "secret";
    auth_basic_user_file /etc/nginx/passwd.db;
    stub_status on;    
    access_log off;
}

# ----------------------------------

# 第三步:重启服务、访问测试 
systectl restart nginx

基于客户端的访问控制

# Nginx基于客户端的访问相比Apache配置更为简单,规则如下:
deny   IP/IP段
allow  IP/IP段
# 规则从上往下执行,一旦匹配则停止,不再往下执行。

# 拒绝192.168.10.1访问网站,配置如下:
location /status {
    deny 192.168.10.1;
    allow all;
}

Nginx 虚拟主机


基于域名

vi /etc/hosts
# 在/etc/hosts中追加一行:
#########################
192.168.75.128 www.test.com 
192.168.75.128 www.hr.com
#########################

# 修改nginx配置文件
vim /etc/nginx/nginx.conf
# 在文件最后一个}号前添加:
##########################
include vhost/*.conf;
##########################


# 在/etc/nginx目录下新建vhost目录,并在下面新test.conf与hr.conf两个域名配置文件,并作如下编辑。
vim test.conf

###########################
server{
    listen 192.168.75.131:80;
    server_name www.test.com;
    location / {
        root /data/test;
        index index.html;
    }
}
############################
vim hr.conf
############################
server{
    listen 192.168.75.131:80;
    server_name www.hr.com;
    location / {
        root /data/hr;
        index index.html;
    }
}
############################



# 将公司网站文件test和hr都放到/data/目录下

# 配置完成后重启服务:
systemctl restart nginx

# 访问测试

基于IP

# 为系统配置多个IP地址
ifconfig ens33:0 192.168.10.100
ifconfig ens33:1  192.168.10.200


# 编辑配置文件
vim /etc/nginx/nginx.conf
#########################
server{
        listen 192.168.75.100:80;
        server__name 192.168.75.100:80;
        .......................
}
server{
        listen 192.168.75.200:80;
        server__name 192.168.75.200:80;
        .......................
}
##########################

基于端口

vim /etc/nginx/nginx.conf
##########################
server{
        listen 192.168.75.100:6666;
        server__name 192.168.75.100:6666;
        .......................
}
server{
        listen 192.168.75.100:8888;
        server__name 192.168.75.100:8888;
        .......................
}
###########################

Nginx日志分析

Nginx日志主要分为两种:

  • access_log(访问日志)
  • error_log(错误日志)

访问日志

访问日志主要记录客户端的请求。


1.设置访问日志的语法格式
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; 
access_log off; 
# 关闭访问日志,当前作用域下的所有的请求日志都被关闭

选项说明:

选项说明
path指定日志的存放位置。
format指定日志的格式。默认使用预定义的combined。
buffer用来指定日志写入时的缓存大小。默认是64k。
gzip日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。
flush设置缓存有效时间。如果超过flush指定的时间,缓存中的内容将被清空。
if条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志

2.设置访问日志的作用域

可以应用access_log指令的作用域分别有http,server,location,limit_except,如果在这几个作用域外使用该指令,Nginx会报错。

access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m
# 指定日志的写入路径为/var/logs/nginx-access.log
# 日志格式使用默认的combined
# 指定日志的缓存大小为32k
# 日志写入前启用gzip进行压缩,压缩比使用默认值1
# 缓存数据有效时间为1分钟。

3.自定义访问日志格式

Nginx预定义了名为combined日志格式,如果没有明确指定日志格式默认使用该格式:

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

# 如不想使用Nginx预定义的格式,可以通过log_format指令来自定义,语法结构如下:
log_format name [escape=default|json] string ...;

选项说明:

选项说明
name格式名称。在access_log指令中引用。
escape设置变量中的字符编码方式是json还是default,默认是default。
string要定义的日志格式内容。该参数可以有多个。参数中可以使用Nginx变量。

log_format常用变量:

变量含义
$bytes_sent发送给客户端的总字节数
$body_bytes_sent发送给客户端的字节数,不包括响应头的大小
$connection连接序列号
$connection_requests当前通过连接发出的请求数量
$msec日志写入时间,单位为秒,精度是毫秒
$pipe如果请求是通过http流水线发送,则其值为"p",否则为“."
$request_length请求长度(包括请求行,请求头和请求体)
$request_time请求处理时长,单位为秒,精度为毫秒,从读入客户端的第一个字节开始,直到把最后一个字符发送张客户端进行日志写入为止
$status响应状态码
$time_iso8601标准格式的本地时间,形如“2017-05-24T18:31:27+08:00”
$time_local通用日志格式下的本地时间,如"24/May/2017:18:31:27 +0800"
$http_referer请求的referer地址。
$http_user_agent客户端浏览器信息。
$remote_addr客户端IP
$http_x_forwarded_for当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置。
$request完整的原始请求行,如 “GET / HTTP/1.1”
$remote_user客户端用户名称,针对启用了用户认证的请求
$request_uri完整的请求地址,如 “https://daojia.com/”

错误日志


1.error_log指令

错误日志在Nginx中是通过error_log指令实现,该指令记录服务器和请求处理过程中的错误信息,可以配置在main, http, mail, stream, server, location作用域。

# 语法格式:
error_log file [level];
选项说明
file指定日志的写入位置
level指定日志级别,如:debug, info, notice, warn, error, crit, alert,emerg。只有日志的错误级别等于或高于level指定的值才会写入错误日志中。默认值是error。
error_log /var/logs/nginx/nginx-error.log
# 指定错误日志的路径为:/var/logs/nginx/nginx-error.log
# 日志级别使用默认的error

2.open_log_file_cache

每一条日志记录的写入都是先打开文件再写入记录,然后关闭日志文件。如果你的日志文件路径中使用了变量,如access_log /var/logs/$host/nginx-access.log,为提高性能,可以使用open_log_file_cache指令设置日志文件描述符的缓存。它可以配置在http、server、location作用域中

# 语法格式:
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
# 设置缓存最多缓存1000个日志文件描述符。
# 20s内如果缓存中的日志文件描述符至少被被访问2次,才不会被缓存关闭。
# 每隔1分钟检查缓存中的文件描述符的文件名是否还存在。
选项说明
max设置缓存中最多容纳的文件描述符数量,如被占满采用LRU算法将描述符关闭。
inactive设置缓存存活时间,默认是10s。
min_uses在inactive时间段内,日志文件最少使用几次,该日志文件描述符记入缓存,默认是1次。
Valid设置多久对日志文件名进行检查,看是否发生变化,默认是60s。
Off不使用缓存。默认为off。

日志分割

Nginx没有类似Apache的cronlog日志分割处理能力,但可以通过Nginx的信号控制功能脚本来实现日志的自动切割,将将脚本加入到Linux的计划任务中,让脚本在每天的固定时间执行,便可实现日志切割功能。

  1. 编写脚本/opt/logbak.sh把Nginx的日志文件/var/log/nginx/access.log移动到目录/mnt/log/nginx下面,以当前时间做为日志的文件名称,然后用kill-USR1创建新的日志文件/var/log/nginx/access.log,最后删除30天以前的日志文件。
vim /opt/logbak.sh
##############################
#!/bin/bash
#Filename:logbak.sh
d=$(date -d "-l day" "+%Y%m%d")
logs_path="/mnt/log/nginx"
pid_path="/run/nginx.pid"
[ -d $logs_path ] || mkdir -p $logs_path
mv /var/log/nginx/access.log ${logs_path}/nginx-access.log-$d
kill -USR1 $(cat $pid_path)
find $logs_path -mtime +30|xargs rm -rf
##############################

# 设置crontab任务,定期执行脚本自动进行日志分割。
crontab -e
###########
30  1  * * *  /opt/logbak.sh
###########

这篇关于【Linux学习笔记】之【Web服务器搭建——Nginx】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!