nginx基础

nginx基础

nginx概述

nginx 是一个高性能的Web和反向代理服务器,它具有非常优越的特性
nginx 能支持高达50000个并发连接数的响应,用于高连接并发情况 使用epol and kqueue作为开发模型
nginx 作为负载均衡服务器:nginx 即可在内部直接支持和PHP程序对外进行服务,也可支持作为HTTP代理服务器对外进行服务
nginx采用C进行编写,不论系统资源开销还是CPU使用效率都比Perlbal要好

nginx是一个开源且高能、可靠的http、web服务、代理服务
开源:直接获取源代码
高性能:支持海量并发
可靠:服务稳定

为什么选择nginx服务?

`Nginx 非常轻量
	功能模块少(源代码仅保留http与核心模块代码其余不够核心代码会作为插件来安装
	代码模块化(易读,便于二次开发,对于开发人员非常友好)
`互联网公司都选择Nginx
	1技术成熟具备的功能是企业最常使用而且最需要的
	2适合当前主流架构趋势微服务、云架构、中间层
	3统技术栈降低维护成本降低技术更新成本。
`Nginx 采用网络模型,Apache 采用Select 模型
	Select :当用户发起一次请求,模型就会进行一次遍历扫描,从而导致性能低下。
	Pool .:当用户发起请求,模型会直接进行处理,效率高效,并无连接限制

nginx应用场景

nginx的安装

'yum方式(官方)  必须使用官方安装

[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

gpgcheck =1 是检验软件包

#查看版本
[root@web01 ~]# nginx -v
nginx version: nginx/1.16.1
'编译安装

[root@web01 ~]# nginx -V
nginx version: nginx/1.16.1
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 ~]# wget http://nginx.org/download/nginx-1.16.1.tar.gz  链接是在官网上复制的
[root@web01 ~]# tar xf nginx-1.16.1.tar.gz
[root@web01 ~]# cd nginx-1.16.1/
[root@web01 nginx-1.14.2]# ./configure后面加上刚才的那一堆参数
[root@web01 ~/nginx-1.16.1]# yum install gcc gcc-c++
[root@web01 ~/nginx-1.16.1]# yum -y install pcre pcre-devel
[root@web01 ~/nginx-1.16.1]# yum -y install openssl openssl-devel
少什么下什么
然后没有报错就行了

目录结构及重要配置文件

[root@web01 ~]# rpm -ql nginx                             

Nginx 主配置文件

路径 类型 作用
/ etc / nginx / nginx . conf 配置文件 nginx =主配置文件
/ etc / nginx / conf . d / default . conf 配置文件 默认网站配置文件 虚拟主机配置

Nginx 代理相关参数文件

路径 类型 作用
/ etc / nginx /fastcgi_params 配置文件 Fastcgi 代理配置文件 PHP相关
/ etc / nginx /scgi_params 配置文件 scgi代理配置文件
/ etc / nginx / uwsgi_params 配置文件 uwsgi代理配置文件

Nginx 编码相关配置文件

路径 类型 作用
/ etc / nginx / win - utf 配置文件 Nginx 编码转换映射文件
/ etc / nginx / koi - utf 配置文件 Nginx 编码转换映射文件
/ etc / nginx / koi - win 配置文件 Nginx 编码转换映射文件
/ etc / nginx / mime types 配置文件 Content -type与扩展名 媒体类型

Nginx管理相关命令

路径 类型 作用
/usr/sbin/nginx 命令 Nginx命令行管理终端工具
/use/sbin/nginx-debug 命令 Nginx命令行与终端调试工具

Nginx日志相关目录与文件

路径 类型 作用
/var/log/nginx 目录 Nginx默认存放日志目录
/etc/logrotate.d/nginx 配置文件 Nginx默认的日志切割
/etc/sysconfig/nginx              #systemctl 管理 nginx的使用的文件

/usr/lib/systemd/system/nginx.service      #systemctl 管理nginx(开 关 重启 reload)配置文件       

/usr/share/nginx/html             #站点目录 网站的根目录 

nginx启动

'http和nginx是冲突的 因为都运行在80端口

#启动Nginx    先关闭之前已启动的httpd服务
[root@web01 ~]# systemctl stop httpd
[root@web01 ~]# systemctl disable httpd

#然后启动Nginx服务
[root@web01 ~]# systemctl enable nginx
[root@web01 ~]# systemctl start nginx


'启动方式有两种:
[root@web01 ~]#	nginx  启动
[root@web01 ~]# nginx -s stop 停止
[root@web01 ~]#	nginx -s reload |restart 重载服务      源码编译这么用

[root@web01 ~]#	systemctl start nginx
[root@web01 ~]#	systemctl restart nginx
[root@web01 ~]#	systemctl stop nginx 

`用哪种方式启动就用哪种方式停止 
`如果混着用了 一直报错 把nginx杀死
`pkill nginx
`然后重启nginx

nginx配置文件

nginx需要用root登录 用root登录可以用端口1-1024

不用root不行

所以是root登录 nginx干活

[root@web01 ~]# cat /etc/nginx/nginx.conf
---------------核心模块
user  nginx;	(可以改成www)					#nginx进程运行的用户
worker_processes  1;(最好设置成auto自动)		  #nginx工作的进程数量
error_log  /var/log/nginx/error.log warn;		#nginx的错误日志【警告及其警告以上的都记录】
pid        /var/run/nginx.pid;					#nginx进程运行后的进程id
--------------



---------------事件模块
events {
    worker_connections  1024;					#一个work进程的最大连接数 可以调 最大25534
	use epool;									#使用epool网络模型
}
--------------





---------------http核心层模块
http {
    include       /etc/nginx/mime.types;				#包含资源类型文件
    default_type  application/octet-stream;				#默认以下载方式传输给浏览器(前提是该资源在mime.types中无法找到)解析不了,就传到你的服务器让你下载

[root@web01 ~]# cp /var/www/html/info.php  /usr/share/nginx/html/ 拷贝一个php的,没有,默认返回浏览器下载

[root@web01 ~]# cat /usr/share/nginx/html/info.php
<?php phpinfo();
echo $_SERVER["DOCUMENT_ROOT"];
?>
对比下载文件一样



--------------日志格式定义
    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;	   #访问日志 以main的方式记录日志    日志保存路径

    sendfile        on;		                           #开启高效传输模式
    #tcp_nopush     on;
    keepalive_timeout  65;		                       #长连接超时时间
    #gzip  on;					                       #是否开启压缩功能
	
	include /etc/nginx/conf.d/*.conf;		           #包含哪个目录下面的*.conf文件
	
	server {  定义一个网站
		listen       80;			                   #监听端口
		server_name  localhost;		                   #域名

		#charset koi8-r;			                   #字符集

		location / {	 			                   #位置
			root   /usr/share/nginx/html;	           #代码的主文件位置  站点目录
			index  index.html index.htm;	           #服务端默认返回给用户的文件  定义首页文件
		}
		location /test {	 			               #位置
			root   /code/test/123/;	                   #代码的主文件位置
			index  index.html index.htm;	           #服务端默认返回给用户的文件
		}
	}

http server location扩展了解项
http{}层下允许有多个Server{}层,一个Server{}层下又允许有多个Location
http{} 标签主要用来解决用户的请求与响应。
server{} 标签主要用来响应具体的某一个网站。
location{} 标签主要用于匹配网站具体URL路径。

浏览器中输入10.0.0.7/info.php 跳出下载界面

下载好的内容和cp的内容一模一样

Nginx搭建一个静态资源web服务器

`1.编写Nginx配置文件
[root@web01 conf.d]# cat game.conf
server {
	listen 80;
	server_name game.oldboy.com;

	location / {
		root /code;
		index index.html;
	}
}

`2.根据配置文件,创建目录,上传代码
[root@web01 ~]# mkdir /code
[root@web01 ~]# cd /code
[root@web01 ~]# rz html5.zip
[root@web01 code]# unzip html5.zip 

`3.重载nginx服务
[root@web01 code]# systemctl restart nginx		#立即重启
[root@web01 code]# systemctl reload nginx		#平滑重启

`4.配置域名解析
Windows:  C:\Windows\System32\drivers\etc       #进这个配置文件
				10.0.0.7      game.oldboy.com   #加上这句话
Mac       sudo vim /etc/hosts
				10.0.0.7      game.oldboy.com
				
`5.检查解析的是否是10.0.0.7	
cmd
ping game.oldboy.com

访问
http://game.oldboy.com/game/duxinshu/index.html    #用户请求的路径

/code/game/duxinshu/index.html                     #实际上服务器查找的路径	

nginx虚拟主机

Nginx配置虚拟主机有如下三种方式

`方式一、基于主机多IP方式

#1.配置多网卡多IP的方式
[root@web01 conf.d]# cat 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;
	}
}

[root@web01 /etc/nginx/conf.d]# gzip default.conf  这步的原因是后缀名不能是.conf
[root@web01 /etc/nginx/conf.d]# ls
default.conf.gz  game.conf  ip.conf


#2.根据配置创建目录
[root@web01 conf.d]# mkdir /code_ip_eth0
[root@web01 conf.d]# echo "Eth0" > /code_ip_eth0/index.html

[root@web01 conf.d]# mkdir /code_ip_eth1
[root@web01 conf.d]# echo "Eth1" > /code_ip_eth1/index.html

#3.重启nginx服务
[root@web01 conf.d]# systemctl restart nginx

#4.使用curl命令测试
[root@web01 ~]# curl 172.16.1.7
Eth1
[root@web01 ~]# curl 10.0.0.7
Eth0
`方式二、基于端口的配置方式   
公司内部用的比较多

#1.配置多端口的虚拟主机
[root@web01 conf.d]# vim 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 conf.d]# mkdir /code_8{1..2}
[root@web01 conf.d]# echo "81" > /code_81/index.html
[root@web01 conf.d]# echo "82" > /code_82/index.html

#3.检查语法并重启服务
[root@web01 conf.d]# 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 conf.d]# systemctl restart nginx

#4.如何去访问
	http://10.0.0.7:82/
	

只要匹配上端口,就能访问到对应端口的页面
相同端口,如果域名没有匹配,转发到默认排名第一个的配置文件取解析
端口的优先级比server_name要高
如果listen配置了default_server,那么默认优先匹配
default_server参数只能有一个
`方式三、基于多个hosts名称方式(多域名方式)
用的最多 最重要

#1.准备多虚拟主机配置文件
[root@web01 conf.d]# cat test1.oldboy.com.conf 
server {
	listen 80;
	server_name test1.oldboy.com;

	location / {
		root /code/test1;
		index index.html;
	}
}

[root@web01 conf.d]# cat test2.oldboy.com.conf 
server {
	listen 80;
	server_name test2.oldboy.com;

	location / {
		root /code/test2;
		index index.html;
	}
}

#2.根据配置文件创建对应的目录
[root@web01 conf.d]# mkdir /code/test{1..2} -p
[root@web01 conf.d]# echo "test1_server" > /code/test1/index.html
[root@web01 conf.d]# echo "test2_server" > /code/test2/index.html
[root@web01 conf.d]# nginx -t
[root@web01 conf.d]# systemctl restart nginx

#3.配置域名解析
10.0.0.7      test1.oldboy.com
10.0.0.7      test2.oldboy.com

#4.通过浏览器访问该网





#1.[root@web01 /etc/nginx/conf.d]# cat www.oldmeng.conf 
server {
    listen       80;
    server_name  www.oldmeng.com;


    location / {
        root   /usr/share/nginx/html/www;
        index  index.html index.htm;
    }
}

[root@web01 /etc/nginx/conf.d]# cat bbs.oldmeng.conf 
server {
    listen       80;
    server_name  bbs.oldmeng.com;


    location / {
        root   /usr/share/nginx/html/bbs;
        index  index.html index.htm;
    }
}

[root@web01 /etc/nginx/conf.d]# cat blog.oldmeng.conf 
server {
    listen       80;
    server_name  blog.oldmeng.com;


    location / {
        root   /usr/share/nginx/html/blog;
        index  index.html index.htm;
    }
}

#2.[root@web01 /etc/nginx/conf.d]# mkdir /usr/share/nginx/html/{www,bbs,blog}
[root@web01 /etc/nginx/conf.d]# echo "www_server" > /usr/share/nginx/html/www/index.html
[root@web01 /etc/nginx/conf.d]# echo "bbs_server" > /usr/share/nginx/html/bbs/index.html
[root@web01 /etc/nginx/conf.d]# echo "blog_server" > /usr/share/nginx/html/blog/index.html
[root@web01 /etc/nginx/conf.d]# 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 /etc/nginx/conf.d]# systemctl restart nginx

#3.配置域名解析
10.0.0.7      www.oldmeng.com
10.0.0.7      bbs.oldmeng.com
10.0.0.7      blog.oldmeng.com

#4.通过浏览器访问该网


#这样也可以看到网站内容有没有
[root@web01 ~]# curl -H "host:www.oldmeng.com" 10.0.0.7
www_server
[root@web01 ~]# curl -H "host:bbs.oldmeng.com" 10.0.0.7
bbs_server
[root@web01 ~]# curl -H "host:blog.oldmeng.com" 10.0.0.7
blog_server

语法检查特别重要 nginx -t

nginx自查
1.修改完配置记得使用 nginx -t 检查语法
2.如果没有检查语法,直接重载导致报错。systemctl status nginx -l 查看错误信息

一定要 -t!!!!!!!!!!!!!!!

Nginx状态模块

nginx状态模块: --with-http_stub_status_module

状态模块配置文件

[root@web01 /etc/nginx/conf.d]# cat status.conf 
server {
   listen 80;
   server_name  status.oldboy.com;
   stub_status on;
   access_log off;
}
[root@web01 /etc/nginx/conf.d]# tail -1 /etc/hosts   
10.0.0.7  www.oldmeng.com blog.oldmeng.com bbs.oldmeng.com
这里如果没有 可以追加
[root@web01 /etc/nginx/conf.d]# cat >> /etc/hosts <<EOF
> 10.0.0.7      www.oldmeng.com
> 10.0.0.7      bbs.oldmeng.com
> 10.0.0.7      blog.oldmeng.com
> EOF

[root@web01 /etc/nginx/conf.d]# 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 /etc/nginx/conf.d]# systemctl restart nginx
[root@web01 /etc/nginx/conf.d]# curl -H "host:status.oldmeng.com" 10.0.0.7
Active connections: 1 
server accepts handled requests
 3 3 3 
Reading: 0 Writing: 1 Waiting: 0 
第一个 server 表示Nginx启动到现在共处理了 8 个连接
第二个 accepts 表示Nginx启动到现在共成功创建 8 次握手
第三个 handled requests 表示总共处理了 67 次请求
请求丢失数 = 握手数 - 连接数 ,可以看出目前为止没有丢失请求

Reading:Nginx 读取到客户端的 Header 信息数
Writing:Nginx 返回给客户端 Header 信息数
Waiting:Nginx 已经处理完正在等候下一次请求指令的驻留链接(开启keep-alive的情况下,这个值等于 Active - (Reading+Writing))

nginx日志管理

日志定义是在nginx.conf里定义的

日志字段解释

$remote_addr 	# 记录客户端 IP 地址
$remote_user 	# 记录客户端用户名
$time_local 	# 记录通用的本地时间
$time_iso8601 	# 记录 ISO8601 标准格式下的本地时间
$request		# 记录请求的方法以及请求的 http 协议
$status 		# 记录请求状态码(用于定位错误信息)
$body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent # 发送给客户端的总字节数
$msec 				# 日志写入时间。单位为秒,精度是毫秒。
$http_referer 		# 记录从哪个页面链接访问过来的
$http_user_agent 	# 记录客户端浏览器相关信息
$http_x_forwarded_for #记录客户端 IP 地址
$request_length 	# 请求的长度(包括请求行, 请求头和请求正文)。
$request_time 		# 请求花费的时间,单位为秒,精度毫秒
# 注:如果 Nginx 位于负载均衡器, nginx 反向代理之后, web 服务器无法直接获取到客 户端真实的 IP 地址。
# $remote_addr 获取的是反向代理的 IP 地址。 反向代理服务器在转发请求的 http 头信息中,
# 增加 X-Forwarded-For 信息,用来记录客户端 IP 地址和客户端请求的服务器地址。

日志切割

[root@web01 /var/log/nginx]# 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
}
posted @ 2020-01-02 20:24  干瘪的柠檬  阅读(164)  评论(0编辑  收藏  举报