1. Nginx基本概述
nginx是一个开源且高性能、可靠的http web服务、代理服务。
开源:直接获取源代码
高性能:支持海量并发
可靠:服务稳定
1.1 我们为什么选择Nginx服务
1.1.1 nginx非常轻量
功能模块少(源代码仅保留http与核心模块代码,其余不够核心代码会作为插件来安装)
代码模块化(易读,便于二次开发,对于开发人员非常友好)
1.1.2 互联网公司都选择nginx
1.nginx技术成熟,具备的功能是企业最常使用而且最需要的
2.适合当前主流架构趋势,微服务,云架构,中间层
3.统一技术栈,降低维护成本,降低技术更新成本。
1.1.3 nginx采用Epool网络模型,Apache采用select模型
select:当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下;
Epool:当用户发起请求,epool模型会直接进行处理,效率高效,并无连接限制。
Nginx典型应用场景
2. Nginx快速安装
nginx软件安装方式有很多种
1.源码编译==>Nginx(1.版本随意 2.安装复杂 3.升级繁琐)
2.epel仓库==>Nginx(1.版本较低 2.安装简单 3.配置不易读)
3.官方仓库==>Nginx(1.版本较新 2.安装简单 3.配置易读,推荐)
2.1 安装Nginx软件所需依赖包
[root@web01 ~]# yum install -y gcc gcc-c++ pcre pcre-devel openssl openssl-devel
2.2 配置Nginx官方yum源
[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key
2.3 安装Nginx服务,启动并假如开机自启
[root@web01 ~]# yum install -y nginx [root@web01 ~]# systemctl start nginx [root@web01 ~]# systemctl enable nginx
2.4 通过浏览器访问该服务器ip活url地址
2.5 检查Nginx软件版本以及编译参数
[root@web01 ~]# nginx -v nginx version: nginx/1.16.0 [root@web01 ~]# nginx -V nginx version: nginx/1.16.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' [root@web01 ~]#
2.6 Nginx配置
为了让大家更清晰的了解Nginx软件的全貌,可使用rpm -ql nginx 查看真题的目录结构及对应的功能,如下表格整理了Nginx比较重要的配置文件
2.6.1 Nginx主配置文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/nginx.conf | 配置文件 | nginx主配置文件 |
/etc/nginx/conf.d/default.conf | 配置文件 | 默认网站配置文件 |
2.6.2 Nginx代理相关参数文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/fastcgi_params | 配置文件 | fastcgi代理配置文件 |
/etc/nginx/scgi_params | 配置文件 | scgi代理配置文件 |
2.6.3 Nginx编码相关参数文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/win-utf | 配置文件 | Nginx编码转换映射文件 |
/etc/nginx/koi-utf | 配置文件 | Nginx编码转换映射文件 |
/etc/nginx/koi-win | 配置文件 | Nginx编码转换映射文件 |
/etc/nginx/mime.types | 配置文件 | Content-Type与扩展名 |
2.6.4 Nginx管理相关命令
路径 | 类型 | 作用 |
---|---|---|
/usr/sbin/nginx | 命令 | Nginx命令行管理终端工具 |
/usr/sbin/nginx-debug | 命令 | Nginx命令行与终端调试工具 |
2.6.5 Nginx日志相关目录与文件
路径 | 类型 | 作用 |
---|---|---|
/var/log/nginx | 目录 | Nginx默认存放日志目录 |
/etc/logrotate.d/nginx | 配置文件 | Nginx默认的日志切割 |
3. Nginx默认配置
Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般每个区块以一对大括号{}来表示开始与结束。
Nginx主配置文件整体分为三块进行学习,分别是CoreModule(核心模块)、EventModule(事件驱动模块)、HttpCoreModule(http内核模块)
CoreModule(核心模块)
user nginx; #Nginx进程所使用的用户 worker_processes 1; #Nginx运行的work进程数量(建议与CPU数量一致或auto) error_log /var/log/nginx/error.log warn; #Nginx错误日志存放路径(警告及警告以上的都会记录) pid /var/run/nginx.pid; #Nginx服务运行后产生的pid进程号
EventModule(事件驱动模块)
events { worker_connections 1024; #每个worker进程支持的最大连接数 use epool #事件驱动模型,epoll默认 }
HttpCoreModule(http内核模块)
http { include /etc/nginx/mime.types; #包含资源类型文件 default_type application/octet-stream; #默认以下载方式传输给浏览器(前提是该资源在mime.types中无法找到) 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; keepalive_timeout 65; #长连接超时时间 #gzip on; #是否开启压缩功能 include /etc/nginx/conf.d/*.conf; #包含的配置文件 server { listen 80; #监听端口 server_name localhost; #域名 #charset koi8-r; #字符集 #access_log /var/log/nginx/host.access.log main; #访问日志 location / { #存放网站路径 root /usr/share/nginx/html; #默认访问首页文件 index index.html index.htm; } }
**http server location扩展了解项
① http{}层下允许有许多个server{}层,一个server{}层下又允许有多个location
② http{}标签主要用来解决用户的请求与响应
③ server{}标签主要用来响应具体的某一个网站
④ location{}标签主要用于匹配网站具体URL路径**
4. Nginx搭建web网站
4.1 配置nginx配置文件
[root@web01 ~]# cat /etc/nginx/conf.d/game.conf server { listen 80; server_name game.oldboy.com; location / { root /data; index index.html; } }
4.2 放置游戏源代码文件至nginx配置文件root指定的目录
[root@web01 ~]# mkdir /data && cd /data [root@web01 data]# rz html5.zip [root@web01 data]# unzip html5.zip [root@web01 data]# ll total 18848 drwxr-xr-x 23 root root 4096 Mar 5 2015 ceshi drwxr-xr-x 42 root root 4096 Mar 5 2015 game -rw-r--r-- 1 root root 19248295 Jan 17 2019 html5.zip drwxr-xr-x 2 root root 4096 Mar 5 2015 img -rwxr-xr-x 1 root root 30312 Mar 5 2015 index.html drwxrwxr-x 5 root root 124 Dec 9 2018 __MACOSX -rwxr-xr-x 1 root root 578 Mar 5 2015 readme.txt [root@web01 data]#
4.3 检查nginx语法是否存在错误
[root@web01 data]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
4.4 重新加载nginx [ reload | restart ]
[root@web01 data]# systemctl restart nginx
4.5 配置hosts访问域名
10.0.0.7 game.oldboy.com
5. Nginx虚拟主机
通常在企业中可能会有很多业务系统,那么多套业务服务如何使用nginx配置?
如果使用如上方式部署,则需要多台服务器配置nginx,但如果使用虚拟主机方式,则在同一个nginx上运行多套单独服务,这些服务是相互独立的,简单来说,看似多套业务系统,实则可以运行在一台nginx服务上
5.1 Nginx虚拟主机Nginx配置虚拟主机有三种方式:
方式一:基于主机多IP方式方式二:基于端口的配置方式方式三:基于多个hosts名称方式(多域名方式)
5.2 基于多IP的虚拟主机配置实战
基于多IP的方式,有如下两种方式:
5.2.1 配置多网卡多IP的方式
样板:
server { ... listen 10.0.0.10:80; ... } server { ... listen 10.0.0.11:80; ... }
实例:
#1.修改nginx配置 [root@web01 ~]# cat /etc/nginx/conf.d/ip.conf server { listen 10.0.0.7:80; server_name _; location / { root /code_ip_eth0; index index.html; } } server { listen 172.16.1.7:80; server_name _; location / { root /code_ip_eth1; index index.html; } } #2.创建配置指定目录 [root@web01 ~]# echo "Eth0" > /code_ip_eth0/index.html [root@web01 ~]# echo "Eth1" > /code_ip_eth1/index.html #3.重启nginx服务 [root@web01 ~]# systemctl restart nginx #4.使用curl命令测试访问 [root@web01 ~]# curl 10.0.0.7 Eth0 [root@web01 ~]# curl 172.16.1.7 Eth1 [root@web01 ~]#
5.2.2 配置单网卡多IP的方式(没必要)
#添加一个IP [root@web01 ~]# ip addr add 10.0.0.11/24 dev eth0 #虚拟机配置方案 [root@web01 ~]# cat /etc/nginx/conf/conf.d/addr1.conf server { ... listen 10.0.0.7:80; ... } [root@web01 ~]# cat /etc/nginx/conf/conf.d/addr2.conf server { ... listen 10.0.0.11:80; ... }
5.3 基于端口的虚拟主机配置实战
样板:
server { ... listen 81; ... } server { ... listen 82; ... }
实例:
#1.修改nginx配置 [root@web01 ~]# cat /etc/nginx/conf.d/port.conf server { listen 81; location / { root /code_81; index index.html; } } server { listen 82; location / { root /code_82; index index.html; } } #2.创建指定目录并写入文件 [root@web01 ~]# mkdir /code_8{1..2} [root@web01 ~]# echo "81" > /code_81/index.html [root@web01 ~]# echo "82" > /code_82/index.html #3.重启nginx服务 [root@web01 ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@web01 ~]# systemctl restart nginx #浏览器访问测试 10.0.0.7:81 10.0.0.7:82
5.4 基于多个hosts的虚拟主机配置实战
样板:
server { ... listen 80; server_name test1.oldboy.com; ... } server { ... listen 80; server_name test2.oldboy.com; ... }
实例:
#1.添加多主机nginx配置文件 [root@web01 ~]# cat /etc/nginx/conf.d/test1.oldboy.com.conf server { listen 80; server_name test1.oldboy.com; location / { root /code/test1; index index.html; } } [root@web01 ~]# cat /etc/nginx/conf.d/test2.oldboy.com.conf server { listen 80; server_name test2.oldboy.com; location / { root /code/test2; index index.html; } } [root@web01 ~]# #2.创建指定目录并写入文件 [root@web01 ~]# mkdir /code/test{1..2} [root@web01 ~]# echo "test1_server" > /code/test1/index.html [root@web01 ~]# echo "test2_server" > /code/test2/index.html #3.重启nginx服务 [root@web01 ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@web01 ~]# systemctl restart nginx #配置域名解析 windows下 C:\Windows\System32\drivers\etc\hosts 10.0.0.7 test1.oldboy.com 10.0.0.7 test2.oldboy.com #浏览器访问测试 test1.oldboy.com test2.oldboy.com
6. Nginx日志管理
Nginx有非常流火的日志记录模式,每个级别的配置可以有个字独立的访问日志。日志格式通过log_format命令定义格式。
6.1 nginx自查
1.修改完配置记得使用 nginx -t 检查语法
2.如果没有检查语法,直接重载导致报错。systemctl status nginx -l 查看错误信息
6.2 配置语法: 包括: error.log access.log
log_format命令定义日志格式语法
Syntax: log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context: http
6.3 Nginx默认定义语法
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
6.4 Nginx日志格式允许包含的内置变量
$remote_addr #表示客户端地址 $remote_user #http客户端请求nginx认证用户名 $time_local #Nginx的时间 $request #Request请求行, GET等方法、http协议版本 $status #respoence返回状态码 $body_bytes_sent #从服务端响应给客户端body信息大小 $http_referer #http上一级页面, 防盗链、用户行为分析 $http_user_agent #http头部信息, 客户端访问设备 $http_x_forwarded_for #http请求携带的http信息 $time_iso8601 #记录ISO8601标准格式下的本地时间 $bytes_sent #发送给客户端的总字节数 $msec #日志写入时间,单位为秒,精度是毫秒 $request_length #请求的长度(包括请求行,请求头和请求正文) $request_time #请求话费的时间,单位为秒,精度毫秒 # 注:如果Nginx位于负载均衡器,nginx反向代理之后,web服务器无法直接获取到客户端真是的IP地址。 # $remote_addr 获取的是反向代理的IP地址;反向代理服务器在转发请求的http头信息中。 # 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。
6.5 access_log日志配置语法
Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log off; Default: access_log logs/access.log combined; Context: http, server, location, if in location, limit_except
6.6 nginx access_log日志配置实践
server { listen 80; server_name code.oldboy.com; #将当前的server网站的访问日志记录至对应的目录,使用main格式 access_log /var/log/nginx/code.oldboy.com.log main; location / { root /code; } #当有人请求改favicon.ico时,不记录日志 location /favicon.ico { access_log off; return 200; } }
6.7 nginx 日志切割logrotate
[root@web01 ~]# cat /etc/logrotate.d/nginx /var/log/nginx/*.log { daily #每天切割日志 missingok #日志丢失忽略 rotate 52 #日志保留52天 compress #日志文件压缩 delaycompress #延迟压缩日志 notifempty #不切割空文件 create 640 nginx adm #日志文件权限 sharedscripts postrotate #切割日志执行的命令 if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript } [root@web01 ~]#
6.8 nginx 日志切割后效果
[root@web01 ~]# cd /var/log/nginx/ [root@web01 nginx]# ll total 20 -rw-r----- 1 nginx adm 3162 Jul 31 21:27 access.log -rw-r----- 1 nginx adm 410 Jul 30 17:41 access.log-20190731 -rw-r----- 1 nginx adm 2036 Jul 31 21:33 error.log -rw-r----- 1 nginx adm 246 Jul 30 17:41 error.log-20190731 -rw-r--r-- 1 root root 2667 Jul 31 21:33 test1.log