Nginx(一)——介绍及安装配置

Nginx介绍

Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

代理服务

代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。常用的代理技术分为正向代理、反向代理和透明代理

代理服务分类

  • 正向代理(Forward Proxy)

正向代理是一个位于客户端【用户A】和目标服务器【服务器B】之间的服务器【代理服务器Z】,客户端必须要进行一些特别的设置才能使用正向代理

所谓正向代理就是代理服务器替代访问方【用户A】去访问目标服务器【服务器B】

作用

  1. 加速访问服务器B:如果用户A到服务器B左前的链路发生故障或者很慢,可通过代理服务器的网络线路走。
  2. Cache作用:如果在用户A访问服务器B某数据J之前,已经有人通过代理服务器Z访问过服务器B上得数据J,那么代理服务器Z会把数据J保存一段时间,如果有人正好取该数据J,那么代理服务器Z不再访问服务器B,而把缓存的数据J直接发给用户A。
  3. 隐藏访问者的行踪:代理服务器Z代替用户A去直接与服务器B进行交互。如果代理服务器Z被用户A完全控制,会惯以“肉鸡”术语称呼。
  • 反向代理(reverse proxy)

反向代理结论与正向代理正好相反,对于客户端而言它就像是目标服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理请求,接着反向代理将判断后端服务器并转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

作用

  1. 负载均衡: 当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问资源服务器B的时候,让不同的代理服务器Z(x)去应答不同的用户,然后发送不同用户需要的资源。
  2. Cache作用:与正向代理一样,存在缓存命中,提升效率。
  • 透明代理


透明代理与反向代理一样不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。

透明代理实践的例子一般为公司内部的行为控制软件,如上图所示,透明代理拦截掉客户端请求服务器B的请求,从而做到拦截的作用

Nginx企业用途

  • Web 服务软件

Nginx 是一个支持高性能、高并发的 Web 服务软件,它具有很多优秀的特性,作为 Web 服务器,与 Apache 相比,Nginx 能够支持更多的并发连接访问,但占用的资源却更少,效率更高,在功能上也强大了很多,几乎不逊色于 Apache。

  • 反向代理或负载均衡服务

在反向代理或负载均衡服务方面,Nginx 可以作为 Web 服务、PHP 等动态服务及 Memcached 缓存的代理服务器,它具有类似专业反向代理软件(如 Haproxy)的功能,同时也是一个优秀的邮件代理服务软件(最早开发这个产品的目的之一就是作为邮件代理服务),同时 Nginx 的代理在 Nginx 1.9.0 发布之后,还支持 TCP 的代理。

  • 前端业务数据缓存服务

在 Web 缓存服务方面, Nginx 可通过自身的 proxy_cache 模块实现类似Squid 等专业缓存软件的功能。

Nginx安装


## 创建nginx系统用户
[root@localhost ~]# useradd -r -M -s /sbin/nologin nginx

## 安装必备工具
[root@localhost ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make


## 新建nginx日志存放目录及赋予权限
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx.nginx /var/log/nginx

## 下载nginx
[root@localhost ~]# cd /usr/src/
[root@localhost ~]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
--2020-12-05 22:00:32--  http://nginx.org/download/nginx-1.18.0.tar.gz
Resolving nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5702::6, ...
Connecting to nginx.org (nginx.org)|3.125.197.172|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1039530 (1015K) [application/octet-stream]
Saving to: ‘nginx-1.18.0.tar.gz’

nginx-1.18.0.tar.gz      100%[=================================>]   1015K  5.59KB/s    in 2m 35s  

2020-12-05 22:03:09 (6.53 KB/s) - ‘nginx-1.18.0.tar.gz’ saved [1039530/1039530]

## 编译安装

[root@localhost src]# tar -xf nginx-1.18.0.tar.gz 
[root@localhost src]# cd nginx-1.18.0
[root@localhost nginx-1.18.0]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
[root@localhost nginx-1.18.0]# ./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-debug \
> --with-http_ssl_module \
> --with-http_realip_module \
> --with-http_image_filter_module \
> --with-http_gunzip_module \
> --with-http_gzip_static_module \
> --with-http_stub_status_module \
> --http-log-path=/var/log/nginx/access.log \
> --error-log-path=/var/log/nginx/error.log

[root@localhost nginx-1.18.0]# make && make install
......
test -d '/var/log/nginx' \
	|| mkdir -p '/var/log/nginx'
make[1]: Leaving directory '/usr/src/nginx-1.18.0'

# 环境变量设置
[root@localhost nginx-1.18.0]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@localhost nginx-1.18.0]# source /etc/profile.d/nginx.sh 
[root@localhost nginx-1.18.0]# echo $PATH
/usr/local/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin


# 开启服务
[root@localhost log]# nginx
[root@localhost log]# ss -antlp
State  Recv-Q   Send-Q      Local Address:Port                  Peer Address:Port                                                               
LISTEN 0        128               0.0.0.0:80                         0.0.0.0:*                   users:(("nginx",pid=36300,fd=8),("nginx",pid=36299,fd=8))
LISTEN 0        128               0.0.0.0:22                         0.0.0.0:*                   users:(("sshd",pid=1202,fd=5))                 
LISTEN 0        128                  [::]:22                            [::]:*                   users:(("sshd",pid=1202,fd=7)) 

  • 访问主页

Nginx配置文件详解

Nginx的配置文件结构

Nginx的配置文件nginx.conf位于其安装目录的conf目录下。

nginx.conf由多个部分组成

main包含Events和HTTP,HTTP包含了upstream和多个Server,Server又包含了多个localtion

  • main(全局设置)

main块设置的指令将影响其他所有设置.

  • server(主机设置)

主要用于指定主机和端口.

  • upstream(负载均衡服务器设置)

主要用于负载均衡,设置一系列的后端服务器

  • location(URL匹配特定位置的设置)

location块用于匹配网页位置

这四者之间的关系式:server继承main,location继承server,upstream既不会继承其他设置也不会被继承。
在这四个部分当中,每个部分都包含若干指令,这些指令主要包含Nginx的主模块指令、事件模块指令、HTTP核心模块指令,同时每个部分还可以使用其他HTTP模块指令,例如Http SSL模块、HttpGzip Static模块和Http Addition模块等.

常见Nginx配置

daemon(所属主模块指令):确定nginx是否应成为守护程序

  • 语法:
Syntax:	daemon on | off;
Default:	daemon on;
Context:	main          ## 写入到全局设置中

注意:每个配置项设置完成后,最后都要加;号结束

  • 实例:
[root@localhost conf]#  vim /usr/local/nginx/conf/nginx.conf

#user  nobody;
worker_processes  1;
daemon off;           ##设置为关闭守护进程


## 打开nginx后,nginx运行在前台
[root@localhost conf]# nginx 




## 另开一个终端,查看web服务是否启动
[root@localhost ~]# ss -antl
State         Recv-Q         Send-Q                    Local Address:Port                   Peer Address:Port         
LISTEN        0              128                             0.0.0.0:80                          0.0.0.0:*            
LISTEN        0              128                             0.0.0.0:22                          0.0.0.0:*            
LISTEN        0              128                                [::]:22                             [::]:*

master_process(是否开启工作进程)

  • 语法:
Syntax:	master_process on | off;
Default:	
master_process on;
Context:	main         # 写入全局设置中
  • 实例:
## 查看默认情况下的nginx进程
[root@localhost conf]# ps -ef |grep nginx
root       1461      1  0 14:48 ?        00:00:00 nginx: master process nginx
nginx      1462   1461  0 14:48 ?        00:00:00 nginx: worker process


## 关闭工作进程
[root@localhost conf]#  vim /usr/local/nginx/conf/nginx.conf
#user  nobody;
worker_processes  1;
master_process off;    # 值设置为off,表示关闭工作进程

## 重启nginx服务
[root@localhost conf]# nginx -s stop
[root@localhost conf]# nginx


## 再次查看nginx进程
[root@localhost conf]# ps -ef |grep nginx
root       1480      1  0 14:52 ?        00:00:00 nginx
root       1482   1341  0 14:52 pts/0    00:00:00 grep --color=auto nginx

errpr_log(配置日志)

  • 语法:
Syntax:	error_log file [level];  ##日志记录等级有:debug, info, notice, warn, error, crit, alert,
Default:	
error_log logs/error.log error;
Context:	main, http, mail, stream, server, location # 可以在不同的设置项中配置多个记录
  • 实例:
[root@localhost conf]# vim nginx.conf
#user  nobody;
worker_processes  1;
error_log  logs/error.log  error;   ## 路径为安装目录下的logs/error.log
......


## 模拟访问一个不存在的资源
[root@localhost ~]# curl 192.168.197.141/etetgsg
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>

## 查看错误日志
[root@localhost logs]# tail -f error.log 
2020/12/16 15:17:34 [error] 1520#0: *1 open() "/usr/local/nginx/html/etetgsg" failed (2: No such file or directory), client: 192.168.197.141, server: localhost, request: "GET /etetgsg HTTP/1.1", host: "192.168.197.141"

user(定义worker进程所属的用户或者组)

  • 语法:
Syntax:	user user [group];
Default:	user nobody nobody;   ## 默认为nobody
Context:	main
  • 实例:
[root@localhost conf]# vim nginx.conf
user  nginx; ## 设置worker进程的所属用户为nginx
worker_processes  1;
......

## 查看进程
[root@localhost conf]# ps -ef |grep 'worker process'
nginx      1583   1519  0 15:26 ?        00:00:00 nginx: worker process

worker_rlimit_nofile(更改工作进程打开文件的最大数)

  • 语法:
Syntax:	worker_rlimit_nofile number;
Default:	—   ## 此配置需要手动增加,默认没有
Context:	main
  • 实例:
[root@localhost conf]# vim nginx.conf
user  nginx;
worker_processes  1;
error_log  logs/error.log  error;
worker_rlimit_nofile 2048;  ## worker进程最大打开文件数为2048个。

worker_processes(编辑worker进程数量)

  • 语法:
Syntax:	worker_processes number | auto;  ##如果设置为auto,则自动检测出核时的进程数目,即为当前CPU的核心数)
Default:	worker_processes 1;  ## 默认worker进程数为1
Context:	main
  • 实例:
user  nginx;
worker_processes  auto;
......


## 重新加载服务并查看进程数
[root@localhost conf]# nginx -s reload
[root@localhost conf]# ps -ef |grep 'worker process'
nginx      1629   1519  0 15:57 ?        00:00:00 nginx: worker process
nginx      1630   1519  0 15:57 ?        00:00:00 nginx: worker process
nginx      1631   1519  0 15:57 ?        00:00:00 nginx: worker process
nginx      1632   1519  0 15:57 ?        00:00:00 nginx: worker process

## 正好对应的主机cpu的核心数
[root@localhost conf]# grep 'core id' /proc/cpuinfo | sort -u | wc -l
4

worker_cpu_affinity(设置worker进程绑定到CPU组)

  • 语法:
Syntax:	worker_cpu_affinity cpumask ....|auto;
Default:	—
Context:	main
  • 实例:
worker_processes     2;
worker_cpu_affinity 01 10;

解释: 主机CPU只有2核心,nginx开启2个worker进程,01表示第一个worker进程对应第一个CPU内核,10表示启用第二个worker进程对应第二个CPU内核

worker_processes     4;
worker_cpu_affinity 01 10 01 10;

解释: 主机CPU有2核心,nginx开启了4个worker进程,01表示第一个Worker进程对应第一个CPU内核,10表示第二个worker进程绑定第二个CPU,第三个01表示第三个worker进程再次绑定第一个cpu,以此类推。

worker_processes     4;
worker_cpu_affinity 0001 0010 0100 1000;

解释:主机CPU有4核心,0001表示启用第一个CPU内核并对应第一个worker进程,0010表示启用第二个CPU内核并对应第二个worker进程,依此类推

worker_connections(单个worker进程最大连接数)

  • 语法:
Syntax:	worker_connections number;
Default:	
worker_connections 512;
Context:	events

注意:同时连接的实际数量不能超过打开文件的最大数量的当前限制,打开文件的最大数量配置为worker_rlimit_nofile

  • 示例:
worker_rlimit_nofile 2048;   ## 连接值不能超过2048
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  2000;   ## 在events事件设置中编辑
}
......

accept_mutex(worker进程是否利用串行方式来响应请求)

  • 语法:
Syntax:	accept_mutex on | off;
Default:	accept_mutex off;
Context:	events
  • 实例:
events {
    worker_connections  2000;
    accept_mutex on;
}

当一个新连接到达时,如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态;如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是「惊群问题」.

lock_file(锁定机制实现accept_mutex和序列化对共享内存的访问)

  • 语法:
Syntax:	lock_file file;
Default:	
lock_file logs/nginx.lock;
Context:	main
  • 实例
user  nginx;
worker_processes  auto;
error_log  logs/error.log  error;
worker_rlimit_nofile 2048;
lock_file logs/nginx.lock;   设置lock锁文件的路径
......

keepalive_timeout(所属HTTP核心模块):设置长链接超时时间

  • 语法:
Syntax:	keepalive_timeout timeout [header_timeout];
Default:	keepalive_timeout 75s;
Context:	http, server, location
  • 实例:
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;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  105; # http代码块下修改

keepalive_requests(一个长连接上所能够允许请求的最大资源数)

  • 语法:
Syntax:	keepalive_requests number;
Default:	keepalive_requests 100;
Context:	http, server, location
  • 实例
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;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    keepalive_request  50; 

keepalive_disable[msie6|safari|none](指定类型的客户端代理禁用长链接)

  • 语法:
Syntax:	keepalive_disable none | browser ...;
Default:	
keepalive_disable msie6;
Context:	http, server, location
  • 实例:
server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;
        keepalive_disable msie6;   ##禁止IE6浏览器访问的请求利用长连接

client_header_timeout(定义读取客户端请求标头的超时时间)

  • 语法:
Syntax:	client_header_timeout time;
Default:	
client_header_timeout 60s;
Context:http, server
  • 实例:
http {
    include       mime.types;
    default_type  application/octet-stream;
    keepalive_disable msie6;
    client_header_timeout 60s;  修改过滤时间为60s

send_timeout(编辑响应报文的超时时间)

  • 语法:
Syntax:	send_timeout time;
Default:	send_timeout 60s;
Context:	http, server, location
  • 实例:
http {
    include       mime.types;
    default_type  application/octet-stream;
    keepalive_disable msie6;
    client_header_timeout 60s;
    send_timeout 60s;   # http下编辑响应报文超时时间

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

LNMP架构搭建

MYSQL与PHP安装流程见下:

MYSQL二进制安装

PHP源码安装

Nginx配置

## 查看服务端口是否正常
State         Recv-Q         Send-Q                    Local Address:Port                   Peer Address:Port         
LISTEN        0              128                             0.0.0.0:22                          0.0.0.0:*            
LISTEN        0              128                           127.0.0.1:9000                        0.0.0.0:*            
LISTEN        0              128                                [::]:22                             [::]:*            
LISTEN        0              80                                    *:3306                              *:*         


## 配置nginx配置文件


        location / {
            root   html;
            index  index.php index.html index.htm ;  ## 添加PHP格式Web文件
        }

 location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $Document_Root$fastcgi_script_name;
            include        fastcgi_params;
        }

添加php文件,并开启服务

[root@192 nginx]# cd html/
[root@192 html]# ls
50x.html  index.html  test.html
[root@192 html]# touch index.php
[root@192 html]# vim index.
[root@192 html]# vim index.php 
<?php
   phpinfo();
?>

## 开启服务
[root@192 nginx]# service php-fpm start
[root@192 html]# ss -antl
State         Recv-Q         Send-Q                    Local Address:Port                   Peer Address:Port         
LISTEN        0              128                             0.0.0.0:80                          0.0.0.0:*            
LISTEN        0              128                             0.0.0.0:22                          0.0.0.0:*            
LISTEN        0              128                           127.0.0.1:9000                        0.0.0.0:*            
LISTEN        0              128                                [::]:22                             [::]:*            
LISTEN        0              80                                    *:3306                              *:* 

访问php主页

通过access.log统计访问最频繁的IP地址

## 打开access.log日志功能
[root@192 nginx]# vim conf/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  logs/access.log  main;


## 模拟正常访问日志
[root@192 ~]# tail -f /usr/local/nginx/logs/access.log
192.168.197.1 - - [19/Dec/2020:21:55:20 +0800] "GET / HTTP/1.1" 200 84105 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "-"
192.168.197.1 - - [19/Dec/2020:21:55:22 +0800] "GET / HTTP/1.1" 200 84105 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "-"
192.168.197.141 - - [19/Dec/2020:21:56:52 +0800] "GET / HTTP/1.1" 200 83421 "-" "curl/7.61.1" "-"
192.168.197.141 - - [19/Dec/2020:21:57:05 +0800] "GET / HTTP/1.1" 200 83421 "-" "curl/7.61.1" "-"
192.168.197.153 - - [19/Dec/2020:22:02:57 +0800] "GET / HTTP/1.1" 200 83398 "-" "curl/7.29.0" "-"
192.168.197.135 - - [19/Dec/2020:22:03:48 +0800] "GET / HTTP/1.1" 200 83421 "-" "curl/7.61.1" "-"
192.168.197.141 - - [19/Dec/2020:22:04:02 +0800] "GET / HTTP/1.1" 200 83414 "-" "curl/7.61.1" "-"
192.168.197.135 - - [19/Dec/2020:22:04:09 +0800] "GET / HTTP/1.1" 200 83421 "-" "curl/7.61.1" "-"
192.168.197.153 - - [19/Dec/2020:22:04:11 +0800] "GET / HTTP/1.1" 200 83421 "-" "curl/7.29.0" "-"
192.168.197.135 - - [19/Dec/2020:22:04:14 +0800] "GET / HTTP/1.1" 200 83421 "-" "curl/7.61.1" "-"
192.168.197.1 - - [19/Dec/2020:22:04:17 +0800] "GET / HTTP/1.1" 200 84105 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "-"
192.168.197.1 - - [19/Dec/2020:22:04:18 +0800] "GET / HTTP/1.1" 200 84097 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "-"
192.168.197.1 - - [19/Dec/2020:22:04:19 +0800] "GET / HTTP/1.1" 200 84105 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "-"
192.168.197.1 - - [19/Dec/2020:22:04:19 +0800] "GET / HTTP/1.1" 200 84105 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "-"
192.168.197.1 - - [19/Dec/2020:22:04:20 +0800] "GET / HTTP/1.1" 200 84082 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "-"
192.168.197.135 - - [19/Dec/2020:22:04:26 +0800] "GET / HTTP/1.1" 200 83414 "-" "curl/7.61.1" "-"
192.168.197.153 - - [19/Dec/2020:22:04:28 +0800] "GET / HTTP/1.1" 200 83421 "-" "curl/7.29.0" "-"
192.168.197.153 - - [19/Dec/2020:22:04:29 +0800] "GET / HTTP/1.1" 200 83421 "-" "curl/7.29.0" "-"
192.168.197.141 - - [19/Dec/2020:22:04:32 +0800] "GET / HTTP/1.1" 200 83421 "-" "curl/7.61.1" "-"

统计访问最多的IP地址

[root@192 nginx]# awk '{print $1}' /usr/local/nginx/logs/access.log |sort |uniq -c|sort -nr |head -n 1
      7 192.168.197.1  ## 即可得访问次数以及访问的IP地址
posted @ 2020-12-06 22:16  阿不思布丁  阅读(259)  评论(0编辑  收藏  举报