Nginx(一)——介绍及安装配置
Nginx介绍
Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
代理服务
代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。常用的代理技术分为正向代理、反向代理和透明代理
代理服务分类
- 正向代理(Forward Proxy)
正向代理是一个位于客户端【用户A】和目标服务器【服务器B】之间的服务器【代理服务器Z】,客户端必须要进行一些特别的设置才能使用正向代理
所谓正向代理就是代理服务器替代访问方【用户A】去访问目标服务器【服务器B】
作用
- 加速访问服务器B:如果用户A到服务器B左前的链路发生故障或者很慢,可通过代理服务器的网络线路走。
- Cache作用:如果在用户A访问服务器B某数据J之前,已经有人通过代理服务器Z访问过服务器B上得数据J,那么代理服务器Z会把数据J保存一段时间,如果有人正好取该数据J,那么代理服务器Z不再访问服务器B,而把缓存的数据J直接发给用户A。
- 隐藏访问者的行踪:代理服务器Z代替用户A去直接与服务器B进行交互。如果代理服务器Z被用户A完全控制,会惯以“肉鸡”术语称呼。
- 反向代理(reverse proxy)
反向代理结论与正向代理正好相反,对于客户端而言它就像是目标服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理请求,接着反向代理将判断后端服务器并转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
作用
- 负载均衡: 当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问资源服务器B的时候,让不同的代理服务器Z(x)去应答不同的用户,然后发送不同用户需要的资源。
- 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安装流程见下:
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地址