文章目录
我天,nginx功能这么强大,它的安装包竟然1M都不到
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7e16b69ac275697d8942461115317542.png)
nginx的编译安装依赖gcc库,所以使用yum源安装相应的依赖库。
yum -y install gcc pcre-devel openssl-devel zlib-devel
nginx对应的编译安装方法根据需要启动相关配置
./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
编译
make -j 2 && make install
tree /apps/nginx/
#修改权限,完全控制文件夹的权限
chown -R nginx.nginx /apps/nginx
创建软连接启动
创建软连接启动时为了在任何目录下都可以随时启动nginx,不用在必须切换到nginx的sbin目录下才能启动
ln -s /apps/nginx/sbin/nginx /usr/sbin/
自己访问自己 curl 10.0.0.201
创建Nginx自启动文件
为了以后更方便。可以写一个service文件,把它设置为开机启动。
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/run/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
创建目录
mkdir /apps/nginx/run/
需要修改nginx.conf里的pid
修改为 pid /apps/nginx/run/nginx.pid;
启动nginx
systemctl enable --now nginx
ss -ntl
http配置块
在http块中,如果有多个server语句块也就意味着有多个虚拟主机。nginx默认有一个server配置,
默认的server语句块里定义了:
listen监听端口,
server_name主机头(询主机名称),
location存放的网页放在哪个路径下,
root html配置的是相当路径,将来我们可以自定义到别的路径。index的配置是去寻找root下的html里的的默认网页路径(谁做默认网页)。如下配置就是去寻找/apps/nginx/html目录里的index.html页面,如果找不到就找后面的index.htm
http{
...
...# 各个server的公共配置
...# 每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
server{
listen 80;
server_name localhost;
location /{
#默认路径的存放网站的数据目录,存放网页的路径,这个路径是相对于我们编译安装的/apps/nginx目录下的html
root html;
index index.html index.htm;
}
}
server{
...
server_name #虚拟主机名
root #主目录
alias #路径别名
location [operator] URL{ #指定url的特性
...
if condition{
...
}
}
}
}
http语句块的公共配置
include mime.types 导入支持的文件类型,是相对于/apps/nginx/conf的目录
他的功能就是为了支持各种文件资源类型,比如除了支持html,还支持图片、多媒体,支持php。可以看下mime.types的配置内容
隐藏nginx版本号
server_tokens off
显示字符集
charset utf-8;
location的配置使用
在一个server中的location配置段可以存在多个,用于实现从uri到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,按照一定的优先级找出一个最佳匹配,而后应用其配置。
在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
location官方帮助文档:
http://nginx.org/en/docs/http/ngx_http_core_module.html#location
location的配置广泛应用于在项目的动静分离。
location的语法规则
location [ = | ~ | ~* | ^~] uri {...}
= 用于标准uri前,需要请求字符串与uri精准匹配,大小写敏感,如果匹配成功就停止向下匹配并立即处理请求。
~ 用于标准uri前,表示包含正则表达式,并且区分大小写。
~* 用于标准uri前,表示包含正则表达式,并且不区分大小写。
^~ 用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分最匹配检查,不区分字符大小写。
不带符号 匹配起始于此uri的所有的uri
匹配的优先级从高到低:
=, ^~, ~/~*,不带符号
URI和URL
URI: Uniform Resource Identifier(统一资源标识符)
URL:Uniform Resource Locator(统一资源定位符)
像https://www.baidu.com/我们可以通过这个链接来访问百度的资源。这个链接包含了一些信息:https协议,www(万维网),baidu.com域名等。URL指定要使用的协议类型,而URI不涉及协议规范。
官方试例
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
The “/” request will match configuration A,
The “/index.html” request will match configuration B,
The “/documents/document.html” request will match configuration C,
The “/images/1.gif” request will match configuration D,
and the “/documents/1.jpg” request will match configuration E.
“=”精准匹配
精准匹配一般用于匹配组织的logo等相对固定的url,匹配优先级最高
[root@centos8 conf.d]# vim www.conf
server{
listen 80;
server_name www.flylei.org;
location =/logo.png{
root /data/nginx/images;
index index.html;
}
}
访问www.flylei.org/logo.png
“~”区分大小写的模糊匹配
location的主要配置
location ~/A.?\.png{
index index.html;
root /data/nginx/html/images;
}
logo的存放路径
访问http://www.flylei.org/Aa.png
思考当访问http://www.flylei.org/aa.png时,会从以下哪个location中去匹配
会去匹配 第一个location / ,那我们就在/data/nginx/html/pc下放一个叫aa.png的logo
然后访问http://www.flylei.org/aa.png
“~*”不区分大小写的模糊匹配
location ~*/A.?\.png{
index index.html;
root /data/nginx/html/images;
}
将/data/nginx/html/images下放置Aa.png和aa.png
访问http://www.flylei.org/aa.png
访问http://www.flylei.org/Aa.png
“ ^~ /*** ” URI开始
location ^~ /images{
index index.html;
root /data/nginx;
}
#请求访问是去/data/nginx目录下的images目录,也就是他的请求路径是/data/nginx/images
报错了,遇到了403
不慌,先查看nginx错误日志看看是什么错
#查看nginx错误日志
tail /apps/nginx/logs/error.log -f
访问的路径不对,应该是访问http://www.flylei.org/images/logo.png,直接通过浏览器去访问linux上的一个目录肯定是没有权限的。
修改匹配所有的.png的后缀后看能不能去访问/data/nginx/html/images下的logo.png
结果仍然访问的是/data/nginx/images下的logo.png。由此可见“^~”的优先级高于波浪星号的优先级。
location的生产应用
根据用户访问资源类型的不同,去寻找不同资源所存放的路径。比如前后端分离开发的项目,当用户只需要访问静态页面的时候,就去专门存放静态资源的路径下去找静态资源。需要访问动态数据的时候就去专门存放动态数据的路径去找动态资源,这个存放动态数据的路径有可能就是一个后台的应用程序的访问路径。这样动静资源分开存放,更方便更易于维护。
nginx访问tomcat上的资源
此次实验的目的是通过nginx代理转发去访问Tomcat服务uplod目录下的iPhone.jpg图片
配置tomcat的uplod目录下图片资源的访问规则“location”
location ^~/uplod/ {
proxy_pass http://10.0.0.201:8080/uplod/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#8080端口是Tomcat服务的默认端口
配置完后“nginx -t”检查语法,“nginx -s reload”平滑重启
然后我们访问“http://10.0.0.201:8080/uplod/iPhone.jpg”
成功了
tomcat开启支持软链接
tomcat对软链接的支持是在context.xml里配置的,如下,不同的tomcat版本有不同的配置差别,我的是tomcat8.5.66
tomcat5,6,7版本是:
<Context allowLinking="true" />
tomcat8,9版本是:
<Context>
<Resources allowLinking="true" />
</Context>
配置完开启tomcat支持软链接,重启tomcat后就可以通过uplod这个软链接去访问了
nginx虚拟主机
创建存放两个虚拟主机页面的文件夹
创建两个虚拟主机的访问首页
配置修改两个虚拟主机的service配置
为了不影响nginx的主配置文件nginx.conf里的配置,我们单独配置这两个虚拟主机的service配置文件,然后在nginx.conf文件里将这两个虚拟主机的配置文件包含进去,
包含语句为“include /apps/nginx/conf.d/*.conf;”
用两个域名访问需要用的域名解析,于是需要修改hosts文件
配置好以后我们重启nginx就可以访问我们的两个虚拟主机了
一个主机的域名是“www.flylei.org”
一个主机的域名是“m.flylei.org”
windows浏览器访问也需要修改hosts文件,修改后就可以访问啦
此时10.0.0.201就有三个默认页面了,那当我们curl 10.0.0.201时,回去访问哪个页面呢。此时还是会去访问nginx官方默认的首页,也就是‘welcome to nginx’的哪个页面。是因为我们将两个虚拟主机的配置文件的include包含语句块放在了nginx主配置文件的最下面,所以最后才被加载到。如果将include的包含语句快放在最前面则就会首先去加载两个虚拟主机的页面,两个虚拟主机的配置文件又会根据配置文件的首字母的字典排序去优先加载。www.conf和mobile.conf因为m字母在w字母的前面所以优先加载的是mobile.conf
使用tree命令查看include语句下conf.d目录下有包含了哪些配置文件哪些文件
接下来再来看访问10.0.0.201时访问的是哪个页面
root和alias
root
root:指定web的家目录,在定义location的时候,文件的绝对路径等于root+location
root可以存放在server语句块里也可以存放在location语句块里,
参考官方文档root官方文档
以下location配置是怎么样的一个访问规则
location /about {
root /opt/nginx/html;
}
当访问www.flylei.com/about时,是去找/opt/nginx/html目录下的about目录下的资源,当我们没有创建about相关目录时,就会报错404
查看nginx的错误日志可以看到,是去找html目录下的about目录下的资源,于是我们去创建about目录
创建about目录下的index.html页面后我们再去访问,就访问成功了。
alias
alias:定义路径别名,会把访问的路径重修定义到其他指定的路径,文档映射的另一种机制,只能出现在location语句块里。此命令使用较少。
server{
#注意about后不要加/,使用alias的时候如果后面加了斜杠,则下面的路径配置必须加斜杠,否测403
location /about {
alias /opt/html/about;
}
}
如果将location的语句块配置为,又将会是怎么样的一个访问规则
location /about {
alias /opt/nginx/html;
}
alias也就意味着当访问/about目录时,直接去找/opt/nginx/html下的资源页面,而不是像root那样以root路径为前缀补上/about再去访问。
#-l参数跟进重定向路径
curl -L www.flylei.com
nginx语法检查和平滑重启
[root@test_officeweb_69_5 sbin]# cd /usr/local/nginx/sbin
[root@test_officeweb_69_5 sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@test_officeweb_69_5 sbin]# ./nginx -s reload
nginx报错(98: Address already in use)
报错提示好像是说地址被占用,网上的大佬说是80端口被占用,使用“sudo fuser -k 80/tcp
”关闭80端口即可。解决Nginx启动报nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
#查找80端口
netstat -natp |grep 80
#关闭80端口
sudo fuser -k 80/tcp
Nginx配置反向代理
正向代理和反向代理
正向代理:代理的是客户端
反向代理:代理的是服务器
管控期间居家办公,居家访问不了公司的内网,像公司的测试环境、数据库、Gitlab等都连接不上。于是公司就搞了VPN,分配给我们VPN账号,登录VPN之后就可以访问公司的办公环境了。那么此时VPN就是我们的正向代理了,公司的办公环境是内网局域网,外网IP是访问不了内网的。那此时VPN自然是公司内网环境的一部分,于是VPN就代理我们去访问公司的内网了。
nginx的反向代理配置
试验目的通过域名www.leiproxy.com去访问本地的Tomcat服务默认欢迎首页。
之前在10.0.0.201的机器上部署的Tomcat,这次通过nginx的反向代理去访问。
首先创建一个配置反向代理的proxy.conf文件
proxy.conf的配置内容如下
主要配置语法为proxy_pass语句块
server{
listen 80;
server_name www.leiProxy.com;
location / {
root html;
index index.html index.htm;
proxy_pass http://10.0.0.201:8080;
}
}
要想通过www.leiProxy.com跳转到指定的ip上,需要修改本机的hosts文件,windows系统上hosts的文件存放在“C:\Windows\System32\drivers\etc”目录下,修改如下
然后nginx -t 检测语法,最后平滑重启加载nginx。访问www.leiproxy.com
这样我们就简单的实现了一个nginx的反向代理。www.leiproxy.com反向代理了10.0.0.201机器上的Tomcat服务。www.leiproxy.com就是反向代理站点,浏览器访问的是反向代理站点,由反向代理站点去访问真实的Tomcat服务然后再返回给浏览器。这个反向代理站点可以是www.leiproxy.com这个域名映射到的任意ip地址上的。这样的访问方式从一定程度上保证了Tomcat服务的安全,用户不是直接去访问Tomcat服务而是先访问代理服务器,再由代理服务器去访问Tomcat。如果是一个恶意请求,反向代理服务器就可以一定程度上避免恶意请求直接去攻击Tomca服务器(个人拙见)。