nginx(4)

我叫张贺,贪财好色。一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步。
个人博客:传送阵
笔者微信:zhanghe15069028807,非诚勿扰。

一、安装配置

1、安装

不要安装epel,因为配置文件比较乱,用官方的,配置文件简单
http://nginx.org/en/linux_packages.html#RHEL-CentOS
[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
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

yum install nginx   发现源是从nginx过来的,700多K的,源很重要。
[root@web01 tmp]# rpm -ql nginx
/etc/logrotate.d/nginx   日志切割

/etc/nginx                #这三行都是配置文件文件,defaut.conf里面有一个include
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf

/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win

/etc/nginx/mime.types    #格式关系对应表
/etc/nginx/modules      #模块
/etc/nginx/nginx.conf   #主配置文件
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/sysconfig/nginx    #存放的是参数
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service  #启动的服务名
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html   #默认页面
/var/cache/nginx
/var/log/nginx    #日志

上面这是nginx官方安装编译好的,我们可以查看其安装编译的参数:

[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  #nginx运行的用户和组

--with-compat    #with开头的都是模块
--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          #ssl模块
--with-http_stub_status_module  #状态码模块
--with-http_sub_module 
--with-http_v2_module     #支持go语言代理
--with-mail 
--with-mail_ssl_module 
--with-stream            #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'

如果想看公司的nginx编译参数,-V看一下,直接复制去编译就行。

2、配置文件

/etc/nginx/nginx.conf是主配置文件,里面有一个包括,这个包括把/etc/nginx/conf.d里面的所有以.conf结尾的文件 ,默认里面就有一个default.conf

[root@web01 nginx]# cat nginx.conf 
user  nginx;    #启动的用户
worker_processes  1;   #进程的数量
error_log  /var/log/nginx/error.log warn;   #错误日志的路径
pid        /var/run/nginx.pid;              #进程运行后,存放进程ID的文件
####################上面是核心模块,下面是事件层
events {
    worker_connections  1024;     #每一个worker进程最大支持的连接数
    use epool;                    #使用的网络模型select,pool,epool,默认是epool层
}
#####################下面是http模块层
http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;   #长连接时间,0就变成了短连接了
    #gzip  on;

    include /etc/nginx/conf.d/*.conf;      #包括
}
[root@web01 conf.d]# cat default.conf 
server {     #放到http层,定义具体的网站
    listen       80;
    server_name  localhost;   #域名或主机名
    location / {              #一个server里面可以出现多个location     
        root   /usr/share/nginx/html;  #这是个目录,默认去到根目录
        index  index.html index.htm;  #默认请求的主页面
    }
}

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 start nginx   #
//路径匹配,一个server层里面可以出现多个location
[root@web01 conf.d]# cat default.conf 
server {
    listen       80;
    server_name  localhost;

    location / {         #定义一个网站
        root   /usr/share/nginx/html;
        index  index.html index.htm;
   }


   location /test {           #用户这样访问IP/test才能访问到oldboy.html,IP后面是根,而这里的根指的是/opt,/opt/下面的test目录
       root /opt/;
       index oldboy.html;
   }
}

关系

http层下允许有多个server层,一个server层下又允许有多个location

http{}标签主要用来解决用户请求和响应

server标签主要用来响应具体的某一个网站

location标签主要用于匹配网站的具体URL路径

二、功能

1、虚拟主机

1.1 基于IP

[root@nginx bbs]# cd /etc/nginx/conf.d
[root@nginx conf.d]# ls
bbs.zhanghe.conf  www.zhanghe.conf
[root@nginx conf.d]# cat www.zhanghe.conf 
server {
    listen       192.168.80.2:80;
    server_name  www.zhanghe.com;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
[root@nginx conf.d]# cat bbs.zhanghe.conf 
server {
    listen       192.168.80.5:80;
    server_name  www.zhanghe.com;

    location / {
        root   /www/web/bbs;
        index  index.html index.htm;
    }
}

1.2 基于域名

[root@nginx conf.d]# ls
bbs.zhanghe.conf  www.zhanghe.conf
[root@nginx conf.d]# cat www.zhanghe.conf 
server {
    listen       192.168.80.2:80;
    server_name  www.zhanghe.com;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
[root@nginx conf.d]# cat bbs.zhanghe.conf 
server {
    listen       192.168.80.2:80;
    server_name  bbs.zhanghe.com;

    location / {
        root   /www/web/bbs;
        index  index.html index.htm;
    }
}

1.3 基于端口

[root@nginx conf.d]# ls
bbs.zhanghe.conf  www.zhanghe.conf
[root@nginx conf.d]# cat www.zhanghe.conf 
server {
    listen       192.168.80.2:80;
    server_name  www.zhanghe.com;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
[root@nginx conf.d]# cat bbs.zhanghe.conf 
server {
    listen       192.168.80.2:8080;
    server_name  www.zhanghe.com;

    location / {
        root   /www/web/bbs;
        index  index.html index.htm;
    }
}

2、访问控制

访问控制就是可以允许哪些IP地址来访问location站点,不允许哪些IP地址来访问location站点,举个例子:

[root@nginx conf.d]# cat default.conf 
server {
    listen       80;
    server_name  localhost;

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

    location /test {                 #对这个站点做了访问控制
        root   /www/web/bbs;
        index  index.html index.htm;
		deny 192.168.80.6;           #80.6这台主机访问时就会报4.3错误
		allow all;
    }
}

3、用户认证

用户认证就是访问网站时会弹出一个框来让你输入用户名和密码,只有输入正确了才能查看页面,很少用这种方式,会用即可。

//准备一个目录用来存放用户名和密码
yum -y install httpd-tools
[root@nginx ~]# mkdir /etc/nginx/conf
[root@nginx ~]# cd /etc/nginx/conf
[root@nginx conf]# htpasswd -bc htpasswd zhanghe cba-123  #bc的意思无需关心,记住格式即可。
Adding password for user zhanghe                          #注意密码文件的权限和属主和属组

//把用户文件的路径写上
[root@nginx conf]# cat /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  localhost;

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

    location /test {
        root   /www/web/bbs;
        index  index.html index.htm;
		auth_basic "closed site";         #引号里面的名字随便写
		auth_basic_user_file conf/htpasswd;  #这里是相对路径,相对于/etc/nginx,与上文响应
    }
}

4、文件共享

[root@web01 conf.d]# cat game.oldboy.conf 
server{
	listen 80;
	server_name game.oldboy.com;
	
	location / {
		root /code;
		index index.html;
		autoindex on;        #加上一行即可
	}

注意,有时不生产,把默认的index.html注释掉即可,如果还这样,就把index.html更名。

在浏览器上打开文件,有的直接打开,而有的会下载,nginx是根据扩展名来判断的,我们可以根据/etc/mime.types文件来进行控制,这个文件叫媒体资源类型,默认txt的扩展名被识别为文本,所以能够在浏览器中直接打开,而不是下载,假如我们想php文件也当成是文件直接打开,就在该文件的txt后加上php,如下所示:

vim /etc/mime.types
text/plain txt;  #默认是这样
text/plain txt php; #变成了这样,重启nginx,php文件也能当成文本文件直接打开了

浏览器默认访问索引时把中文显示为了乱码,怎么解决呢?

[root@nginx test]# cat /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

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

    location /test {
        root   /www/web/bbs;
        index  123.jkk;
		autoindex on;
		charset utf-8;    #加上这一行即可
    }
}

5、文件别名

为什么用别名呢?

方便测试,用短的域名测试,方便书写,代码上线的时候方便标记

[root@nginx conf.d]# cat default.conf 
server {
    listen       80;
    server_name  www.zhanghe.com a.com;  #加一个别名a.com

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

}

在windows上修改hosts文件之后,用a.com访问比写一长串www.zhanghe.com要快好多。

6、状态模块监控

[root@nginx conf.d]# vim state.conf
server {
    listen       80;
    server_name  state.zhanghe.com;
    stub_status;

}

在windows上访问state zhanghe.com就可以看到状态页面,别忘记重写hosts文件。

Active connections:当前在多少个用户连接,可以通过zabbix监控在这,达到一定数量就会报警。

accepts:接收的连接数汇总(综合) tcp,nginx服务重启就会清零。

handied:处理的连接数汇总(综合) TCP,通常和上面的相等,有时也有例外,比如资源限制服务器不处理,那就不相等了。·

requests:总计的请求数量 HTP协议请求,一次连接可以有多次请求,这里体现了长短连接。

Reading: nginx:正在读取的请求报文,一共是0,并发大的时候才会体现。

writing: nginx:正在读取的响应报文,一共是0,并发大的时候才会体现。

waiting: nginx:nginx忙不过的时候,请求报文和响应报文要排除,这里会体现队列的长度,这里也可以通过zabbix监控,看排除的人多不多,如果太多了,及时调整。

7、日志

nginx有两个日志比较重要,如下:

[root@nginx nginx]# pwd
/var/log/nginx
[root@nginx nginx]# ls
access.log  error.log

7.1 错误日志

错误日志的路径和级别的设置在/etc/nginx/nginx.conf文件里面,如下所示:

[root@nginx ~]# grep error /etc/nginx/nginx.conf
error_log  /var/log/nginx/error.log warn;    #格式:路径,级别

错误日志级别

级别设置的越低,错误日志里面产生的信息也就越多,比如你设置的是debug这种的,那鸡毛蒜皮的小事都会记录到日志里面,如果设置的级别高一些,就会记录此级别以及此级别之上级别的信息,如果设置看自己的磁盘大小,如果自己的磁盘空间很充足,可以设置低一些,如果磁盘空间不太充足,就可以只记录关键的信息,节省点空间,默认是warn级别,如下所示,当然我们可以更改,一般更改成error级别,在此级别上只记录错误信息,方便我们排错。

7.2 访问日志

访问日志的路径和级别的设置在/etc/nginx/nginx.conf里面,如下所示:

//访问日志整体分为两个部分,定义格式log_format,然后起一个名字,最后调用这个格式
[root@nginx ~]# sed -n '18,+4p' /etc/nginx/nginx.conf
    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;

'$remote_addr 客户端的IP

$remote_user 通过认证的用户

[$time_local] 客户端访问网站的时间

"$request" ' 用户请求头部:用户请求的方法,http协议的版本
'$status 用户访问网站的状态码

$body_bytes_sent 服务器给客户端回复的流量大小,默认是字节,可通过awk做求和运算,看流量,来确定我们买带宽买多大的合适。

"$http_referer" ' 从哪里面跳转过来的(防止盗链)

'"$http_user_agent" 通过什么浏览器过来的

"$http_x_forwarded_for"'; 负载均衡相关的,我们在负载均衡的章节为讲一下

7.3 错误界面优雅显示

可以用来做什么事情呢?比如错误页面优雅显示。

[root@nginx ~]# vim /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  www.zhanghe.com  a.com;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        autoindex on;
    }
    location /test {
        root   /www/;
        error_page 404 = 123.jpg;   #通过123.jpg覆盖404界面,123.jpg存放在/www/test里面
    }
}

7.4 服务匹配

这个功能用的比较少,知道即可。

就是通过匹配某个URL,返回特定的界面,我们举个例子:

[root@nginx conf.d]# cat test.conf 
server {
    listen       80;
    server_name  www.123.com;

    location = / {   #默认,即输入www.123.com或www.123.com/,精确匹配到这里。
	return 404;
	}
    location / {     #输入www.123.com之后乱输入,比如www.123.com/kjdfkjdkfjkd
	return 403;
	}
    location /doc {  #输入的路径中带有doc,比如www.123.com/doc/kdjfjdfj
	return 402;
	}
    location ^~ /images {  #输入的路径中带有doc,比如www.123.com/images/kdjfjdfj
	return 405;
	}
    location ~* \.(jpg|jpeg)$ {  #不区分大小与,比如www.123/kdfjkldfj/djfkj.jgp
	return 501;
	}
}

7.5 跳转

跳转功能就是我们上百度的时候,不用输入www.baidu.com,只需要输入baidu.com即可,浏览器会自动跳转到www.baidu.com上。

[root@nginx conf.d]# vim default.conf 

server {
    listen       80;
    server_name  www.zhanghe.com  zhanghe.com;     #这里有一个别名
    rewrite ^/(.*) www.zhanghe.com/$1 permanent;   #permanent永久跳转301

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        autoindex on;
    }
    location /test {
        root   /www/;
        error_page 404 = 123.jpg;
    }
}

效果就是当我们curl zhanghe.com/test自然会跳转到www.zhanghe.com/test

permanent 301 永久跳转

redirect 302 临时跳转

[root@tomcat02 ~]# curl zhanghe.com/test
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>
//出现了坑,传递的参数超过nginx 服务器的限制
[root@tomcat02 ~]# curl -L www.zhanghe.com   #-L跟着跳转走,还是出了错误
<html>
<head><title>414 Request-URI Too Large</title></head>
<body>
<center><h1>414 Request-URI Too Large</h1></center>

//解决办法 在/etc/nginx/nginx.conf里面加两行
client_header_buffer_size 512k;
large_client_header_buffers 4 512k;
//又出现了坑,逻辑次数,跳转次数过多,排除curl -Lv 看过程,发现一直跳转,问题出在rewrite的位置上
[root@tomcat02 ~]# curl -L www.zhanghe.com
curl: (47) Maximum (50) redirects followed

怎么办呢?调整rewrite的位置,如下所示,再加一个server:

[root@nginx ~]# vim /etc/nginx/conf.d/default.conf 

server {                         #这样即打破循环
        listen 80;
        server_name zhanghe.com;
        rewrite ^/(.*) http://www.zhanghe.com/$1 permanent;
}

server {
    listen       80;
    server_name  www.zhanghe.com;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        autoindex on;
    }
    location /test {
        root   /www/;
        index  index.html index.htm;
        error_page 404 = 123.jpg;
    }
}
posted @ 2019-12-20 12:15  张贺贺呀  阅读(409)  评论(0编辑  收藏  举报