Linux基础—nginx入门和参数配置
web服务器(nginx):接受HTTP请求(如www.baidu.com)并返回数据
web框架(django,flask):开发web应用程序,处理接收到的数据。
1.什么是nginx
nginx是一个开源的支持高性能,高并发的www服务和代理服务软件,是由俄罗斯人lgor sysoev开发的,作者将源代码开源出来供全球使用。
nginx比它的上一个版本apache性能改进了许多,nginx占用的系统资源更少,支持更高的并发链接,有更高的访问效率。
安装也更为方便,灵活。
2.tengine介绍
Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。
Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
二、nginx的安装
1.安装环境准备
1.安装gcc
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装。
yum install gcc-c++
2.PCRE pcre-devl安装
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。
yum install -y pcre pcre-devel
3.zlib安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
yum install -y zlib zlib-devel
4.openSSL安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
yum install -y openssl-devel
这里提供快捷的安装缩写方式。
yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
2.安装tenginx(nginx步骤同)
安装nginx之前,确认系统中有没有已经安装过nginx,如果有要先卸载
yum remove nginx # 卸载nginx
1.下载源码包
wget http://tengine.taobao.org/download/tengine-2.3.1.tar.gz
2.解压缩源码包
tar -zxvf tengine-2.3.1.tar.gz
3.进入文件夹tengine-2.3.1,执行如下命令,并开启了tengine状态监测
./configure --prefix=/opt/tengine231/ --with-http_ssl_module --with-http_stub_status_module # 指定安装文件位置,并开启tengine状态监测 make && make install # 编译然后安装
4.nginx环境变量配置
vim /etc/profile # 编辑配置文件 # 添加nginx的sbin路径,也就是nginx可执行文件的目录。这里我的是/opt/tengine231/sbin PATH="..:/opt/tengine231/sbin"
5.执行配置文件,使其生效
source /etc/profile
如果不配置环境变量的话,就需要进入暗转路径下的sbin下,通过
cd tengine/sbin
./nginx # 启动nginx
6.启动nginx
nginx # 启动 nginx -s stop # 关闭,关闭进程,重新开启,pid会变化 nginx -s reload # 重新加载,平滑加载,读取配置文件,pid不会变
启动后检测服务,
netstat -tunlp | grep 80
三、nginx配置解析
1.nginx目录结构
[root@superdesktop tengine231]# ls client_body_temp fastcgi_temp logs sbin uwsgi_temp conf html proxy_temp scgi_temp
详解:
-
conf 存放nginx所有配置文件的目录,主要nginx.conf
-
html 存放nginx默认站点的目录,如index.html、error.html等
-
logs 存放nginx默认日志的目录,如error.log access.log
-
sbin 存放nginx主命令的目录,sbin/nginx
2.部署一个web站点
nginx默认站点是nginx目录下的html文件,在配置文件nginx.conf中可以查看
location /{ root html; # 这里是默认的站点html文件夹,也就是 /opt/nginx1-12/html/文件夹下的内容 index index.html index.htm; # 站点首页文件名是index.html }
如果需要部署网站的业务数据,只需要把开发好的程序全放到html目录下即可。
[root@superdesktop etc]# ls /opt/tengine231/html 50x.html index.html
访问页面时,只需要通过域名/资源,即可访问
http://www.pyyuc.cn/index.html
3.nginx主配置文件解析
Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}
来表示开始与结束。
1.CoreModule核心模块
user nobody; # ngin进程所使用的用户 worker_processes 1; # nginx运行的work进程数量,建议与cpu数量一致或auto error_log logs/error.log; # nginx错误日志,在安装路径下的logs文件家中 pid logs/nginx.pid; # nginx服务运行后产生的pid进程号
2.event事件
events {
worker_connections # 每个worker进程支持的最大连接数
use epool; # 事件驱动模型, epool默认
}
3.nginx的访问日志功能(access_log)
日志功能对每个用户访问网站的日志信息记录到指定的日志文件里,开发运维人员可以分析用户的浏览器行为,此功能由ngx_http_log_module模块负责,官网地址是:
http://nginx.org/en/docs/http/ngx_http_log_module.html
控制日志的参数
# 找到nginx.conf中的http{}代码块,然后,找到里面的如下配置 # log_format 记录日志的格式,可定义多种格式 # accsss_log 指定日志文件的路径以及格式 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 logs/access.log main;
格式配置定义:
-
log_format是日志关键字参数,不能变
-
main是日志格式指定的标签,记录日志时通过main标签选择指定的格式。
对应的参数解析:
-
$remote_addr :记录客户端ip
-
$remote_user:远程用户,没有就是 “-”
-
$time_local:对应[14/Aug/2018:18:46:52 +0800]
-
$request:对应请求信息"GET /favicon.ico HTTP/1.1"
-
$status:状态码
-
$body_bytes_sent:571字节 请求体的大小
-
$http_referer:对应“-”,由于是直接输入浏览器就是 -
-
$http_user_agent:客户端身份信息
-
$http_x_forwarded_for:记录客户端的来源真实ip 97.64.34.118
日志打印效果:
66.102.6.6 - - [14/Aug/2018:18:46:52 +0800] "GET /favicon.ico HTTP/1.1" 404 571 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon" "97.64.34.118"
4.nginx限制网站来源IP访问
如果哪天发现你的nginx很慢,或者检查access.log时候,有一个some body疯狂请求你的nginx server,那么可以禁止这个IP访问
# 在nginx.conf中,找到如下参数,修改 location / { #决绝访问,192.168.16.0网段的同学都无法访问 /24是子网掩码的意思 deny 192.168.16.0/24; root html; index index.html index.htm; allow 10.1.1.0/16; # 允许那个网段的访问 }
5.http内核模块
# 公共的配置定义在http{} http { # http层开始 ... # 使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机) # nginx的虚拟主机参数,网站的功能性参数定义 server { listen 80; # 监听端口, 默认80 server_name localhost; # 提供服务的域名或主机名 access_log host.access.log # 访问日志 # 控制网站访问路径,如同django的urls匹配,对用户的访问url进行路径分配 location / { # deny ip地址; # 禁止某些ip地址的用户访问页面,192.168.16.0,禁止某个网段访问 root /usr/share/nginx/html; # 存放网站代码路径 index index.html index.htm; # 服务器返回的默认页面文件 } # 指定错误代码, 统一定义错误页面, 错误代码重定向到新的Locaiton error_page 500 502 503 504 /50x.html; location /pic { #通过alias别名参数,去这个路径下找 alias /opt/pic/; } error_page 404 /404.html; # redirect server error pages to the static page /50x.html } ... # 第二个虚拟主机配置 'server' { ... } include /etc/nginx/conf.d/*.conf; # 包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件 } //http层结束
6.nginx的错误日志功能
error_log logs/error.log
7.nginx的404错误页面优化
在网站运行过程中,可能因为页面不存在等原因,导致网站无法正常响应请求,此时web服务会返回系统的错误码,但是默认的错误页面很不友好。
在nginx.conf,找到一个error_page,当请求状态码是404,返回一个404.html页面给用户看,并且这个文件在网页根目录下。
server { listen 80; server_name www.pythonav.cn; root html/pythonav; location / { index index.html index.htm; } # 在pythonav路径下的40x.html错误页面 error_page 400 403 404 405 /40x.html; }
四、nginx配置虚拟主机
1.nginx虚拟主机
虚拟主机是为了充分利用服务器性能,当我们的服务器运行的网站流量不高,服务器的资源没有用完,那么就是硬件资源浪费。
虚拟主机就是将一台服务器分割成多个“虚拟服务器”,每个站点使用各自的硬盘空间,由于省资源,省钱,众多网站都使用虚拟主机来部署网站。
虚拟主机的概念就是在web服务里的一个独立的网站站点,这个站点对应独立的域名(IP),具有独立的程序和资源目录,可以独立的对外提供服务。
这个独立的站点配置是在nginx.conf中使用server{}代码块标签来表示一个虚拟主机。Nginx支持多个server{}标签,即支持多个虚拟主机站点。
虚拟主机类型
-
基于域名的虚拟主机:通过不同的域名区分不同的虚拟主机,是企业应用最广的虚拟主机。
-
基于端口的虚拟主机:通过不同的端口来区分不同的虚拟主机,一般用作企业内部网站,不对外直接提供服务的后台,例如www.pythonav.cn:9000
-
基于IP的虚拟主机:通过不同的IP区分不同的虚拟主机,此类比较少见,一般业务需要多IP的常见都会在负载均衡中绑定VIP
2.nginx状态信息配置(status)
状态信息配置
nginx与php-fpm一样内建了一个状态页,对于想了解nginx的状态以及监控nginx非常有帮助。为了后续的zabbix监控,我们需要先了解一下nginx的状态页。
Nginx状态信息(status)介绍 Nginx软件在编译时又一个with-http_stub_status_module模块,这个模块功能是记录Nginx的基本访问状态信息,让使用者了解Nginx的工作状态。 要想使用状态模块,在编译时必须增加--with-http_stub_status_module参数。
检测你的nginx是否安装了status模块
[root@superdesktop conf]# /opt/tengine231/sbin/nginx -V Tengine version: Tengine/2.3.1 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=/opt/tengine231 [root@superdesktop conf]#
启动status状态功能,修改配置文件
#在访问ip/status的时候,进入状态功能 location /status { #开启nginx状态功能 stub_status on; }
平滑启动nginx
./sbin/nginx -s reload
访问status页面
通过ab压测命令检测
# 安装压测工具 httpd-tools
参数:
-n:requests 执行的请求数,即一共发起多少请求
-c:concurrency 请求并发数量
-k:启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求
压力测试执行代码
ab -kc 1000 -n 100000 http://192.168.16.122 # 测试1000个并发客户端,100000次请求
3.基于域名的多虚拟主机配置
nginx可以自动识别用户请求的域名,根据不同的域名请求服务器传输不同的内容,只需要保证服务器上有一个可用的ip地址,配置好dns解析服务。
/etc/hosts是linux系统中本地dns解析的配置文件,同样可以达到域名访问效果
单个虚拟主机配置
1.修改nginx.conf
[root@superdesktop opt]# vim tengine231/conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; 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 logs/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.lol.com; location /{ root /opt/game/lol; index index.html; } } }
上述代码配置了一个www.lol.com域名的站点,虚拟主机的部分就是server{}里的内容
2.创建站点的目录文件
[root@superdesktop opt]# mkdir -p /game/{lol,dnf} echo "<meta charset=utf8>我是lol站点" > /opt/game/lol/index.html
上述作用创建了一个html/pyyuc站点目录,对应于虚拟主机配置文件里的root根目录的设置html/pyyuc
然后生成一个首页文件index.html,内容是“我是lol站点”。
3.在windows系统中修改c:/windows/system32/drivers/etc/hosts文件
192.168.16.122 www.lol.com
4.检查nginx语法,平滑重启nginx
[root@superdesktop opt]# nginx -t nginx: the configuration file /opt/tengine231/conf/nginx.conf syntax is ok nginx: configuration file /opt/tengine231/conf/nginx.conf test is successful [root@superdesktop opt]# nginx -s reload
浏览器访问页面www.lol.com
配置多个域名的虚拟机
其实就是新增一个server{}虚拟主机
1.配置额外的虚拟主机
[root@superdesktop opt]# vim tengine231/conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; 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 logs/access.log main; sendfile on; keepalive_timeout 65; # 第一个虚拟机主机 server { listen 80; server_name www.lol.com; location /{ root /opt/game/lol; index index.html; } } # 第二个虚拟机主机 server { listen 80; server_name www.lol.com; location /{ root /opt/game/lol; index index.html; } } }
2.配置虚拟主机站点的目录和文件
[root@superdesktop opt]# mkdir -p /game/{lol,dnf} echo "<meta charset=utf8>我是lol站点" > /opt/game/lol/index.html echo "<meta charset=utf8>我是dnf站点" > /opt/game/dnf/index.html
3.配置hosts域名解析文件,在windows系统中修改c:/windows/system32/drivers/etc/hosts文件
192.168.16.122 www.dnf.com 192.168.16.122 www.lol.com
4.基于域名多虚拟机访问
[root@superdesktop opt]# curl www.lol.com <meta charset=utf8>我是lol站点 [root@superdesktop opt]# curl www.dnf.com <meta charset=utf8>我是dnf站点