nginx服务的软件特点:
1) 支持高并发,消耗内存资源少
2) 具有多种功能
网站web服务功能 --- apache
网站负载均衡功能 --- LVS
网站缓存服务 --- Squid
3) 在多种系统平台都可以进行部署
4) nginx实现网络通讯时使用的时异步网络IO模型: epoll模型(apache -- select模型)
epoll模型:
宿舍管理员: 找人,查看人员登记信息
幼儿园阿姨: 小朋友上厕所, 都站在教室的某个位置
select模型
宿舍管理员: 找人,一个一个屋子去问, --线性轮询
幼儿园阿姨: 小朋友上厕所, 一个一个小朋友去询问
nginx软件的安装部署过程:
编译安装
第一个步骤:
wget http://nginx.org/download/nginx-1.16.0.tar.gz
PS: 解决软件的依赖 openssl-devel pcre-devel
第二个步骤:
解压下载好的软件, 并进入到软件目录中
第三个步骤:
编译安装三步曲
a 进行配置操作
./configure --help
./configure --prefix= --user=USER
--prefix=PATH set installation prefix
指定程序安装路径
--user=USER set non-privileged user for worker processes
设置一个虚拟用户管理worker进程(安全)
--group=GROUP set non-privileged group for worker processes
设置一个虚拟用户组管理worker进程(安全)
b 进行软件的编译过程:
make 编译(翻译)
C(英国人) 代码(任务文件) 系统识别 翻译 系统(中国人)处理代码
翻译效率比较低 翻译官(gcc)
python(日本人) 代码(任务文件) 系统识别 翻译 系统(中国人)处理代码
翻译效率比较高 百度翻译(python解释器)
c 编译安装过程
make install
yum安装
使用官方yum源进行安装 安装的是最新版本 软件目录结构比较标准 (推荐)
使用非官方yum源进行安装 安装的不是最新版 目录结构会发生变化
官方yum
yum官方源安装方法:
第一个历程: 更新nginx官方yum源,
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
第二个历程: yum安装nginx软件
yum install -y nginx
第三个历程: 启动nginx服务,检查服务是否安装正确
systemctl start nginx
systemctl enable nginx
测试访问nginx服务
nginx目录结构
[root@localhost ~]# rpm -ql nginx
/etc/logrotate.d/nginx #nginx日期切割脚本(被rsyslog托管)
/etc/nginx #nginx的配置文件主目录
/etc/nginx/conf.d #附加配置文件目录
/etc/nginx/conf.d/default.conf #nginx初始提供的默认子配置文件
/etc/nginx/fastcgi_params #定义了一些与fastcgi协议有关的变量的配置文件
/etc/nginx/koi-utf #与编码相关的配置文件(不懂就保持默认,不要随便更改和删除)
/etc/nginx/koi-win #与编码相关的配置文件(不懂就保持默认,不要随便更改和删除)
/etc/nginx/mime.types (能识别哪些文件类型)
#nginx的mime文件(定义文件类型和映射关系的,具体涉及到http相应报文中的属性值)
/etc/nginx/modules #nginx模块文件安装路径(是一个链接文件,实际指向/usr/lib64/nginx/modules)
/etc/nginx/nginx.conf #nginx的主配置文件
/etc/nginx/scgi_params #定义了一些与scgi协议有关的变量的配置文件
/etc/nginx/uwsgi_params #定义了一些与uwsgi协议有关的变量的配置文件
/etc/nginx/win-utf #与编码相关的配置文件(不懂就保持默认,不要随便更改和删除)
/etc/sysconfig/nginx #定义一些与nginx有关变量设置的配置文件(可能与管理脚本有关的配置文件)
/etc/sysconfig/nginx-debug #定义了nginx运行与调试模式下,与nginx有关变量设置的配置文件(可能与管理脚本有关的配置文件)
/usr/lib/systemd/system/nginx-debug.service #托管于systemd管理的运行与调试模式下的服务脚本(nginx调试模式的unit文件)
/usr/lib/systemd/system/nginx.service #托管于systemd管理的nginx的服务脚本(nginx的unit文件)
/usr/lib64/nginx #nginx模块文件主目录
/usr/lib64/nginx/modules #nginx的模块文件目录
/usr/libexec/initscripts/legacy-actions/nginx #nginx自己提供一些功能脚本目录(特殊作用的)
/usr/libexec/initscripts/legacy-actions/nginx/check-reload #检测nginx服务载入是否异常的脚本
/usr/libexec/initscripts/legacy-actions/nginx/upgrade #与nginx升级相关的脚本
/usr/sbin/nginx #nginx主程序文件
/usr/sbin/nginx-debug #nginx运行于调试模式下的住程序文件
/usr/share/doc/nginx-1.14.1 #nginx的文档路径
/usr/share/doc/nginx-1.14.1/COPYRIGHT #版权说明相关的配置文件
/usr/share/man/man8/nginx.8.gz #nginx的man手册文件
/usr/share/nginx #nginx的默认站点路径
/usr/share/nginx/html #nginx默认提供的html文件的路径
/usr/share/nginx/html/50x.html #50x状态码相应的html文件
/usr/share/nginx/html/index.html #默认的主页文件
/var/cache/nginx #nginx缓存相关的路径
/var/log/nginx #nginx的日志记录的路径
重要:
- /etc/nginx 配置文件
- /var/log/nginx 日志文件
- /usr/bin/nginx 命令文件
- /usr/share/nginx/html 站点目录???
图片 附件信息 音频 视频
日志切割 /etc/logrotate.d
实现nginx日志文件定时切割处理
日志切割方法一: 利用脚本实现切割
#!/bin/bash
mv /var/log/nginx/access.log /var/log/nginx/access_$(date +%F).log
systemctl restart nginx
日志切割方法二: 利用专用文件切割程序--logrotate
https://zhuanlan.zhihu.com/p/24880144
https://blog.csdn.net/forthemyth/article/details/44062529
切割权限问题:
https://blog.csdn.net/weixin_33878457/article/details/91966448
vim /etc/logrotate.conf
# rotate log files weekly
weekly --- 定义默认日志切割的周期
# keep 4 weeks worth of backlogs
rotate 4 --- 定义只保留几个切割后的文件
# create new (empty) log files after rotating old ones
create --- 创建出一个相同的源文件
# use date as a suffix of the rotated file
dateext --- 定义角标(扩展名称信息)
# uncomment this if you want your log files compressed
#compress --- 是否对切割后的文件进行压缩处理
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d --- 加载包含/etc/logrotate.d/目录中文件配置
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp { --- 单独对某个文件进行切割配置
monthly
create 0664 root utmp
minsize 1M --- 最小大小为1M,小于1M不进行切割
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
nginx服务配置文件
/etc/nginx/nginx.conf --- 主配置文件
删除掉空行便于阅读
grep -v "^$" nginx.conf.bak > nginx.conf
第一个部分: 配置文件主区域配置
user www; --- 定义worker进程管理的用户
补充: nginx的进程
master process: 主进程 ---管理服务是否能够正常运行 boss
worker process: 工作进程 ---处理用户的访问请求 员工
worker_processes 2; ---定义有几个worker进程 == CPU核数 / 核数的2倍
error_log /var/log/nginx/error.log warn; --- 定义错误日志路径信息
pid /var/run/nginx.pid; --- 定义pid文件路径信息
第二个部分: 配置文件事件区域
events {
worker_connections 1024; --- 一个worker进程可以同时接收1024访问请求
}
第三个部分: 配置http区域
http {
include /etc/nginx/mime.types; --- 加载一个配置文件
default_type application/octet-stream; --- 指定默认识别文件类型
log_format oldboy '$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 oldboy;
--- 指定日志路径
sendfile on; ???
#tcp_nopush on; ???
keepalive_timeout 65; --- 超时时间
#gzip on;
include /etc/nginx/conf.d/*.conf; --- 加载一个配置文件
}
/etc/nginx/nginx.d/default --- 扩展配置(虚拟主机配置文件)
第四个部分: server区域信息(配置一个网站 www/bbs/blog -- 一个虚拟主机)
server {
listen 8080; --- 指定监听的端口
server_name www.oldboy.com; --- 指定网站域名
root /usr/share/nginx/html; --- 定义站点目录的位置
index index.html index.htm; --- 定义首页文件
error_page 500 502 503 504 /50x.html; --- 优雅显示页面信息
location = /50x.html {
root /usr/share/nginx/html;
}
}
nginx服务一些常见应用 (模块功能)
nginx服务的企业应用
利用nginx服务搭建一个网站(www)
第一个历程: 编写虚拟主机配置文件
cd /etc/nginx/conf.d/
vim www.conf
server {
listen 80;
server_name www.oldboy.com;
location /oldboy {
root /usr/share/nginx/html;
index oldboy.html;
}
}
location解释day39_03
第二个历程: 需要获取开发人员编写的网站代码
<html>
<meta charset="utf-8">
<head>
<title>00000标题000000</title>
</head>
<body>
test00000000000001
<table border=1>
<tr> <td>01</td> <td>oldboy</td> </tr>
<tr> <td>02</td> <td>oldgirl</td> </tr>
<tr> <td>03</td> <td>olddog</td> </tr>
</table>
<a href="http://blog.oldboyedu.com">
<img src="oldboy.jpg" />
</a>
</body>
</html>
第三个历程: 重启nginx服务(平滑重启)
两种方法:
systemctl reload nginx
nginx -s reload
nginx命令参数
-t: test configuration and exit
检查测试配置文件语法
-s: send signal to a master process: stop, quit, reopen, reload
控制服务停止或者重新启动
第四个历程: 编写DNS配置信息
真实域名: 在阿里云上进行DNS解析记录配置
模拟域名: 在windows主机的hosts文件中进行配置即可
C:\Windows\System32\drivers\etc\hosts
第五个历程: 进行测试访问
浏览器中: http://www.oldboy.com
部署搭建网站常见错误:
01. 网站服务配置文件编写不正确
404 错误
解决方法一: 修改nginx配置文件---location
解决方法二: 在站点目录中创建相应目录或文件数据信息
403 错误
解决方法一: 不要禁止访问
解决方法二: 因为没有首页文件
02. DNS信息配置不正确
03. nginx配置文件修改一定要重启服务;
站点目录中代码文件信息调整,不需要重启服务
利用nginx服务搭建多网站
www bbs blog
第一个历程: 创建多个虚拟主机配置文件
bbs.conf
server {
listen 80;
server_name bbs.oldboy.com;
location / {
root /html/bbs;
index index.html;
}
}
blog.conf
server {
listen 80;
server_name blog.oldboy.com;
location / {
root /html/blog;
index index.html;
}
}
www.conf
server {
listen 80;
server_name www.oldboy.com;
location / {
root /html/www;
index index.html;
}
}
systemctl reload nginx
第二个历程: 创建站点目录和目录中首页文件
[root@web01 conf.d]# mkdir /html/{www,bbs,blog} -p
[root@web01 conf.d]# for name in {www,bbs,blog};do echo "10.0.0.7 $name.oldboy.com" >/html/$name/index.html ;done
[root@web01 conf.d]# for name in {www,bbs,blog};do cat /html/$name/index.html ;done
10.0.0.7 www.oldboy.com
10.0.0.7 bbs.oldboy.com
10.0.0.7 blog.oldboy.com
第三个历程: 编写hosts解析文件
10.0.0.7 www.oldboy.com bbs.oldboy.com blog.oldboy.com
第四个历程: 进行访问测试
- 利用windows进行浏览器访问测试
- 利用linux进行命令访问测试
[root@web01 conf.d]# curl www.oldboy.com 10.0.0.7 www.oldboy.com [root@web01 conf.d]# curl bbs.oldboy.com 10.0.0.7 bbs.oldboy.com [root@web01 conf.d]# curl blog.oldboy.com 10.0.0.7 blog.oldboy.com
企业中虚拟主机访问方式
a 基于域名的方式进行访问(上面)
绑定了多个域名时,如果通过ip访问,想指定先访问哪个虚机,就在nginx.conf中include上面再加个include
#gzip on;
include /etc/nginx/conf.d/xxx.conf;
include /etc/nginx/conf.d/*.conf;
b 基于地址的方式进行访问: (只能用指定地址访问) --- 负载均衡+高可用服务
server {
listen 10.0.0.7:80; # 只监听10.0.0.7这块网卡的80端口
server_name www.oldboy.com;
location / {
root /html/www;
index index.html;
}
}
PS: 服务配置文件中涉及到地址修改,必须重启nginx服务,不能平滑重启
c 基于端口的方式进行访问: zabbix服务(apache:80) + web服务(nginx:80) --> 主机
server {
listen 8080;
server_name www.oldboy.com;
location / {
root /html/www;
index index.html;
}
}
网站页面的访问原理
01. 将域名进行解析 www.oldboy.com --- 10.0.0.7
02. 建立TCP的连接(四层协议)
10.0.0.7 目标端口 8080
03. 根据应用层HTTP协议发出请求
请求报文: hosts: bbs.oldboy.com
04. 没有相同域名的server主机,会找满足端口要求的第一个主机
显示主机的网站页面
企业中网站的安全访问配置
根据用户访问的地址进行控制
10.0.0.0/24 www.oldboy.com/AV/ 不能访问
172.16.1.0/24 www.oldboy.com/AV/ 可以访问
nginx访问模块: ngx_http_access_module
举例配置:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
指令用法
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
第一个历程: 编写配置文件
[root@web01 conf.d]# vim www.conf
server {
listen 80;
server_name www.oldboy.com;
location / {
root /html/www;
index index.html;
}
location /AV {
deny 10.0.0.0/24;
allow 172.16.1.0/24;
root /html/www;
index index.html;
}
}
补充:
location外面的信息, 全局配置信息
location里面的信息, 局部配置信息
根据用户访问进行认证
nginx认证模块: ngx_http_auth_basic_module
举例配置:
location / {
auth_basic "closed site"; --- 开启认证功能
auth_basic_user_file conf/htpasswd; --- 加载用户密码文件
}
第一个历程: 编写虚拟主机配置文件
server {
listen 80;
server_name www.oldboy.com;
location / {
root /html/www;
index index.html;
auth_basic "oldboy-sz-01";
auth_basic_user_file password/htpasswd; # 相对于/etc/nginx/
}
第二个历程: 创建密码文件(文件中密码信息必须是密文的)
htpasswd 创建一个有密文信息的密码文件
[root@web01 conf.d]# rpm -qf `which htpasswd`
httpd-tools-2.4.6-89.el7.centos.x86_64
[root@web01 /etc/nginx/password]# htpasswd -cb ./htpasswd root 123456
Adding password for user root
修改密码文件权限: ???
chmod 600 ./htpasswd
权限更改为worker进程的属主
否则
500 Internal Server Error
- 内部程序代码编写有问题
- 程序服务中文件权限不正确
curl命令参数:
-u, --user USER[:PASSWORD] Server user and password
登录验证[root@web01 password]# curl www.oldboy.com -u oldboy Enter host password for user 'oldboy': 10.0.0.7 www.oldboy.com [root@web01 password]# curl www.oldboy.com -u oldboy:123456 10.0.0.7 www.oldboy.com
htpasswd命令参数说明:-c Create a new file. ***** 创建一个密码文件 -n Don't update file; display results on stdout. 不会更新文件; 显示文件内容信息 -b Use the password from the command line rather than prompting for it. ***** 免交互方式输入用户密码信息 -i Read password from stdin without verification (for script usage). 读取密码采用标准输入方式,并不做检查 ??? -m Force MD5 encryption of the password (default). md5的加密算法 -B Force bcrypt encryption of the password (very secure). 使用bcrypt对密码进行加密 -C Set the computing time used for the bcrypt algorithm (higher is more secure but slower, default: 5, valid: 4 to 31). 使用bcrypt algorithm对密码进行加密 -d Force CRYPT encryption of the password (8 chars max, insecure). 密码加密方式 -s Force SHA encryption of the password (insecure). 加密方式 -p Do not encrypt the password (plaintext, insecure). 不进行加密 -D Delete the specified user. 删除指定用户 -v Verify password for the specified user.
利用nginx服务搭建网站文件共享服务器
nginx模块功能: ngx_http_autoindex_module
第一个步骤: 编写配置文件(www.conf)
Syntax: autoindex on | off;
Default:
autoindex off;
Context: http, server, location
server {
listen 80;
server_name www.oldboy.com;
location / {
root /html/www;
auth_basic "oldboy-sz-01";
auth_basic_user_file password/htpasswd;
autoindex on; --- 开启nginx站点目录索引功能
}
PS:
- 需要将首页文件进行删除
- mime.types媒体资源类型文件作用
文件中有的扩展名信息资源, 进行访问时会直接看到数据信息
文件中没有的扩展名信息资源, 进行访问时会直接下载资源
如,想直接下载txt文件,就把txt删掉
网站页面目录数据,中文出现乱码,如何解决:location / { root /html/www; #index index.html; auth_basic "oldboy-sz-01"; auth_basic_user_file password/htpasswd; autoindex on; charset utf-8; --- 修改目录结构中出现的中文乱码问题 }
利用nginx服务搭配置文件别名功能
第一个历程: 编写配置文件
server_name www.oldboy.com old.com;
第二个历程: 配置好解析信息
作用:
- 编写网站访问测试
- 定位要访问的网站服务器
利用nginx状态模块功能对网站进行监控
http://www.ttlsa.com/nginx/nginx-status-detail/
状态模块: ngx_http_stub_status_module
location = /basic_status {
stub_status;
}
第一个历程: 编写配置文件
[root@web01 conf.d]# vim state.conf
server {
listen 80;
server_name state.oldboy.com;
stub_status;
}
第二个历程: 重启nginx服务,并且编写解析文件
systemctl reload nginx
10.0.0.7 state.oldboy.com
状态页解释
Active connections: 激活的连接数信息 4000用户 3500
accepts: 接收的连接数汇总(综合) TCP
handled: 处理的连接数汇总(综合) TCP
requests: 总计的请求数量 HTTP协议请求
Reading: nginx服务读取请求报文的数量 100人点餐
Writing: nginx服务响应报文信息数量 100人响应
Waiting: nginx队列机制,要处理(读取或者响应保存进行保存) 监控
nginx日志功能配置
默认访问日志: /var/log/nginx/access.log ngx_http_log_module
定义日志内容格式(主配置文件)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '`
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# $remote_addr 显示用户访问源IP地址信息
# $remote_user 显示认证的用户名信息
# [$time_local] 显示访问网站时间
# "$request" 请求报文的请求行信息
# $status 用户访问网站状态码信息
# $body_bytes_sent 显示响应的数据尺寸信息
# $http_referer 记录调用网站资源的连接地址信息(防止用户盗链)
# $http_user_agent 记录用户使用什么客户端软件进行访问页面的 (谷歌 火狐 IE 安卓 iphone)
# $http_x_forwarded_for ??? 负载均衡
虚拟主机配置文件中可单独配置日志:
access_log /var/log/nginx/access.log main; 调用日志格式
错误日志: /var/log/nginx/error.log --- Core functionality
Syntax: error_log file [level]; 指定错误日志路径以及错误日志记录的级别
Default: error_log logs/error.log error;
Context: main, http, mail, stream, server, location
错误级别:
默认error_log /var/log/nginx/error.log warn;
debug :调试级别, 服务运行的状态信息和错误信息详细显示 信息越多
info :信息级别, 只显示重要的运行信息和错误信息
notice :通知级别: 更加重要的信息进行通知说明
warn :警告级别: 可能出现了一些错误信息,但不影响服务运行
error :错误级别: 服务运行已经出现了错误,需要进行纠正 推荐选择
crit :严重级别: 必须进行修改调整
alert :严重警告级别: 即警告,而且必须进行错误修改
emerg :灾难级别: 服务已经不能正常运行 信息越少
PS: 日志文件信息需要做切割处理 新版本yum安装的通过lograte自动切割了,老版本可能需要手动切割
nginx服务location作用说明
模块说明: ngx_http_core_module
location进行匹配(uri)
错误页面优雅显示
location /oldboy {
root /html/www;
error_page 404 /oldboy.jpg;
}
location /oldgirl {
root /html/www;
error_page 404 /oldgirl.jpg;
}
location详细配置:
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
location = / { --- 精确匹配 优先级01 最高
[ configuration A ]
}
location / { --- 默认匹配 优先级04 最低
[ configuration B ]
}
location /documents/ { --- 按照目录进行匹配 优先级03
[ configuration C ]
}
location ^~ /images/ { --- 优先匹配/不识别uri信息中符号信息 优先级02
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ { --- 不区分大小写进行匹配(不带*区分大小写) 优先级03
[ configuration E ]
}
利用nginx实现页面跳转功能
利用rewrite模块是跳转功能: http_rewrite_module
Syntax: rewrite regex replacement [flag]; rewite 匹配的正则信息 替换成什么信息
Default: —
Context: server, location, if
rewrite www.oldboy.com/(.*) http://www.oldboy.com/$1 permanent; 重写规则配置
^/ (.*)
baidu.com / oldboy.html 跳转方式
www.baidu.com/oldboy.html
跳转方式:
永久跳转: permanent 301 会将跳转信息进项缓存
临时跳转: redirect 302 不会缓存跳转信息
出现无限跳转如何解决:
第一种方法: 利用不同server区块配置打破循环
server {
server_name oldboy.com;
rewrite ^/(.*) http://www.oldboy.com/$1 permanent;
}
server {
listen 80;
server_name www.oldboy.com;
......
第二种方法: 利用if判断实现打破循环
server {
listen 80;
server_name oldboy.com www.oldboy.com;
if ($host ~* "^oldboy.com$") {
rewrite ^/(.*) http://www.oldboy.com/$1 permanent;
}
通过rewrite可以把长地址跳转为短地址www.oldboy.com/oldboy01/oldboy02/oldboy.jpg --- www.oldboy.com/oldboy.jpg
发表评论