avatar

Nginx安装配置以及优化

nginx 安装

下载

官网下载对应的nginx包,推荐安装稳定版本。

也可以使用我提供的百度云下载地址,版本号:1.19.5

链接:https://pan.baidu.com/s/19-ETJsKvxH5Z4jZ1iWUw6Q
提取码:fzla
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V5的分享

安装相关依赖

安装gcc环境

1
yum -y install gcc-c++

安装RCPE库,用于解析正则表达式

1
yum -y install pcre pcre-devel

Zlib压缩和解压缩依赖

1
yum install -y zlib zlib-devel

SSL安全的加密的套接字协议层,用于HTTP安全传输,也就是https

1
yum install -y openssl openssl-devel

安装

上传

我在Linux下创建了/soft/nginx目录,并将安装包上传到此处

新建目录

1
mkdir -p /soft/nginx

上传安装包略..

解压并进入解压后的目录

1
2
tar -zxvf nginx-1.16.1.tar.gz
cd /soft/nginx/nginx-1.19.5

编译之前,需要先创建nginx临时目录,如果不创建,启动的时候会报错

1
mkdir -p /var/temp/nginx

在nginx目录,如果如下命令,目的是为了创建makefile文件,通过makefile才能进行编译和安装。

1
2
3
4
5
6
7
8
9
10
11
12
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi

注:\代表在命令行中换行,用于提高可读性

命令 解释
–prefix 指定nginx安装目录
-pid-path 指定nginx的pid
–lock-path 锁定安装文件,防止被恶意篡改或者误操作
–error-log 错误日志
–http-log-path http日志
–with-http_gzip_static_module 启用gzip模块,在线实时压缩输出数据流
–http-client-body-temp-path 设定客户端请求的临时目录
–http-proxy-temp-path 设定http代理临时目录
–http-fastcgi-temp-path 设定fastcgi临时目录
–http-uwsgi-temp-path 设定uwsgi临时目录
–http-scgi-temp-path 设定scgi临时目录

make编译

1
make

安装

1
make install

检查nginx是否安装成功

1
whereis nginx

如果输出nginx: /usr/local/nginx 表示安装成功

进入sbin目录启动nginx

1
2
cd /usr/local/nginx/sbin
./nginx

如果感觉每次进入目录比较深,可以在根目录创建快链

1
ln -s /usr/local/nginx/sbin/nginx /nginx

停止 ./nginx -s stop

重新加载 ./nginx -s reload

访问

打开浏览器,访问虚拟机所在内网ip即可打开Nginx默认页面,显示如下信息表示安装成功

注意事项: 如果是云服务器,安全组策略里开启默认80端口,如果在虚拟机内,请关闭防火墙~

nginx配置文件介绍

整体结构

设置worker进程的用户

设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为nobody

1
user root;

设置worker进程工作数设置

worker进程工作数设置,官方建议CPU内核有几个,就设置几个,或者设置为N-1也行,默认为1

1
worker_processes  1;

日志级别

全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]错误级别从左到右越来越大

1
2
3
error_log  logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;

设置nginx进程 pid

1
pid logs/nginx.pid;

设置events工作模式

1
2
3
4
5
6
events {
# 默认使用epoll
use epoll;
# 每个worker允许连接的客户端最大连接数
worker_connections 1024;
}

如何配置worker_connections的大小

系统的最大打开文件数>= worker_connections*worker_process

根据系统的最大打开文件数来调整,worker_connections进程连接数量要小于等于系统的最大打开文件数,worker_connections进程连接数量真实数量= worker_connections*worker_process

执行下面语句查看当前系统最大文件打开数

1
ulimit -a|grep "open files"

设置http 是指令块

http 是指令块,针对http网络传输的一些指令配置

1
2
http {
}

引入外部配置

include 引入外部配置,提高可读性,避免单个配置文件过大

1
include       mime.types;

设置日志格式

设定日志格式,main为定义的格式名称,如此 access_log 就可以直接使用这个变量了

参数名 参数意义
$remote_addr 客户端ip
$remote_user 远程客户端用户名,一般为:’-’
$time_local 时间和时区
$request 请求的url以及method
$status 响应状态码
$body_bytes_send 响应客户端内容字节数
$http_referer 记录用户从哪个链接跳转过来的
$http_user_agent 用户所使用的代理,一般来时都是浏览器
$http_x_forwarded_for 通过代理服务器来记录客户端的ip

设置高效文件传输

sendfile|使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,设置nginx在一个数据包里发送所有头文件,而不是一个接一个的发送,提高了效率

1
2
sendfile        on;
tcp_nopush on;

设置客户端与服务端请求的超时时间

keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。

HTTP1.1支持持久连接alive,降低每个连接的alive时间可在一定程度上提高可响应连接数量,所以一般可适当降低此值

1
2
#keepalive_timeout  0;
keepalive_timeout 65;

设置 gzip压缩

gzip启用压缩,html/js/css压缩后传输会更快

1
2
3
4
5
6
7
8
# 开启gzip压缩功能,目的:提高船速效率,节约宽带
gzip on;
# 限制最小压缩,小于1字节文件不会压缩
gzip_min_length 1;
# 定义压缩的级别(压缩比,文件越大,压缩越多,但是cpu使用越多)
gzip_comp_level 3;
# 定义压缩文件的类型
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/json;

设置虚拟主机

server可以在http指令块中设置多个虚拟主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
listen 监听端口
server_name localhost、ip、域名
location 请求路由映射,匹配拦截
root 请求位置
index 首页设置
server {
listen 88;
server_name localhost;

location / {
root html;
index index.html index.htm;
}
}

nginx 常用命令

停止

1
./nginx -s quit

使用上面命令能够更优雅的关闭nginx,不会立刻关闭(除非没有客户端请求)而是等待和现有的客户端交互完毕后才关闭

1
./nginx -s stop

立即关闭nginx,当前所有的连接请求都直接中断

检查配置文件编写是否正确

1
./nginx -t

查看nginx版本

1
2
./nginx -v
./nginx -V

查看帮助

1
2
./nginx -?
./nginx -h

指定nginx的核心配置文件

1
./nginx -c 配置文件路径

重启

1
./nginx -s reload

日志切割

手动切割

现有的日志都会存在 access.log 文件中,但是随着时间的推移,这个文件的内容会越来越多,体积会越来越大,不便于运维人员查看,所以我们可以通过把这个大的日志文件切割为多份不同的小文件作为日志,切割规则可以以天为单位,如果每天有几百G或者几个T的日志的话,则可以按需以每半天或者每小时对日志切割一下。

具体步骤如下:

  1. 创建一个shell可执行文件:cut_my_log.sh,内容为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    LOG_PATH="/var/log/nginx/"
    RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
    PID=/var/run/nginx/nginx.pid
    mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
    mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log

    #向Nginx主进程发送信号,用于重新打开日志文件
    kill -USR1 `cat $PID`
  2. 为cut_my_log.sh添加可执行的权限:

    1
    chmod +x cut_my_log.sh
  3. 测试日志切割后的结果:

    1
    ./cut_my_log.sh

自动切割

  1. 安装定时任务:

    1
    yum install crontabs
  2. 执行crontab -e 编辑并且添加一行新的任务:

    1
    */1 * * * * /usr/local/nginx/sbin/cut_my_log.sh
  3. 重启定时任务

    1
    service crond restart

点击查看Cron表达式文章

发布静态资源root 和 alias 的区别

在 Location 或者其他 Nginx 配置中会经常看到 rootalias ,开始我以为这两者是能够混用的,但其实两者有着很大的区别。root 指令会将 location 中的部分附加到 root 定义的末尾形成一个完整的路径;而 alias 则不会包含 location 中定义的部分。 假设我的静态资源存放位置/home/baidu目录下,想要访问有两种方式。

方式1:使用root 路劲完全匹配访问

找到nginx的配置文件,在端口号为80的server中添加

1
2
3
4
location /baidu {
root /home;
index index.html;
}

重启nginx,访问即可。比如访问http://localhost:80/baidu/a.jpg。会定位到/home/baidu/a.jpg文件

方式2:使用alias 可以为路径起一个别名,对用户透明。既安全,又容易阅读

1
2
3
4
location /static {
alias /home/baidu;
index index.html;
}

重启nginx,访问即可。比如访问http://localhost:80/static/a.jpg。会定位到/home/baidu/a.jpg文件

跨域问题

在server模块中配置如下内容

1
2
3
4
5
6
7
8
#允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
#允许请求的header
add_header 'Access-Control-Allow-Headers' *;

静态资源防盗链

在server模块中配置如下内容

1
2
3
4
5
6
7
#对源站点验证,验证通过,匹配location路径,匹配失败返回404状态码,也可以是其他状态码
valid_referers *.baidu.com;

#非法引入会进入下方判断
if ($invalid_referer) {
return 404;
}

附1:nginx.pid打开失败、失效、重启时丢失nginx.pid文件解决方法

错误重现

在执行重启命令./nginx -s reload是报如下错误

1
nginx: [error] open() “/var/run/nginx/nginx.pid” failed (2: No such file or directory)

解决方式1

第一步:查看目录是否存在

首先打开/var/run/nginx/目录,如果没有该目录就创建该目录

1
mkdir -p /var/run/nginx

第二步:重新启动nginx

1
./nginx -s reload

可能会报错:

1
nginx:  [error] invalid PID number "" in "/var/run/nginx/nginx.pid"

有产生了新的问题,原因可能是nginx程序没有关联到默认的配置文件,手动关联

1
./nginx -c /usr/local/nginx/conf/nginx.conf

解决方式2

如果使用虚拟机,重启虚拟机后,再次重启nginx会报错: nginx: [error] open() “/var/run/nginx/nginx.pid” failed (2: No such file or directory)

  1. 进入 cd /usr/local/nginx/conf/ 目录,编辑配置文件nginx.conf

  2. 在配置文件中有个注释的地方: #pid logs/nginx.pid;

  3. 将注释放开,并修改为:pid /usr/local/nginx/logs/nginx.pid;

  4. /usr/local/nginx 目录下创建 logs 目录mkdir /usr/local/nginx/logs

  5. 再次启动nginx服务:cd /usr/local/nginx/sbin/ 问题解决

附2:完整的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#定义nginx运行的用户和用户组
user www www;

#设置nginx进程数,一般设置为cpu核心数,auto为自动检测
worker_processes auto;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;

#守护进程pid文件
pid logs/nginx.pid;

#events模块中包含nginx中所有处理连接的设置
events {
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 2048;
#设置nginx收到一个新链接通知后接受尽可能多的链接
multi_accept on;
#设置用于复用客户端线程的轮训方法
use epoll;
}

#http模块控制着nginx http处理的所有核心特性
http {
#文件扩展名与文件类型映射表
include mime.types;

#默认文件类型
default_type application/octet-stream;

#打开或关闭错误页面中的nginx版本号deng
server_tokens on;

#设置nginx是否存储访问日志,关闭这个可以让读取磁盘IO操作更快
access_log on;

#服务器名字的hash表大小
#保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size
#所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。
#在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。
#如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,
#最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。
#因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,
#那么首要的是增大前一个参数的大小.
server_names_hash_bucket_size 128;

#客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,
#如果header过大,它会使用large_client_header_buffers来读取。
large_client_header_buffers 4 64k;

#设定通过nginx上传文件的大小
client_max_body_size 8M;

#缓冲区代理缓冲用户端请求的最大字节数,
#如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,
#来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,
#也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。

client_body_buffer_size 128k;

#开启高效文件传输模式,优化磁盘IO设置
sendfile on;

#设置nginx在一个数据包里发送所有头文件,而不是一个接一个的发送
tcp_nopush on;

# HTTP1.1支持持久连接alive
# 降低每个连接的alive时间可在一定程度上提高可响应连接数量,所以一般可适当降低此值
keepalive_timeout 60;

#设置代理服务器(nginx)保存用户头信息的缓冲区大小
#设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,
#默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
proxy_buffer_size 4k;

#proxy_buffers缓冲区,网页平均在32k以下的设置
#设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,
#根据操作系统的不同可能是4k或者8k
proxy_buffers 4 32k;

#高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;

#设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_file_write_size 64k;

gzip on;
#加vary给代理服务器使用,针对有的浏览器支持压缩,有个不支持,
#根据客户端的HTTP头来判断是否需要压缩
#gzip_vary on;

# 过短的内容压缩效果不佳,压缩过程还会浪费系统资源
gzip_min_length 1000;

#允许或禁止压缩基于请求和相应的响应流,any代表压缩所有请求
gzip_proxied any;

#==设置数据压缩等级,1-9之间,9最慢压缩比最大
gzip_comp_level 9;

#设置需要压缩的数据格式
gzip_types text/plain text/css text/xml text/javascript application/json
application/x-javascript application/xml application/xml+rss;

# 静态文件缓存
# 最大缓存数量,文件未使用存活期
open_file_cache max=65535 inactive=20s;
# 验证缓存有效期时间间隔
open_file_cache_valid 30s;
# 有效期内文件最少使用次数
open_file_cache_min_uses 3;

#虚拟主机配置
server {
listen 80;

#多域名用空格隔开
server_name localhost zixuephp.net www.zixuephp.net;

#设置默认访问首页
index index.php index.html;

#默认编码
charset utf-8;


#定义本虚拟主机的访问日志
access_log logs/access.log;

#错误也设置
error_page 500 502 503 504 /404.html;
location = /404.html {
root html;
}

#图片缓存
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
expires 7d;
}


#网站伪静态
location / {
rewrite "^/index.html$" /index.php last;
rewrite "^/iphp.html$" /iphp.php last;
rewrite "^/login.html$" /login.php last;
rewrite "^/post.html$" /post.php last;
rewrite "^/article.html$" /article.php last;
rewrite "^/article-([0-9]+).html$" /article.php?aid=$1 last;
rewrite "^/iphp-([0-9]+)-([0-9]+).html$" /iphp.php?mid=$1&cid=$2 last;
rewrite "^/iphp-([0-9]+)-page([0-9]+).html$" /iphp.php?mid=$1&page=$2;
rewrite "^/iphp-c([0-9]+)-page([0-9]+).html$" /iphp.php?cid=$1&page=$2;
rewrite "^/search.html$" /search.php;
}


#nginx解析php脚本
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
include fastcgi_params;
index index.php index.html;

}
}

}
文章作者: 微信:hao_yongliang
文章链接: https://haoyongliang.gitee.io/2020/11/17/linux/Nginx%E6%A0%B8%E5%BF%83%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 郝永亮的主页
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论