第六周. nginx实践
任务一:总结nginx的配置结构和流量访问逻辑过程
Nginx使用简洁而灵活的配置文件来定义服务器的行为。 配置文件通常包括全局配置、HTTP模块配置、Server配置以及Location配置。
1.客户端(client)发起 HTTP/HTTPS 请求到 Nginx。 2.Nginx 的 Worker 进程通过多路复用技术接收请求,根据请求类型和配置,使用相应模块(如 ht_proxy、ht_fastcgi 等)进行处理。 3. 如果请求需要与后端服务器(Backend)交互,Worker 进程通过指定协议(HTTP、FastCGI 等)将请 求转发给后端服务器。 4.后端服务器处理请求后返回响应,Nginx 的 Worker 进程接收响应,若配置了 Proxy Cache,会根据 缓存策略决定是否缓存响应,最后将响应返回给客户端。
任务二:搭建nginx完成二进制安装和多OS下的软件包安装过程
在rokcy和Ubuntu上采用二进制安装时,分别使用命令“yum install nginx"和"apt install nginx"即可,之后使用“sysgtemctl status nginx"查看状态,若不是active,则使用命令"systemctl start nginx"启动即可。若使用源码安装,以rokcy为例,首先准备编译环境,使用命令“yum install gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl devel systemd-devel zlib-devel yum install libxml2 libxml2-devel libxslt libxslt-devel php-gd gd-devel”,之后创建目录,获取软件并解压“mkdir /softs; cd /softs wget https://nginx.org/download/nginx-1.23.0.tar.gz tar xf nginx-1.23.0.tar.gz”,然后创建运行用户“useradd -r -s /usr/sbin/nologin nginx”,之后定制配置“./configure --prefix=/data/server/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”在nginx-1.23.0/下,然后依次使用“make"和”make install"编译并安装,之后可以使用“chown -R nginx:nginx /data/server/nginx/”修改用户和用户组,启动nginx的命令为“/data/server/nginx/sbin/nginx”,若想要修改用nginx直接启动,可使用命令“echo "export PATH=/data/server/nginx/sbin:$PATH" >> /etc/bashrc”和“source /etc/bashrc“,可使用”curl http://localhost/“进行浏览器访问,具体结果如下图所示。
之后,使用”mkdir /data/server/nginx/run“创建PID目录,并使用”chown -R nginx:nginx /data/server/nginx/run“更改用户和用户组,最后在/data/server/nginx/conf/nginx.conf中修改pid文件路径为”pid /data/server/nginx/run/nginx.pid;“
最后我们在/usr/lib/systemd/system/nginx.service中创建nginx服务脚本,内容为[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=/data/server/nginx/run/nginx.pid ExecStart=/data/server/nginx/sbin/nginx -c /data/server/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID LimitNOFILE=100000 [Install] WantedBy=multi-user.target。之后使用”systemctl daemon-reload“重载服务脚本,后面我们就可以直接使用”systemctl start nginx"来开启以及'systemctl stop nginx"来启动和关闭nginx服务了,具体结果如下图所示。
任务三:完成nginx https配置,防盗链,重定向相关实践过程
Nginx 中的 Https 功能需要 ngx_http_ssl_module 模块支持,使用 Yum/apt 安装的 Nginx 中己经包含了该模块的功能,如果使用的是自行通过源码编译安装的 Nginx,需要在编译的时候指定相关编译项.
https配置:以Ubuntu10-0-0-13进行测试(ip地址为10.0.0.13,后面同理),首先准备密钥环境,使用命令下载“apt install easy-rsa -y”,之后使用命令“cd /usr/share/easy-rsa/”切换到目录中并使用命令“./easyrsa init-pki”初始化环境,之后使用命令“./easyrsa build-ca nopass”生成CA机构证书,之后“./easyrsa gen-req sswang.magedu.com nopass”生成私钥和证书申请文件,之后使用命令“./easyrsa sign-req server sswang.magedu.com”签发证书,提示输入yes即可,之后使用命令“cat pki/issued/sswang.magedu.com.crt pki/ca.crt > pki/sswang.magedu.com.pem”合并服务器证书,签发机构证书为一个文件,并使用命令给私钥加读权限“chmod +r pki/private/sswang.magedu.com.key”,之后回到nginx的子配置文件中,进行如下配置“server { listen 80 default_server; server_name sswang.magedu.com; root /data/server/nginx/web1; # return 301 https://$host$request_uri; # 301重定向 rewrite ^(.*) https://\$server_name\$1 permanent; #rewrite 重定向,二选一 } server{ listen 443 ssl; server_name sswang.magedu.com; root /data/server/nginx/web1; # 定制ssl的能力 ssl_certificate /usr/share/easy-rsa/pki/sswang.magedu.com.pem; ssl_certificate_key /usr/share/easy-rsa/pki/private/sswang.magedu.com.key; ssl_session_cache shared:sslcache:20m; ssl_session_timeout 10m; }”,最后使用命令“systemctl restart nginx”重启nginx服务。在rocky10-0-0-12主机中,使用命令"curl 10.0.0.13 -I"会提示301跳转,使用“curl https://10.0.0.13 -I”会提示证书不安全,使用“curl https://10.0.0.13 -k”命令则可显示结果。如下图所示。
源码下载和二进制下载下配置文件的区别:二进制安装的nginx,主配置文件默认是/etc/nginx/nginx.conf中,删除默认的nginx站点配置“rm -rf /etc/nginx/sites-enabled/default”后,可在/etc/nginx/conf.d/下直接定制子配置文件。这是由于主配置文件/etc/nginx/nginx.conf已经include了子配置文件夹。而源码下载的nginx中,默认只有主配置文件/data/server/nginx/conf/nginx.conf,我们可以添加子配置文件目录“/data/server/nginx/conf/conf.d"如下图所示。
为了使子配置文件目录“/data/server/nginx/conf/conf.d"下的配置文件生效,我们需要在主配置文件/data/server/nginx/conf/nginx.conf中额外添加”include /data/server/nginx/conf/conf.d/*.conf",具体如下图所示。
重定向:在 Nginx 中,rewrite 指令用于重写 URI,允许 Nginx 修改客户端请求的 URI,基于此,可用该 指令实现 URL 重定向,修改请求参数,改变请求含义,改变 URL 结构等,该指令来自于 ngx_http_rewrite_module 模块。
首先在nginx服务机UBUNTU10-0-0-13(ip地址10.0.0.13,后面同理)执行命令echo "11111" > /data/server/nginx/web1/1.html echo "22222" > /data/server/nginx/web1/2.html echo "33333" > /data/server/nginx/web1/3.html echo "aaaaa" > /data/server/nginx/web1/a.html echo "bbbbb" > /data/server/nginx/web1/b.html echo "ccccc" > /data/server/nginx/web1/c.html来准备工作,所有这些html文件都放在/data/server/nginx/web1/目录下,然后在子配置文件下修改内容,server { listen 80 default_server; root /data/server/nginx/web1; location /1.html { rewrite /1.html /2.html; # 访问1跳转到2 rewrite /2.html /3.html; # 访问2跳转到3 } location /2.html { rewrite /2.html /a.html; # 访问2跳转到a } } eof location /3.html { rewrite /3.html /b.html; # 访问3跳转到b } location /c.html { rewrite /c.html /3.html; # 访问c跳转到3 rewrite /3.html /1.html; # 访问2跳转到a rewrite /1.html /c.html; # 访问1跳转到c },之后使用命令重启服务“sysetmctl restart nginx",之后在rocky10-0-0-12上访问”curl 10.0.0.13/1.html"、”curl 10.0.0.13/2.html"、”curl 10.0.0.13/3.html"、”curl 10.0.0.13/c.html"可得到不同的跳转效果,若添加break和last,则分别表示,停止在server里的跳转以及停止当前location里的跳转,执行其他跳转的location,具体配置如下图所示。
在rocky10-0-0-12上的所有curl结果如下图所示。
任务四:完成nginx虚拟主机配置,包括ip 多端口 多域名相关的配置
ip多端口,还是以UBUNTU10-0-0-13作为nginx服务器,在子配置文件中,我们进行如下配置server { listen 80; root /data/server/nginx/web1; } server { listen 81; root /data/server/nginx/web2; } server { listen 82; root /data/server/nginx/web3; },之后使用“systemctl restart nginx"重启服务,每个目录下的html文件内容如下图所示。
之后我们在rokcy10-0-0-12上进行curl访问,具体的访问信息如下图所示。
下面我们来进行多域名相关的配置,同样在UBUNTU10-0-0-13的子配置文件中,改为下述内容server { listen 80 default_server; server_name www.a.com; root /data/server/nginx/web1; } server { listen 80; server_name www.b.com; root /data/server/nginx/web2; } server { listen 80; server_name www.c.com; root /data/server/nginx/web3; },注意default_server用来访问未知服务,即访问的域名在server_name中都不存在时默认使用该server,之后使用命令'systemctl restart nginx"重启服务,之后在rocky10-0-0-12上分别进行访问,具体演示如下图所示。
任务五:完成nginx反向代理和动静分离相关的演示
nginx反向代理:在ubuntu子配置文件中,修改为server { listen 80 default_server; root /data/server/nginx/web1; location / { proxy_pass http://10.0.0.13:81; # 交给后端的81端口服务 proxy_connect_timeout 2s; # 设置连接超时时间为2s } } server { listen 81 default_server; root /data/server/nginx/web2; },如下图所示。
之后使用"systemctl restart nginx"重启服务,之后在rocky10-0-0-12中使用”curl 10.0.0.13:80"进行访问,注意,在未配置反向代理时,结果为nginx web1,而此时反向代理将10.0.0.13:80的访问转为10.0.0.13:81,因此结果为nginx web2,如下图所示。
