Nginx入门
什么是Nginx
Nginx是一个HTTP和反向代理Web服务器,同时也提供IMAP/POP3/SMTP服务。其重点是一个反向代理服务器,那什么是反向代理服务器?
首先,我们先来理解下正向代理服务器。当我们的client端向一个目标服务器发其请求的时候,我们的请求首先是要经过运营商的服务器,然后在由运营商的服务器来将我们的请求发送到我们的目标服务器上面(毕竟我们的网线并没有直接连接到目标服务器上),这里我们是知道我们目标服务器的ip或者域名的,而正向代理服务器只是负责转发请求的。
而反向代理服务器则不一样,我们可以知道反向代理服务器的地址,我们也知道我们所要发出的请求是什么要给谁来接收,但是我们并不知道接收我们请求的服务器具体的地址,他是藏在了反向代理服务器后面,由我们的反向代理服务器来决定最终我们的请求是由哪台服务器所接受的。
这里举个小例子:正向代理服务器就像一个电梯,我们知道我们要去第几层楼,他这是将我们送到那个地方去。电信运营商的服务器,网吧的网关控制器都是这么正向代理服务器。而反向代理服务器就等同于餐厅外面的接待员,我们只是知道这家餐厅的位置以及我们需要几人桌,但最终要到哪一号桌上坐则是由这位接待员来决定的。
安装
1.去官网http://nginx.org/下载对应的nginx包,推荐使用稳定版本
2.上传到我们的服务器上
3.安装相关的依赖
yum install -y gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zilb-devel
yum install -y openssl openssl-devel
4.解压安装包,得到的是Nginx的源码,我们还需要编译
tar -xzvf nginx-1.16.1.tar.gz
5.编译之前,先创建nginx临时目录,如果不创建在启动nginx的过程中会报错的
mkdir /var/temp/nginx -p
6.在nginx解压后的目录上,输入如下命令进行配置,目的是为了创建makefile文件
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
7.make编译
make
8.安装
make install
9.启动nginx
cd /var/local/nginx
cd sbin
./nginx
- 停止 ./nginx -s stop
- 重新加载配置文件 ./nginx -s reload
10.打开浏览器,访问启动nginx服务的机器的ip或者域名就可以了
注意:
- 默认开启的端口是80
- 可能需要关闭防火墙
Nginx的模型结构
nginx是以一个master进程加N个worker进程的模式运作的,当master进程收到我们用户的操作指令后将分发给worker进程执行。
而worker进程则是以一种抢占机制来运行的,当一个client向我们的Nginx服务器发出请求后,将一种互斥锁(accept_mutex)的存在,这样就可以实现负载均衡的功能了。
nginx.conf 核心配置
1.设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录和文件的一些权限,默认为nobody
# user nobody;
user root; # 这样就是使用root
2.worker集成工作数量设置,一般来说CPU有几个,就设置几个,或者设置为N-1也行
worker_processes 1;
3.nginx日志级别 debug | info | notice | warn | error | crit ,错误级别从左到右越来越大
4.设置nginx进程pid,在配置文件中这段是注释起来的,我们在编译前的配置中已经将pid文件设置到
了/var/run/nginx/nginx.pid这个路径上了
pid logs/nginx.pid;
5.设置工作模式
events {
# linux上默认使用epoll,所以可以不用明写出来
use epoll;
# 每个worker允许连接的客户端最大连接数,默认是1024
worker_connections 1024;
}
6.http是指令块,针对http网洛传输的一些指令配置
http {
}
7.include引入外部配置,提高可读性,避免单个文件过大,我们后面所将的server指令块就可以单独写到一个配置文件当中
include mime.types # 这个mime.types文件的路径和nginx.conf在同一级目录下,当然你也可以用全路径
8.设定日志格式,main为定义的格式名称,如此access_log就可以直接使用这个变量了
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_send "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
参数名 | 参数意义 |
---|---|
$remote_addr | 客户端ip |
$remote_user | 远程客户端用户名,一般为:’-’ |
$time_local | 时间和时区 |
$request | 请求的url以及method |
$status | 响应状态码 |
$body_bytes_send | 响应客户端内容字节数 |
$http_referer | 记录用户从哪个链接跳转过来的 |
$http_user_agent | 用户所使用的代理,一般来时都是浏览器 |
$http_x_forwarded_for | 通过代理服务器来记录客户端的ip |
9.sendfile使用高效文件传输,提升传输性能。启用后才是使用tcp_nopush,是指当数据表累计一定大小后才发送,提高了效率。
sendfile on;
tcp_nopush on;
10.keepalive_timeout设置客户端与服务器请求的超时时间,保证客户端多次请求的时候不会重新简历新的连接,节约资源损耗
# keepalive_timeout 0;
keepalive_timeout 65;
11.gzip启用压缩,html/js/css等文件压缩后传输会更快,但对cpu的负荷也增加,无论是压缩端还是解压段
gzip on;
gzip_min_lenght 1; # 限制最小压缩,当文件小于这个规定是不进行压缩
gzip_comp_level 3; # 压缩比,一般不要设置太小或者太大
gizp_types xxx; # 压缩的类型
12.server可以在http指令块中设置多个虚拟机,这个也是一个指令块是写在http里面的
- listen 监听端口,默认是80
- server_name ip地址或者域名
- location 请求路由映射,匹配拦截
- root 请求位置
- index 首页设置
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html;
}
}
这里需要解释一下就是,location 后面接的是一些路由名称就是当输入的路由是这个的时候,将从root所规定的本地文件系统路径上进行查找。如果没有index时,比如是指向一些静态资源时,root指向的路径下需要包含location指向的路由,
server {
listen 80;
server_name localhost;
location /doudou {
root /home;
}
}
那么在我的本地文件系统中是:/home/imooc/img/face1.png 这样就可以通过nginx来访问这个face1.png的图片了,当然如果是这样的话当别人知道了这个访问路径也就知道了我本机的文件路径,会存在风险,所以我们可以使用alias别名
server {
listen 80;
server_name localhost;
location /static {
alias /home/doudou
}
}
这样当在浏览器上输入的是localhost:80/static/img/face1.png时就能访问到我本地路径/home/doudou/img/face1.png这个图片文件了
location匹配规则
- 空格:默认匹配,普通匹配
location / {
root /home;
}
- =:精确匹配
location = /doudou/img/face1.png {
root /home;
} # 这时/home目录下一定要有/doudou/img/face1.png这个路径及文件
- ~*:匹配正则表达式,不区分大小写
location ~* .(GIF|jpg|png|jpeg) {
root /home;
} # 这样就算你路由路径下的本地文件中含有gif也能匹配到
- ~:匹配正则表达式,区分大小写
- ^~:以某个字符路径开头
location ^~ /doudou/img {
root /home;
}
切割nginx的日志
因为我们将nginx的日志路径设置在/var/log/nginx下,nginx的所有日志将写到这个目录的access.log文件,那么这个文件将随着时间慢慢变大,所以我们需要手动切割一下,下面是自定义的sh文件
#!/bin/bash
LOG_PATH="/var/log/nginx/"
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
每次执行都将生成一个access.${RECORD_TIME}.log 文件,如:access.2020-03-01+12:15.log,这个是我在 2020年3月1日12点15份执行时生成的文件,然后在重新创建一个access.log文件让nginx继续写入
当然我们也可以定时配置,就是使用crontab工具
yum install -y crontabs
crontab -e # 进入编译模式
*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh # 我将这个切割sh放在了/usr/local/nginx/sbin下,命名为cut_my_log.sh
:wq # 保存退出
service crond restart