Nginx搭建及优化
Nginx (“enginx x”)
- 十分轻量级的HTTP服务器
- 高性能HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP代理服务器
- 软件下载 http://nginx.org/en/download.html
安装Nginx
配置文件说明
- 安装目录:/usr/local/nginx/
- 配置文件:conf/nginx.conf
- 网页目录:html
- 日志文件:logs
- 启动脚本:sbin/nginx
环境:CentOS 7.5,Nginx-1.17.6
安装依赖
yum -y install gcc pcre-devel openssl-devel
# gcc 编译nginx
# pcre-devel 支持正则,nginx的配置文件需要支持正则表达式
# openssl-devel 支持HTTPS加密
安装Nginx
useradd -s /sbin/nologin/ -M nginx # 创建nginx用户
tar -xf nginx-1.17.6.tar.gz
cd nginx-1.17.6/
./configure \
--prefix=/usr/local/nginx \ # 指定安装目录
--user=nginx \ # 指定账户名称
--group=nginx \ # 指定组名称
--with-http_ssl_module # 支持HTTPS加密
make && make install # 编译及安装
启动Nginx
cd /usr/local/nginx # nginx 安装目录
sbin/nginx # 启动nginx
curl localhost # 测试页面
vim /usr/lib/systemd/system/nginx.service# 编写service文件实现开机自启
[Unit]
Description=The Nginx HTTP Server
#描述信息
After=network.target remote-fs.target nss-lookup.target
#指定启动nginx之前需要其他的其他服务,如network.target等
[Service]
Type=forking
#Type为服务的类型,仅启动一个主进程的服务为simple,需要启动若干子进程的服务为forking
ExecStart=/usr/local/nginx/sbin/nginx
#设置执行systemctl start nginx后需要启动的具体命令.
ExecReload=/usr/local/nginx/sbin/nginx -s reload
#设置执行systemctl reload nginx后需要执行的具体命令.
ExecStop=/bin/kill -s QUIT ${MAINPID}
#设置执行systemctl stop nginx后需要执行的具体命令.
[Install]
WantedBy=multi-user.target
systemctl enable nginx # 开机自启
Nginx 优化
nginx.conf 字段说明
worker_processes 1; # nginx进程数量,与CPU核心数一致
...
events {
worker_connections 1024; # 每个worker最大并发连接数
}
...
server { # 定义虚拟主机
listen 80; # 监听端口
server_name localhost; # 域名
location / { # location块
root html; # 工作目录
index index.html index.htm; # 默认访问页面
}
error_page 500 502 503 504 /50x.html; # 指定状态码指向的页面
# location ~ \.php$ { # 配置php解析
# ...
# }
}
...
# server { # 配置HTTPS加密
# 443 ssl;
# server_name localhost;
...
}
...
开启status模块,查看Nginx连接数等信息
- –with-http_stub_status_module
killall nginx
cd ~//nginx-1.17.6 # 重新编译安装,添加status模块
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
make && make install
systemctl start nginx
修改Nginx配置文件
worker_processes 4;
events {
worker_connections 10000;
}
http{
server_tokens off; # 隐藏版本号
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
# 将客户端IP信息存储名称为one的共享内存,内存空间为10M,每秒一个ip接受一个请求,多余的放入漏斗
gzip on; # 开启压缩传输
server {
listen 80;
server_name localhost;
limit_req zone=one burst=5; # 漏斗超过5个请求则报错
location /status { # 查看nginx连接请求信息
stub_status on;
}
if ($request_method !~ ^(GET|POST)$ ) {
return 444; # 客户端使用非GET或POST方法访问网站,则返回错误信息
}
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
expires 30d; # 缓存图片等页面
}
client_header_buffer_size 1k; # 默认请求包头信息的缓存
large_client_header_buffers 2 1k; # 大请求包头部信息的缓存个数与容量
client_body_buffer_size 1k; # 同上
client_max_body_size 4k;
...
}
...
}
# server {
优化内核参数
默认创建最大文件描述符为1024个
ulimit -Hn 100000 # 设置硬限制(临时)
ulimit -Sn 100000 # 设置软限制(临时)
测试
curl http://localhost/status
Active connections: 1
server accepts handled requests
43 43 1
Reading: 0 Writing: 1 Waiting: 0
-
Active connections:当前活动的连接数量。
-
Accepts:已经接受客户端的连接总数量。
-
Handled:已经处理客户端的连接总数量。(一般与accepts一致,除非服务器限制了连接数量)。
-
Requests:客户端发送的请求数量。
-
Reading:当前服务器正在读取客户端请求头的数量。
-
Writing:当前服务器正在写响应信息的数量。
-
Waiting:当前多少客户端在等待服务器的响应。
ab -n 20000 -c 20000 http://localhost/
...
Concurrency Level: 20000
Time taken for tests: 1.351 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Total transferred: 16760000 bytes
HTML transferred: 12240000 bytes
Requests per second: 14803.94 [#/sec] (mean)
Time per request: 1350.992 [ms] (mean)
Time per request: 0.068 [ms] (mean, across all concurrent requests)
Transfer rate: 12114.94 [Kbytes/sec] received
...
# 在配置文件注释掉limit_req的情况下,轻松并发20000
# 当然,页面小,本地访问也是主要原因
总结
做完这些,提高了安全,避免一些攻击,加大了并发访问量,当然Nginx还有很多优化,比如删除不必要的模块等,本次介绍并不完善,后续补充。