nginx安装配置
NGINX常用模块
nginx模块分为nginx官方模块以及nginx第三方模块
Nginx编译选项 | 模块作用 |
ngx_http_core_module | 包含一些核心的http参数配置,对应Nginx的配置区块部分 |
ngx_http_access_module | 访问控制模块,用来控制网站用户对Nginx的访问 |
ngx_http_gzip_module | 压缩模块,对Nginx返回的数据压缩,属于性能优化模块 |
ngx_http_fastcgi_module | fastcgi模块,和动态应用相关的模块,例如PHP |
ngx_http_proxy_module | proxy代理模块 |
ngx_http_upstream_module | 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查。 |
ngx_http_rewrite_module | URL地址重写模块 |
ngx_http_limit_conn_module | 限制用户并发连接数及请求数模块 |
ngx_http_limit_req_module | 限制Nginx request processing rate根据定义的key |
ngx_http_log_module | 访问日志模块,以指定的格式记录Nginx客户访问日志等信息 |
ngx_http_auth_basic_module | Web认证模块,设置Web用户通过账号密码访问Nginx |
nginx_http_ssl_module | ssI模块,用于加密的http连接,如https |
环境准备
1.安装nginx方式
rpm包安装
yum安装
源代码安装
2.GCC编译环境安装:
yum install -y gcc gcc-c++ autoconf automake make
3.安装nginx一些所需的第三方系统库,比如nginx的静态资源压缩功能所需的gzip,lib库,nginx需要支持url重写所需的pcre库,perl开发的依赖库;以及nginx搭建加密站点https,所需的openssl依赖库等
yum install -y zlib zlib-devel openssl openssl-devel pcre pcre-devel wget httpd-tools vim
4.配置系统基本环境(关闭防火墙,selinux)
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
编译安装nginx
1.下载程序源代码,可以从官网获取
wget http://nginx.org/download/nginx-1.20.0.tar.gz
也可以下载淘宝的nginx:tengine
wget http://tengine.taobao.org/download/tengine-2.3.0.tar.gz
2.解压缩nginx
[root@localhost opt]# tar -xzf nginx-1.20.0.tar.gz
[root@localhost opt]# ls
nginx-1.20.0 nginx-1.20.0.tar.gz
3.进入源代码目录,查看有哪些内容
[root@localhost opt]# ll nginx-1.20.0
total 788
drwxr-xr-x. 6 1001 1001 4096 May 8 08:15 auto 检测系统模块依赖信息
-rw-r--r--. 1 1001 1001 311102 Apr 20 09:35 CHANGES 存放nginx的变化记录日志
-rw-r--r--. 1 1001 1001 474697 Apr 20 09:35 CHANGES.ru
drwxr-xr-x. 2 1001 1001 4096 May 8 08:15 conf 存放nginx的主配置文件目录
-rwxr-xr-x. 1 1001 1001 2590 Apr 20 09:35 configure 可执行脚本,用于释放文件的定制脚本
drwxr-xr-x. 4 1001 1001 68 May 8 08:15 contrib 提供vim插件,让配置文件颜色区分,更友好
drwxr-xr-x. 2 1001 1001 38 May 8 08:15 html 存放了标准的html页面文件
-rw-r--r--. 1 1001 1001 1397 Apr 20 09:35 LICENSE
drwxr-xr-x. 2 1001 1001 20 May 8 08:15 man
-rw-r--r--. 1 1001 1001 49 Apr 20 09:35 README
drwxr-xr-x. 9 1001 1001 84 May 8 08:15 src 存放了nginx源代码的目录
4.开始准备编译三部曲
第一曲:进入软件源代码目录,执行编译脚本文件,制定安装路径,以及开启额外功能等
查看编译帮助信息
[root@localhost nginx-1.20.0]# ./configure --help
执行编译脚本文件,释放makefile等信息
[root@localhost nginx-1.20.0]# ./configure --prefix=/opt/nginx --with-http_gzip_static_module --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-threads --with-file-aio
第二曲:(如Windows的点击下一步安装) make
第三曲:(如Windows的开始安装) make install
5.查看nginx内的目录
[root@localhost nginx1-20]# ls
conf html logs sbin
配置文件 静态文件 日志文件 二进制日志文件
6.如果想要在shell命令行直接使用nginx命令,而不用使用nginx绝对路径启动服务了,应配置nginx的环境变量
[root@localhost opt]# cat /etc/profile.d/nginx.sh
export PATH=$PATH:/opt/nginx/sbin/
[root@localhost opt]# source /etc/profile
7.启动nginx
[root@localhost ~]# nginx
[root@localhost ~]# ps -aux | grep nginx
root 1276 0.0 0.0 46016 1136 ? Ss 13:56 0:00 nginx: master process nginx
nobody 1277 0.0 0.0 46480 1908 ? S 13:56 0:00 nginx: worker process
root 1279 0.0 0.0 112816 956 pts/0 R+ 13:56 0:00 grep --color=auto nginx
重写加载配置文件:[root@localhost ~]# nginx -s reload
8.拷贝nginx语法高亮,发给vim的插件目录
[root@localhost ~]# mkdir .vim
[root@localhost ~]# cp -r /opt/nginx-1.20.0/contrib/vim/* .vim
nginx命令行
查看nginx帮助信息
[root@localhost ~]# nginx -h
nginx version: nginx/1.20.0
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
[-e filename] [-c filename] [-g directives]
Options:
-?,-h : this help 输出nginx帮助信息
-v : show version and exit 列出nginx版本号
列出nginx版本号和编译信息
-V : show version and configure options then exit
检查nginx配置文件语法是否正确
-t : test configuration and exit
检查配置,然后输出配置信息
-T : test configuration, dump it and exit
在检查配置文件期间屏蔽非错误信息
-q : suppress non-error messages during configuration testing
发送一个信号给nginx
-s signal : send signal to a master process: stop, quit, reopen, reload
设置nginx目录前缀
-p prefix : set prefix path (default: /opt/nginx/)
-e filename : set error log file (default: logs/error.log)
指定配置文件
-c filename : set configuration file (default: conf/nginx.conf)
覆盖设置一些默认参数
-g directives : set global directives out of configuration file
- 配置文件重读
1.检查当前的nginx进程
ps -ef | grep nginx
2.修改nginx.conf配置文件
3.重写加载nginx配置
nginx -s reload
nginx虚拟主机
虚拟主机指的就是一个独立的站点配置,是nginx默认支持的一个功能,它能够有自己独立的域名、独立的IP、独立的端口配置,能够配置完整的www服务;例如网站搭建,ftp服务搭建,邮件服务器代理等等。
并且nginx支持多虚拟主机,可以在一台机器上,同时运行多个网站
nginx的多虚拟主机,可以基于:
- 多域名的形式
- 多IP的形式
- 多端口的形式
利用虚拟主机的功能,就不用为了运行一个网站,而单独的配置一个nginx服务器,或者单独的再运行一组nginx进程
利用nginx的多虚拟主机配置,我们就可以基于一台服务器,一个nginx进程,实现多个站点的配置
nginx单虚拟主机
- nginx静态网站的搭建
nginx静态资源压缩
nginx支持gzip压缩功能,经过gzip压缩之后的页面,图片,动态图这类的静态文件,能够压缩为原本的30%甚至更小,用户访问网站的体验会好很多
在主配置文件的http{}模块,添加:
gzip on;
gzip_http_version 1.1;
gzip_comp_level 4;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/png image/gif;
nginx基于IP的多虚拟主机
环境准备
准备好Linux环境以及配置好3个IP地址
[root@localhost ~]# ip address add 192.168.100.91 dev eno16777736
[root@localhost ~]# ip address add 192.168.100.92 dev eno16777736
准备好的IP信息如下
[root@localhost ~]# ip a | grep 'inet 192'
inet 192.168.100.90/24 brd 192.168.100.255 scope global eno16777736
inet 192.168.100.91/32 scope global eno16777736
inet 192.168.100.92/32 scope global eno16777736
添加nginx的配置,添加多个server{}
1.给nginx添加include包含语法,让其他目录下的配置文件参数,导入到nginx.conf中;这样的写法,能够让nginx每个配置文件看起来更简洁、清晰
mkdir /opt/nginx/conf/extra
在nginx.conf配置文件中的http{}标签中添加
include extra/*.conf
2.创建3个站点目录
[root@localhost ~]# mkdir -p /www/{90,91,92}
[root@localhost ~]# echo "I'm 90 ,hello" >> /www/90/index.html
[root@localhost ~]# echo "I'm 91 ,hello" >> /www/91/index.html
[root@localhost ~]# echo "I'm 92 ,hello" >> /www/92/index.html
3.创建3个虚拟主机(以下只列举一个,其他2个虚拟主机只需修改IP和站点目录)
[root@localhost ~]# cat /opt/nginx/conf/extra/91.conf
server{
listen 192.168.100.91:80; #基于IP主要点
server_name _;
charset utf-8;
location / {
root /www/91;
index index.html index.htm;
}
}
4.重新加载nginx配置文件;如果在修改了较多配置,在允许重启nginx的情况下,就重启;防止出现nginx有缓存的情况,出现页面无变化
nginx -s stop
nginx
5.测试
[root@localhost ~]# curl 192.168.100.92
I'm 92 ,hello
[root@localhost ~]# curl 192.168.100.90
I'm 90 ,hello
[root@localhost ~]# curl 192.168.100.91
I'm 91 ,hello
nginx基于域名多虚拟主机
基于多IP的虚拟主机,用的还是不多的,因为可能造成IP不足等情况;在没有特殊的需求下,用的更多的是基于多域名的虚拟主机
使用本地的hosts文件,进行访问测试
1.环境准备,修改本地hosts信息
[root@localhost ~]# tail -1 /etc/hosts
192.168.100.90 www.aa.com www.bb.com www.cc.com
2.创建3个站点目录
[root@localhost ~]# rm -rf /www/*
[root@localhost ~]# mkdir -p /www/{aa,bb,cc}
[root@localhost ~]# echo "welcome www.aa.com test" >> /www/aa/index.html
[root@localhost ~]# echo "welcome www.bb.com test" >> /www/bb/index.html
[root@localhost ~]# echo "welcome www.cc.com test" >> /www/cc/index.html
3.创建虚拟主机(以下只列举一个,其他2个虚拟主机只需修改域名和站点目录)
[root@localhost ~]# cat /opt/nginx/conf/extra/bb.conf
server{
listen 80;
server_name www.bb.com; #基于域名主要点
location / {
root /www/bb;
index index.html;
}
}
4.重新启动nginx服务
nginx -s stop
nginx
5.测试
[root@localhost ~]# curl www.aa.com
welcome www.aa.com test
[root@localhost ~]# curl www.bb.com
welcome www.bb.com test
[root@localhost ~]# curl www.cc.com
welcome www.cc.com test
nginx基于端口的虚拟主机
1.准备站点目录
[root@localhost ~]# echo "port 80 test" > /www/aa/index.html
[root@localhost ~]# echo "port 85 test" > /www/bb/index.html
[root@localhost ~]# echo "port 8080 test" > /www/cc/index.html
2.查看想使用的端口是否被占用
netstat -tunlp | grep 端口号
3.准备虚拟主机
[root@localhost ~]# cat /opt/nginx/conf/extra/bb.conf
server{
listen 85; #基于端口主要点
server_name _;
location / {
root /www/bb;
index index.html;
}
}
4.重新启动nginx服务
nginx -s stop
nginx
5.测试
[root@localhost ~]# curl 192.168.100.90:80
port 80 test
[root@localhost ~]# curl 192.168.100.90:85
port 85 test
[root@localhost ~]# curl 192.168.100.90:8080
port 8080 test
nginx访客日志
日志对于程序员是最重要的,可以用于问题排错,记录程序运行时的状态,一个好的日志配置,能够给运维人员,开发人员精准的问题定位功能。
nginx开启日志功能只需要在nginx.conf里面找到 log_format参数,定义日志的格式;以及定义日志存储的位置,日志的格式、路径、大小等等
定义在全局配置中(所有站点都往这个日志写)
nginx.conf配置日志功能代码如下
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;
#access_log "pipe:rollback logs/access_log interval=1d baknum=7 maxsize=2G" main;
.......
}
nginx的访客内容如下(对应上面的日志格式)
192.168.10.1 - - [11/May/2021:13:40:34 -0400] "GET / HTTP/1.1" 200 555 "-" "curl/7.55.1"
$remote_addr 记录访客的客户端IP地址
$remote_user 记录远程客户端的访客用户名
[$time_local] 记录访问的时间和地区信息
"$request" 记录用户的http请求的首行信息
$status 记录用户的http请求状态,也就是请求发出之后,响应的状态
$body_bytes_sent 记录服务器发给客户端的响应体数据字节大小
"$http_referer" 记录本次请求是从哪个链接过来的,可以根据refer信息来进行防盗链设置
"$http_user_agent" 记录客户端的访问信息,如浏览器信息,手机浏览器信息
"$http_x_forwarded_for" 可以捉到藏在代理服务器后面的真实客户端ip信息
由于写在http{}模块下属于全局配置,所以的站点访客日志都会写在一起,这样不方便管理和排查
所以我们可以给每个站点单独配置一个日志文件
1.修改配置文件如下
第一个站点
server {
listen 80;
server_name www.aa.com;
charset utf-8;
access_log logs/aa_access.log main;
#access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main;
location / {
root /www/aa;
index index.html index.htm;
}
}
第二个站点
[root@localhost conf]# cat extra/bb.conf
server{
listen 80;
server_name www.bb.com;
access_log logs/bb_access.log;
location / {
root /www/bb;
index index.html index.htm;
}
}
2.重新加载配置文件
nginx -t
nginx -s reload
3.查看logs目录下是否新生成两个日志文件
[root@localhost nginx]# ls logs/
aa_access.log access.log bb_access.log error.log nginx.pid
4.测试
[root@localhost nginx]# curl www.aa.com
[root@localhost nginx]# cat logs/aa_access.log
192.168.10.80 - - [11/May/2021:14:09:15 -0400] "GET / HTTP/1.1" 403 567 "-" "curl/7.29.0" "-"
[root@localhost nginx]# cat logs/bb_access.log
[root@localhost nginx]#
nginx目录浏览功能
能够将你的机器上的目录资料,提供一个展示,无论是谁都可以快速访问
修改nginx.conf配置,这个功能是在虚拟主机里定义的
[root@localhost nginx]# cat conf/extra/index.conf
server{
listen 8080;
server_name _;
#让虚拟主机支持中文解析
charset utf-8;
#域名匹配,所有的请求都会进入如下的目录解析
location / {
root /www/index;
#关闭虚拟主机的默认首页功能
#index index.html;
autoindex on; #主要点
}
}
[root@localhost nginx]#
nginx状态页
nginx提供了status模块,用于检测nginx的请求连接信息,这个功能需要在编译安装的时候,添加–with-http_stub_status_module,才能使用
nginx -V 检查当前nginx是否支持status功能
当你支持status功能,我们可以添加一个conf配置文件,用于检测状态页的功能
在extra目录下,创建一个status.conf文件并写入一下内容
[root@localhost nginx]# cat conf/extra/status.conf
server{
listen 9000;
server_name _;
location / {
stub_status on; # 主要点
access_log off;
}
}
重新加载nginx配置
nginx -t
nginx -s reload
访问nginx状态页
192.168.10.80:9000
查看内容如下
Active connections: 1 显示正在处理的活动的连接数
server accepts handled requests request_time
12 12 47 0
Reading: 0 Writing: 1 Waiting: 0
server nginx启动后一共处理的请求数
accepts handled nginx启动后创建的握手数
requests nginx一共处理了多少次请求
request_time nginx处理的时间
Reading nginx读取到客户端的headers数量
Writing nginx响应给客户端的headers数量
Waiting nginx处理完毕请求之后,等待下一次的请求驻留的连接数
nginx错误日志
nginx能够把自身运行时故障的信息,也写到相对应的日志文件中,称之为error_log
对于错误信息的调试,也是运维人员维护nginx的一个重要手段
nginx想要使用error_log就得在nginx.conf配置文件中打开,可以写在全局配置中(把nginx所有配置的错误写入日志中),http{}模块(把全部虚拟主机的错误记录到日志中)或server{}虚拟主机中(只记录单个虚拟主机的错误)
错误日志的语法
error_log file level;
错误日志级别
debug
info
notice
warn
error
crit
alert
emerg
这个级别是越来越严重,级别写的越低,记录的日志越详细,没有必要...
级别越高,日志记录的内容就越少,生存环境下常用的是warn,error,crit模式
日志的级别,可能会给服务器增加额外的大量IO消耗;因此,根据你实际的工作需求定制
针对虚拟主机添加错误日志
server{
listen 85;
server_name www.bb.com;
access_log logs/bb_access.log;
error_log logs/bb_error.log;
location / {
root /www/bb;
index index.html index.htm;
}
}
重新加载配置文件
nginx -t
nginx -s reload
查看是否生成日志文件
[root@www ~]# ls /opt/nginx/logs/
aa_access.log access.log bb_access.log bb_error.log error.log nginx.pid
测试
nginx location匹配
nginx的location作用,是根据用户访问的url,进行不同的处理方式
针对用户请求的网站的url进行匹配处理,然后进行对应的处理
location相关语法
location [ = | ~ | ~* | ^~] url {
#做出的相应的处理动作
}
#nginx有关location的匹配 符号如下
匹配符 匹配规则 优先级
= 精确匹配 1
^~ 以某个字符开头,不做正则处理 2
~* 支持正则的匹配模式 3
/blog/ 当你访问192.168.10.90/blog/xxx 4
/ 通用匹配,不符合其他的location的匹配规则,就走到这里 5
案例演示
新创建一个配置文件
[root@www ~]# cat /opt/nginx/conf/extra/test_location.conf
server{
listen 92;
server_name _;
#最低级匹配,不符合其他location就来这
location / {
return 401;
}
#优先级最高,精确匹配
location = / {
return 402
}
#以/blog/开头的url,来这里;如符合其他location,则以优先级判断
location /blog/ {
return 403;
}
#匹配任何以/img/开头的请求,不匹配正则
location ^~ /img/ {
return 404;
}
#匹配任何以.gif结尾的请求,支持正则
location ~* \.(gif|jpg|jpeg)$ {
return 500;
}
}
重新加载配置文件
nginx -t
nginx -s reload
浏览器测试,注意优先级(如下只展示一部分)
nginx的url地址重写功能
nginx的url地址重写功能,主要是使用nginx提供的rewrite功能,且支持正则表达式
rewrite能够实现url的跳转,实现url规范化,根据请求的变量实现url跳转等等,基于url重写功能常见效果如下:
- 对于爬虫程序的封禁,让其跳转到一个错误的页面
- 动态的url,伪装成静态的html页面,便于搜索引擎的抓取
- 新旧域名的更新,替换;www.aa.com >>> www.aa.com.cn
rewrite语法
rewrite ^/(.*) www.baidu.com/$1 permanent
#解释
rewrite 是nginx地址重写的关键词指令,开启跳转功能
正则^/(.*) 表示匹配所有的请求,匹配成功后,跳转到后面指定的url地址
$1 是取出前面正则表达式分组的括号里的内容
permanent 表示301重定向的标记
rewrite结尾的参数标记如下
- Last 规则匹配完成后,继续向下匹配新的location
- break 本条规则匹配完成后,立即停止匹配动作
- Redirct 返回302临时重定向状态码,浏览器地址栏显示跳转后的url,爬虫不会更新
- Permanent 返回301永久重定向,浏览器地址显示跳转后的url,爬虫更新该网站url
last和break用于实现url重写,浏览器的地址栏不会发生变化
redirct和permanent也是用于url跳转,浏览器url地址栏发生变化,跳转到新的url地址栏
实现一个301 URL跳转
[root@www ~]# cat /opt/nginx/conf/extra/test_rewrite.conf
server{
listen 98;
server_name _;
location / {
rewrite ^/(.*) http://www.baidu.com/$1 permanent;
}
}
重新加载配置文件
nginx -t
nginx -s reload
测试
浏览器输入192.168.10.80:98 是否会跳转到百度的页面
nginx访问认证
nginx提供了认证模块,语法是
location / {
auth_basic 'string'; #开启认证功能并起名
auth_basic_user_file conf/htpasswd #存放账号密码的文件
}
linux提供了密码生成命令
htpasswd是apache提供的密码生成工具,nginx也支持auth_basic模块,因此我们可以利用htpasswd命令生成账号密码文件,提供给nginx使用
yum install -y httpd-tools
#语法
htpasswd -bc .access username password
-b 在命令行中输入 账号密码
-c 创建密码文件
默认.access文件采用MD5加密方式来验证
实际操作案例
准备一个配置文件
[root@www ~]# cat /opt/nginx/conf/extra/bb.conf
server{
listen 85;
server_name www.bb.com;
access_log logs/bb_access.log;
error_log logs/bb_error.log;
location / {
root /www/bb;
index index.html index.htm;
auth_basic 'welcome to bb.com';
auth_basic_user_file /opt/nginx/conf/extra/htpasswd;
}
}
生成一个htpasswd密码文件
[root@www ~]# htpasswd -bc /opt/nginx/conf/extra/htpasswd qhj 123
Adding password for user qhj
重新加载配置文件
nginx -t
nginx -s reload
测试访问