Linux基础—nginx入门和参数配置

一、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{}标签,即支持多个虚拟主机站点。

虚拟主机类型

  1. 基于域名的虚拟主机:通过不同的域名区分不同的虚拟主机,是企业应用最广的虚拟主机。

  2. 基于端口的虚拟主机:通过不同的端口来区分不同的虚拟主机,一般用作企业内部网站,不对外直接提供服务的后台,例如www.pythonav.cn:9000

  3. 基于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页面

http://192.168.16.122/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站点

 

posted @ 2019-07-01 20:38  ryxiong728  阅读(334)  评论(2编辑  收藏  举报