LNMP之Nginx! 服务部署以及配置文件的各种用处
Posted 丁CCCCC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LNMP之Nginx! 服务部署以及配置文件的各种用处相关的知识,希望对你有一定的参考价值。
nginx
一、概述
1.1 关于Nginx
- Nginx 和 Apache 一样使用模块化设计,Nginx模块包括内置模块和第三方模块,其中内置模块中包含主模块和事件模块
- 简单的说apache httpd和nginx都是web服务器,但两者适应的场景不同,也就是两者专注于解决不同的问题
- apache httpd:稳定、对动态请求处理强,但同时高并发时性能较弱,耗费资源多
- nginx:高并发处理能力强、擅长处理静态请求、反向代理、均衡负载
1.2 特点
- 高并发。静态小文件
- 占用资源少。2万并发、10个线程,内存消耗几百M
- 功能种类比较多。web,cache,proxy。每一个功能都不是特别强
- 支持epoll模型,使得nginx可以支持高并发
- nginx 配合动态服务和Apache有区别(FASTCGI 接口)
- 利用nginx可以对IP限速,可以限制连接数
- 配置简单,更灵活
二、Nginx服务部署
2.1 编译安装Nginx
关闭防火墙,上传Nginx安装包
- systemctl stop firewalld
- setenforce 0
- 上传软件包
- 解压
- tar zxvf nginx-1.12.2.tar.gz
安装相应依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
创建用户、组
Nginx 服务程序默认是以 nobody 身份运行的,所以我们要为其创建专门的用户账号,方便控制其访问权限
- useradd -M -s /sbin/nologin nginx
编译安装
cd nginx-1.12.2/
./configure \\
> --prefix=/usr/local/nginx \\ # 指定nginx的安装路径
> --user=nginx \\ # 指定用户名
> --group=nginx \\ # 指定组名
> --with-http_stub_status_module # 启用http_stub_status_module模块以支持状态统计
make -j2 && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ # 让系统识别nginx的操作命令
开启、关闭、重启等
检查
- nginx -t
- 检查配置文件是否正确
- 检查配置文件是否正确
开启
- nginx
直接开启
停止
cat /usr/local/nginx/logs/nginx.pid # 查询nginx的PID号
120959
kill -3 120959 # 普通结束进程,不需要强制结束
netstat -natp | grep :80 # 搜索80端口无结果
killall -3 nginx # 指定名称也可结束
重载
kill -1 121115 # -1重载
killall -1 nginx # 根据进程名也可
补充
- kill -USR1 121115
- 日志分隔,重新打开日志文件
- kill -USR2 121115
- 平滑升级
升级
- 解压缩新的升级包
- 进入新的目录
cd nginx-1.xxxx # 新的升级包安装后的目录
./configure \\
> --prefix=/usr/local/nginx \\
> --user=nginx \\
> --group=nginx \\
> --with-http_stub_status_module
> --with-http_ssl_module
- 编译安装
make -j2 # 编译
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old # 移动原配置并改名
cp objs/nginx /usr/local/nginx/sbin/nginx
make upgrade # 安装
如果无法安装,先 killall nginx ,再/usr/local/nginx/sbin/nginx
三、添加系统服务
我们可以通过脚本来对 nginx 进行简单的启动、关闭、重启等服务
3.1 第一种方法
- vim /etc/init.d/nginx
- 脚本需要放在 init.d 目录下
#!/bin/bash # 申明解释器
#chkconfig: - 99 20 # -代表不在任何级别启动,99表示自启动顺序为99个,20表示关闭顺序为第20个
#description:Nginx Service Control Script # 描述控制脚本是nginx
COM="/usr/local/nginx/sbin/nginx" # 定义变量,nginx的命令
PID="/usr/local/nginx/logs/nginx.pid" # 指定PID文件的路径
case "$1" in # 循环第一个位置变量
# 第一个如果是start,则执行变量COM
start)
$com
;;
# 关闭服务,执行以下命令
stop)
kill -s QUIT $(cat $PID)
;;
# 重启服务,执行关闭和开始命令
restart)
$0 stop
$0 start
;;
# 重载,指定进程号来完成
reload)
kill -s HUP $(cat $PID)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}" # 输入的不对的话,提示内容
exit 1 # 退出脚本,返回码1
esac
exit 0 # 正常回执码
- 测试
chmod +x /etc/init.d/nginx # 给脚本权限
chkconfig --add nginx # 添加为系统服务
systemctl stop nginx # 关闭
systemctl start nginx # 开启
3.2 第二种方法
制作 systemd 脚本来管理服务
- vim /lib/systemd/system/nginx.service
- 在systemd目录下创建脚本文件
[Unit] # 服务说明
Description=nginx # 描述服务是nginx
After=network.target # after为依赖,表示网卡服务启动之后再启动nginx
[Service] # 服务设置
Type=forking # 后台启动
PIDFile=/usr/local/nginx/logs/nginx.service # 命令公式
ExecStart=/usr/local/nginx/sbin/nginx # 具体运行命令
ExecrReload=/bin/kill -s HUP $MAINPID # 重启命令
ExecrStop=/bin/kill -s QUIT $MAINPID # 停止命令
privateTmp=true # 给服务分配独立的临时空间
[Install] # 服务安装的相关设置,可设置多用户
wantedBy=multi-user.target
- chmod 754 /lib/systemd/system/nginx.service
- 设置权限
四、nginx的主配置文件
4.1 工作目录
/usr/local/nginx/conf/nginx.conf
4.2 全局配置
2 #user nobody; # 运行用户,未指定则默认为nobody
3 worker_processes 1; # 工作进程数量,可配置成服务器内核书*2,如果网站访问量不大就设置 1
4
5 #error_log logs/error.log; # 错误日志文件的位置
6 #error_log logs/error.log notice;
7 #error_log logs/error.log info;
8
9 #pid logs/nginx.pid; # PID 文件的位置
4.3 I/O 事件配置
12 events {
use epoll; # 使用 epoll 模型可以提高性能,默认无此选项
13 worker_connections 1024; # 每个进程处理 1024 个连接
14 }
-
如果要提高每个进程的连接数,需要执行 “ ulimit -n 65535 ”命令临时修改本地每个进程可以打开的最大文件数
-
在Linux平台上,进行高并发 TCP 连接处理时,最高的并发数量都要收到系统对用户单一进程同事可打开文件数量的限制(这是因为系统为每个 TCP 连接都要创建一个 socket 句柄,每个 socket 句柄同事也是一个文件句柄)
-
可以用 ulinmit -a 命令查看系统允许当前用户进程打开的文件数限制
4.4 HTTP 配置
17 http {
# 文件扩展名与文件类型映射表
18 include mime.types;
# 默认的文件类型
19 default_type application/octet-stream;
20
# 日志格式设定(详细解释见下表)
21 #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
22 # '$status $body_bytes_sent "$http_referer" '
23 # '"$http_user_agent" "$http_x_forwarded_for"';
24
# 访问日志位置
25 #access_log logs/access.log main;
26
# 支持文件发送(下载)
27 sendfile on;
# 此选项允许或禁止使用socket的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
28 #tcp_nopush on;
29
# 链接保持超时时间,单位秒
30 #keepalive_timeout 0;
31 keepalive_timeout 65;
32
# 设置是否开启gzip压缩
33 #gzip on;
日志格式设定
$remote_addr 与 $http_x_forwarded_for 用以记录客户端的 ip 地址
- $remote_user
- 记录客户端用户名称
- $time_local
- 记录访问时时间与时区
- $request
- 记录请求的 url 与 http 协议
- $status
- 记录请求状态,成功为200
- $body_bytes_sent
- 记录发送给客户端文件主体内容大小
- $http_referer
- 记录从哪个页面链接访问过来的
- $http_user_agent
- 记录客户浏览器的相关信息
通常web服务器放在反向代理的后面,这样就不能获取客户的IP地址,通过 $remote_add 拿到的IP地址是反向代理服务器的IP地址
反向代理服务器在转发请求的http头信息中,可以增加 x_forwarded_for 信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址
# web 服务的监听配置
35 server {
36 listen 80; # 监听地址及端口
37 server_name localhost; # 站点域名,可以多个,中间用空格隔开
38
39 #charset koi8-r; # 默认字符集,utf-8 表示万国字符
# 根目录的配置
43 location / {
44 root html; # 根目录的位置 /usr/local/nginx/html
45 index index.html index.htm; # 默认首页文件名
46 }
52 error_page 500 502 503 504 /50x.html; # 内部错误的反馈页面
53 location = /50x.html { # 错误页面的配置
54 root html;
55 }
56 }
location 常见配置
root、alias、proxy_pass
- root(根路径配置):请求www.cc01.com/test/111.jpg,会返回文件/usr/local/nginx/html/test/111.jpg
- alias(别名配置):请求www.cc01.com/test/111.jpg,会返回文件/usr/local/nginx/html/111.jpg
- proxy_pass(反向代理配置)
- proxy_pass http://192.168.253.11:8080/; 会转发请求到http://192.168.253.11:8080/111.jpg
- proxy_pass http://192.168.253.11:8080; 会转发请求到http://192.168.253.11:8080/test/111.jpg
五、访问状态统计配置
5.1 查找模块安装
- /usr/local/nginx/sbin/nginx -V
- 查看是否已安装 stub_status
- 查看是否已安装 stub_status
5.2 修改配置文件
- cd /usr/local/nginx/conf/
- 进入目录
- cp nginx.conf nginx.conf.bak
- 源文件复制出来不要删除
- vim nginx.conf
- 修改
events {
use epoll; # 添加以提高性能
worker_connections 1024;
}
server {
listen 80;
server_name www.cc01.com; # 设置域名
charset utf-8;
location /status { # 访问位置为/status
stub_status on; # 打开状态统计功能
access_log off; # 关闭此位置的日志记录
}
5.3 重启测试
- systemctl restart nginx
- http://192.168.253.11/status
- Active connections 表示当前的活动连接数
- server accepts handled requests 表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCO握手次数、已处理的请求数
- curl http://192.168.253.11/status
- 该命令可以查看网页
- 该命令可以查看网页
- curl http://192.168.253.11/status | awk ‘Active connections/ {print $3}’
- 配合管道符合以及awk进行数据筛选
- 配合管道符合以及awk进行数据筛选
六、访问控制
6.1基于授权的访问控制
生成用户密码认证文件
yum -y install httpd-tools # 安装相应软件包
htpasswd -c /usr/local/nginx/passwd.db cc01 # 设置用户及密码
New password:
Re-type new password:
Adding password for user cc01
chown nginx /usr/local/nginx/passwd.db # 更改文件用户名,否则无法识别
chmod 400 /usr/local/nginx/passwd.db # 为了安全,只设置只读权限
配置主配置文件
- vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
auth_basic " secret"; # 设置密码提示框文字信息
auth_basic_user_file /usr/local/nginx/passwd.db;
}
重启测试
- systemctl restart nginx
6.2 基于客户端的访问控制
规则
- deny IP/IP段:拒绝某个 IP 或 IP段 的客户端访问
- allow IP/IP段:允许某个 IP 或 IP 段的客户端访问
- 规则从上往下,匹配则停止
测试
- vim /usr/local/nginx/conf/nginx.conf
deny 192.168.253.xx; # 拒绝访问的IP
allow all; # 允许所有访问
七、基于域名的 Nginx 虚拟主机
7.1 设置域名解析
- echo “192.168.253.11 www.cc01.com www.benet.com” >> /etc/hosts
- 临时设置域名解析
7.2 准备网页文档
mkdir -p /var/www/html/benet
mkdir -p /var/www/html/cc01
echo "<h1>hello cc01</h1>" > /var/www/html/cc01/index.html # 创建网页内容
echo "<h1>hello benet</h1>" > /var/www/html/benet/index.html
7.3 修改配置文件
- vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cc01.com; # 设置域名
charset utf-8;
access_log logs/www.cc01.access.log; # 日志名
location / {
root /var/www/html/cc01; # 工作目录
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name www.benet.com;
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /var/www/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
7.4 测试
- systemctl restart nginx
八、基于 IP 的nginx虚拟主机
8.1 设置虚拟网卡
- ifconfig ens33:1 192.168.253.111 netmask 255.255.255.0
修改配置文件
server {
listen 192.168.253.11:80 # 监听ip
server_name www.cc01.com;
charset utf-8;
access_log logs/www.cc01.access.log;
location / {
root /var/www/html/cc01;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 192.168.253.111:80;
server_name www.benet.com;
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /var/www/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
九、基于端口的nginx虚拟主机
修改配置文件
server {
listen 192.168.253.11:666 # 端口监听666
server_name www.cc01.com;
charset utf-8;
access_log logs/www.cc01.access.log;
location / {
root /var/www/html/cc01;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 192.168.253.11:888; # 监听888
server_name www.benet.com;
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /var/www/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
以上是关于LNMP之Nginx! 服务部署以及配置文件的各种用处的主要内容,如果未能解决你的问题,请参考以下文章
实现LNMP架构,并部署WordPress以及配置NGINX虚拟主机