Nginx、lnmp

Nginx构建

模块化软件:功能众多,需要什么功能就下载安装什么功能,不需要就不安装

软件包:

pcre-devel:支持正则表达式(正则表达式依赖包)

openssl-devel:让nginx搭建安全加密网站(SSL加密依赖包)

配置参数:

--prefix=                                指定安装目录

--user=                                  指定用户

--group=                                指定组

--with-http_ssl_module          开启ssl加密功能


常用选项:

--- -V        查看编译参数

--- -c         指定配置文件,启动服务

一、源码安装

程序运行时,需要权限的支持,程序指定账户或用户创建指定(用户有什么权限,程序就有什么权限)

# tar -xf nginx-1.22.1.tar.gz     #解包
# cd nginx-1.22.1/                #进目录
# yum -y install gcc make pcre-devel openssl-devel    #编译安装工具,依赖包
# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module    #配置,指定安装位置,提供运行权限,安装模块(开启SSL加密功能)
# make && make install    #编译安装
# cd /usr/local/nginx/    #安装目录
# ls
conf  html  logs  sbin
# useradd nginx -s /sbin/nologin    #创建用户
# sbin/nginx                        #起服务
# systemctl stop firewalld
# ss -ntulp
Netid     State      Recv-Q     Send-Q         Local Address:Port           Peer Address:Port     Process                                                                                           
tcp       LISTEN     0          128                  0.0.0.0:80                  0.0.0.0:*         users:(("nginx",pid=9393,fd=9),("nginx",pid=9392,fd=9))                                          
# sbin/nginx -s stop    #停服务
# sbin/nginx -V         #查看软件信息
# sbin/nginx
# sbin/nginx -s reload              #重载配置文件
# echo nginx-test~ > html/abc.html
# echo in-test > html/index.html

conf 配置文件 sbin 主程序
html 网页目录 logs 日志文件

nginx命令的用法
[root@proxy nginx]# useradd -s /sbin/nologin nginx
/usr/local/nginx/sbin/nginx                    #启动服务
/usr/local/nginx/sbin/nginx -s stop            #关闭服务
/usr/local/nginx/sbin/nginx -s reload        #重新加载配置文件
/usr/local/nginx/sbin/nginx -V                #查看软件信息

ss命令可以查看系统中启动的端口信息,该命令常用选项如下:

-a显示所有端口的信息

-n以数字格式显示端口号

-t显示TCP连接的端口

-u显示UDP连接的端口

-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口

-p显示监听端口的服务名称是什么(也就是程序名称)

nginx服务默认通过TCP 80端口监听客户端请求:

#        ss -anptu | grep nginx

二、客户端访问测试

Nginx服务默认首页文档存储目录为/usr/local/nginx/html,在此目录下默认有一个名为index.html的文件,使用客户端访问测试页面:

# systemctl  stop  firewalld   #关闭防火墙
# curl http://192.168.88.5


Welcome to nginx!

...

html/abc.html

Nginx、lnmp_第1张图片

html/index.html

Nginx、lnmp_第2张图片

用户认证

指令 执行什么任务

配置指令 "参数";(; 表示指令结束)

指令 auth_basic

---开启用户认证功能 auth_basic

---auth_basic "password";

指令 auth_basic_user_file

---网站用户名、密码存放文件 auth_basic_user_file

---auth_basic_user_file "/usr/local/nginx/pass";

htpasswd(由httpd-tools软件包提供):创建加密格式的密码

[root@proxy nginx]# pwd                    #nginx安装目录
/usr/local/nginx
[root@proxy nginx]# vim conf/nginx.conf
    ......
    server {
        listen       80;
        server_name  localhost;
        auth_basic "password";                            #添加指令 认证提示符信息
        auth_basic_user_file "/usr/local/nginx/pass";     #添加指令 认证的密码文件
        #charset koi8-r;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

#生成密码文件,创建用户及密码
 使用htpasswd命令创建账户文件,需要确保系统中已经安装了httpd-tools
[root@proxy nginx]# yum -y install httpd-tools    #安装软件包
[root@proxy nginx]# htpasswd -c pass tom        #创建认证用户;-c 新创建文件
New password: 
Re-type new password: 
Adding password for user tom
[root@proxy nginx]# cat pass 
tom:$apr1$3jI2KzIL$O.PtuBq87ItaWB3iunmTe0
[root@proxy nginx]# htpasswd pass jerry        #追加账户,不使用-c选项
New password: 
Re-type new password: 
Adding password for user jerry
[root@proxy nginx]# cat pass 
tom:$apr1$3jI2KzIL$O.PtuBq87ItaWB3iunmTe0
jerry:$apr1$wkOl6T8.$9X32i8GNkeCuEg53schba.
[root@proxy nginx]# sbin/nginx -s reload        #重新加载配置文件

nginx虚拟web主机

一、基于域名的虚拟主机

配置基于域名的虚拟主机,实现两个基于域名的虚拟主机,域名分别为www.a.com和www.b.com

http {
    server {
    listen 80;
    server_name www.a.com;
    root html;
    index index.html;
    }
}
[root@proxy nginx]# pwd
/usr/local/nginx
[root@proxy nginx]# vim conf/nginx.conf
http {
    ......
    server {                                        #一个server表示一个虚拟web主机
        listen       80;                            #监听端口
        server_name  www.b.com;                     #域名(新虚拟主机定义域名)
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        root   html_b;                              #网页文件根目录(指定网站根路径)
        index  index.html index.htm;                #首页文件/默认页面(前面的失效,访问后面的)
    }

    server {
        listen       80;
        server_name  www.a.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}
[root@proxy nginx]# sbin/nginx -s reload

#创建网站根目录及对应首页文件
[root@proxy nginx]# mkdir html_b                        #创建b网站的目录
[root@proxy nginx]# echo ngixn-A~~ > html/index.html    #创建a网站测试页
[root@proxy nginx]# echo ngixn-B~~ > html_b/index.html  #创建b网站测试页
[root@proxy nginx]# echo 192.168.99.5 www.a.com www.b.com >> /etc/hosts 
[root@proxy nginx]# curl www.a.com
ngixn-A~~
[root@proxy nginx]# curl www.b.com
ngixn-B~~

另外:

windows环境配置hosts文件

C:\Windows\System32\drivers\etc\hosts

右键---属性---安全---编辑---users---完全控制打钩

然后用文本打开hosts,在最后添加

192.168.99.5 www.a.com www.b.com

二、基于端口的虚拟主机

    server {
            listen       8080;                        #端口
            server_name  www.a.com;          #域名
            ......
    }
        server {
            listen       8000;                         #端口
            server_name  www.a.com;           #域名
          .......
    }

三、基于IP的虚拟主机

    server {
            listen       192.168.88.5:80;              #IP地址与端口
            server_name  www.a.com;          #域名
      ... ...
    }
        server {
            listen       192.168.99.5:80;             #IP地址与端口
            server_name  www.a.com;
    ... ...
    }

SSL虚拟主机

配置基于加密网站的虚拟主机,实现以下目标:

  1. 该站点通过https访问
  2. 通过私钥、证书对该站点所有数据加密

源码安装Nginx时必须使用--with-http_ssl_module参数,启用加密模块,对于需要进行SSL加密处理的站点添加ssl相关指令(设置网站需要的私钥和证书)

加密算法:

1、信息摘要:

验证数据完整性

md5 sha256

哈希值

2、对称算法:

AES、DES 主要应用在单机数据加密

用相同的密码加密和解密

应用案例:RAR、ZIP压缩加密

3、非对称算法:

RSA、DSA 主要应用在网络数据加密

私钥 解密

公钥 加密

应用案例:网络加密(https、ssh)

openssl req -x509 -key conf/cert.key > conf/cert.pem

req -x509        #创建公钥

-key                #根据哪一个私钥来创建公钥

conf/cert.pem #公钥文件,配置文件中(可自定义)

配置

[root@proxy nginx]# vim conf/nginx.conf
… …    
server {
        listen       443 ssl;
        server_name            localhost;
        ssl_certificate      cert.pem;            #这里是证书文件
        ssl_certificate_key  cert.key;            #这里是私钥文件
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        location / {
            root   https;                        #加密网站根目录
            index  index.html index.htm;
        }
    }

[root@proxy nginx]# openssl genrsa > conf/cert.key            #生成私钥
Generating RSA private key, 2048 bit long modulus (2 primes)
..............................+++++
............+++++
e is 65537 (0x010001)
[root@proxy nginx]# openssl req -x509 -key conf/cert.key > conf/cert.pem    #生成证书,生成过程会询问诸如你在哪个国家之类的问题
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:dc                            #国家  以下是测试环境
State or Province Name (full name) []:dc                        #省份
Locality Name (eg, city) [Default City]:dc                      #城市
Organization Name (eg, company) [Default Company Ltd]:dc        #组织名
Organizational Unit Name (eg, section) []:dc                    #部门
Common Name (eg, your name or your server's hostname) []:dc     #服务器名称
Email Address []:[email protected]                                      #邮箱
[root@proxy nginx]# ls conf/cert*
conf/cert.key  conf/cert.pem
[root@proxy nginx]# mkdir https                            #创建安全网站的目录
[root@proxy nginx]# sbin/nginx -s reload
[root@proxy nginx]# echo nginx-https > https/index.html    #创建安全网站的页面
[root@proxy nginx]# curl -k https://192.168.99.5            #-k 访问加密网站(检验,-k是忽略安全风险)
nginx-https

LNMP

安装部署LNMP环境实现动态网站解析

动态网站:在不同环境访问,网站内容有可能发生变化

静态网站:在不同环境访问,网站内容不会发生变化

  • 安装部署Nginx、MariaDB、PHP、PHP-FPM
  • 启动Nginx、Mariadb、FPM服务
  • 并测试LNMP是否工作正常

目前的网站一般都会有动态和静态数据,默认nginx仅可以处理静态数据,用户访问任何数据都是直接返回对应的文件,如果访问的是一个脚本的话,就会导致直接返回一个脚本给用户,而用户没有脚本解释器,也看不懂脚本源代码。

因此需要整合LNMP(Linux、Nginx、Mysql、PHP)实现动态网站效果。

Nginx、lnmp_第3张图片

操作过程中需要安装的软件列表如下:

  • nginx
  • mariadb、mariadb-server、mariadb-devel
  • php、php-fpm、php-mysqlnd

备注:php(php主程序,解释器,翻译php编程语言 动态网站)、php-mysqlnd(程序连接数据库 高效读写数据库的数据)、php-fpm(进程管理器服务)、mariadb(数据库客户端软件)、mariadb-server(数据库服务器软件)、mariadb-devel(其它客户端软件的依赖包)。

php-fpm服务利用FastCGI技术 解析翻译index.php动态网站动态语言,找php主程序(主配置文件:/etc/php-fpm.d/www.conf)

                                                          php-fpm

客户 浏览器(app)---------------------网站服务器

          支持 html                                  index.html

                                                            index.php

[root@proxy nginx-1.22.1]# yum -y install gcc make openssl-devel pcre-devel
[root@proxy nginx-1.22.1]# ./configure --with-http_ssl_module
[root@proxy nginx-1.22.1]# make && make install
[root@proxy nginx-1.22.1]# ls /usr/local/nginx/
conf  html  logs  sbin
[root@proxy nginx-1.22.1]# yum -y install mariadb mariadb-server mariadb-devel
[root@proxy nginx-1.22.1]# yum -y install php php-mysqlnd php-fpm

#启动Nginx服务,如果服务器上已经启动了其他监听80端口的服务(如httpd),则需要先关闭该服务。
[root@proxy ~]# /usr/local/nginx/sbin/nginx             #启动Nginx服务
[root@proxy ~]# ss -utnlp | grep :80        

#启动MySQL服务
[root@proxy ~]# systemctl start  mariadb           #启动服务器
[root@proxy ~]# systemctl status mariadb           #查看服务状态
[root@proxy ~]# systemctl enable mariadb           #设置开机启动

#启动PHP-FPM服务
[root@proxy ~]# systemctl start php-fpm           #启动服务
[root@proxy ~]# systemctl status php-fpm          #查看服务状态
[root@proxy ~]# systemctl enable php-fpm          #设置开机启动

#使用PHP测试页面

配置Fast-CGI支持PHP网页解析,FastCGI是快速公共(通用)网关接口,可以连接如nginx等网站程序到网站的语言解释器(比如php),php-fpm进程使用了Fast-CGI解析动态网站页面

  • 创建PHP测试页面,测试使用PHP连接数据库的效果
  • 通过修改nginx及php-fpm配置文件实现对PHP页面的支持
# 打开php-fpm配置文件,注意该配置文件中;(分号)是注释
[root@proxy nginx-1.22.1]# vim /etc/php-fpm.d/www.conf 
listen.acl_users = apache,nginx    #用于设置允许访问FastCGI请求的用户

;listen = /run/php-fpm/www.sock    #进程间通信
listen = 127.0.0.1:9000            #网络

pm.max_children = 50                #最大进程数量
pm.start_servers = 5                #最小进程数量

[root@proxy nginx-1.22.1]# systemctl restart php-fpm

# 修改配置文件并启动服务
[root@proxy nginx-1.22.1]# cd /usr/local/nginx/
[root@proxy nginx]# vim conf/nginx.conf
        ......
        location ~ \.php$ {            #如果用户访问的路径以.php结尾(~ 支持正则)
            root           html;
            fastcgi_pass   127.0.0.1:9000;    #如果用户访问的路径以.php结尾,将页面丢给9000端口
            fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;      #加载fastcgi配置文件
        }
[root@proxy nginx]# sbin/nginx
[root@proxy nginx]# sbin/nginx -s reload

nginx 对接 php-fpm

方式一:网络

nginx------>127.0.0.1:9000------->php-fpm(IP端口要放在php-fpm身上,这里是测试,所以使用本机回环地址)

方式二:进程间通信(socket)

nginx------>php-fpm

Nginx、lnmp_第4张图片

Nginx、lnmp_第5张图片

地址重写

选项:

redirect 临时重定向,状态码302 ,爬虫不更新URI

permanent 永久重定向,状态码301 ,爬虫更新URI

last 不再读其他语句,但还会继续匹配其他location语句

echo  "nginx-c~~"  >   html/c.html        #准备素材c页面
rewrite  /a.html  /b.html  last;        #没有其他location语句时,打开b页面
rewrite  /b.html  /c.html ;

break 不再读其他语句,结束请求

        location / {                #此处为默认的location
            rewrite /a.html /b.html break;        #break可以阻止后面的语句            
            root   html;
            index  index.html index.htm;
        }
        location /b.html {                #这里是新添加的location
            rewrite /b.html /c.html;
        }

语法:

rewrite 旧地址 新地址(用户真正看到内容的地址) [选项]

修改配置文件(访问a.html重定向到b.html)

修还配置文件
[root@proxy nginx]# vim conf/nginx.conf
    server {
        listen       80;
        server_name  localhost;
        rewrite /a.html /b.html;
        location / {
            root   html;
            index  index.html index.htm;
        }   
    }   
[root@proxy ~]# echo "nginx-B~~" > /usr/local/nginx/html/b.html
重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx  -s  reload

客户端测试
http://192.168.99.5/a.html

测试redirect选项

修改nginx服务配置
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  localhost;
        rewrite ^/a.html$  /b.html  redirect;    #支持正则
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx  -s  reload
客户端测试,地址栏同时发生变化
http://192.168.99.5/a.html

不同网站间跳转

修改nginx服务配置实现访问192.168.99.5的请求重定向到www.baidu.com
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  localhost;
        rewrite / https://www.baidu.com/;
        location / {
            root   html;
            index  index.html index.htm;
        }   
    }   
重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx  -s  reload
客户端测试
http://192.168.99.5

修改配置文件(访问192.168.99.5/下面子页面,重定向到www.baidu.com/下相同的子页面)
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  localhost;
        rewrite /(.*) https://www.baidu.com/$1;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx  -s  reload
客户端测试
http://192.168.99.5/test

实现不同浏览器跳转到不同页面

#创建网页目录及对应的页面文件
[root@proxy nginx]# mkdir  html/firefox
[root@proxy nginx]# echo  firefox~~  >  html/firefox/abc.html   #火狐专用页面
[root@proxy nginx]# echo  others~~  >  html/abc.html            #其他浏览器专用页面
火狐访问192.168.99.5/abc.html时可以看到html/firefox/abc.html里面内容
其他浏览器访问192.168.99.5/abc.html时可以看到html/abc.html里面内容
#修改nginx服务配置
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        if ($http_user_agent ~* firefox) {
        rewrite (.*) /firefox/$1;
        }
    }
#重新加载配置文件
[root@proxy ~]# /usr/local/nginx/sbin/nginx  -s  reload
#客户端测试
分别用火狐浏览器与其他浏览器访问相同地址http://192.168.99.5/abc.html,可以得到不同结果

[root@proxy nginx]# vim conf/nginx.conf
    server {
        listen       80;
        server_name  localhost;
        rewrite ^/a\.html$ /b.html;    #支持正则 地址重写
[root@proxy nginx]# sbin/nginx -s reload
[root@proxy nginx]# echo "nginx-b~~~" > html/b.html
[root@proxy nginx]# curl 192.168.99.5/a.html
nginx-b~~~

集群

一、反向代理(网站集群) 调度器

轮询 权重(weight 正整数)

为了看出后端服务器的不同,可以将两台后端服务器的首页文档内容设置为不同的内容

web1(100)

搭建网站

[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo httpd-web1 > /var/www/html/index.html
[root@web1 ~]# systemctl status httpd
[root@web1 ~]# systemctl enable httpd --now 
[root@web1 ~]# systemctl stop firewalld.service 

web2(200)

搭建网站

[root@web2 ~]# yum -y install httpd
[root@web2 ~]# echo httpd-web2 > /var/www/html/index.html
[root@web2 ~]# systemctl status httpd
[root@web2 ~]# systemctl enable httpd --now
[root@web2 ~]# systemctl stop firewalld.service 

nginx

测试

[root@proxy ~]# curl 192.168.99.100
httpd-web1
[root@proxy ~]# curl 192.168.99.200
httpd-web2
[root@proxy ~]# 

nginx(99.5/88.5)

配置nginx服务器,添加服务器池,实现反向代理功能

upstream:定义后端服务器集群,集群名任意

server:定义集群中的具体服务器和端口

proxy_pass:将用户的请求转发给定义的集群

max_fails:设置后台服务器的失败次数

fail_timeout:设置后台服务器的失败超时时间

###默认为轮询
[root@proxy nginx]# vim conf/nginx.conf
    upstream webserver {            #创建集群 集群名
        server 192.168.99.100:80;
        server 192.168.99.200:80;
    }
        location / {                        #调用集群写在server location中
            proxy_pass http://webserver;    #调用集群
            root   html;
            index  index.html index.htm;
        }
[root@proxy nginx]# sbin/nginx 

###权重
[root@proxy nginx]# vim conf/nginx.conf
    upstream webserver {
        server 192.168.99.100:80 weight=2;    #权重
        server 192.168.99.200:80;
    }
[root@proxy nginx]# sbin/nginx -s reload

###健康检查
[root@proxy nginx]# vim conf/nginx.conf
    upstream webserver {
        server 192.168.99.100:80;
        server 192.168.99.200:80 max_fails=2 fail_timeout=30;
    }
[root@proxy nginx]# sbin/nginx -s reload

###ip_hash
[root@proxy nginx]# vim conf/nginx.conf
    upstream webserver {
        ip_hash;
        server 192.168.99.100:80;
        server 192.168.99.200:80 max_fails=2 fail_timeout=30;
    }
[root@proxy nginx]# sbin/nginx -s reload

###down
[root@proxy nginx]# vim conf/nginx.conf
    upstream webserver {
        server 192.168.99.100:80 down;
        server 192.168.99.200:80;
    }
[root@proxy nginx]# sbin/nginx -s reload

二、四层(tcp/udp)代理(其他业务集群)

ngx_stream_core_module 模块,使用 --with-stream 开启4层代理模块
[root@proxy nginx-1.22.1]# ./configure --with-stream && make && make install 
[root@proxy nginx-1.22.1]# cd /usr/local/nginx/
[root@proxy nginx]# sbin/nginx -V
nginx version: nginx/1.22.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-10) (GCC) 
configure arguments: --with-stream
[root@proxy nginx]# vim conf/nginx.conf
stream {
    upstream backend {
        server 192.168.99.100:22;
        server 192.168.99.200:22;
    }
    server {
        listen 12345;        #Nginx监听的端口
        proxy_pass backend;
    }
}
[root@proxy nginx]# sbin/nginx 
[root@proxy nginx]# ss -ntulp
Netid     State      Recv-Q     Send-Q         Local Address:Port           Peer Address:Port     Process                                                                                           
tcp       LISTEN     0          128                  0.0.0.0:80                  0.0.0.0:*         users:(("nginx",pid=7145,fd=9),("nginx",pid=7144,fd=9))                                          
tcp       LISTEN     0          128                  0.0.0.0:12345               0.0.0.0:*         users:(("nginx",pid=7145,fd=8),("nginx",pid=7144,fd=8))                                          
[root@proxy nginx]# ssh 192.168.99.5 -p 12345    #登录 proxy
The authenticity of host '[192.168.99.5]:12345 ([192.168.99.5]:12345)' can't be established.
ECDSA key fingerprint is SHA256:8A1PH0kOhJh281xagiAoQedjcQHNb/QXlme9hzrcii4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.99.5]:12345' (ECDSA) to the list of known hosts.
[email protected]'s password:     #后端真实服务器的密码
Last login: Mon Dec 11 11:09:13 2023
[root@web1 ~]# exit    #实际登录到 web1
注销
Connection to 192.168.99.5 closed.
[root@proxy nginx]# ssh 192.168.99.5 -p 12345    #登录 proxy
[email protected]'s password:     #后端真实服务器的密码
Last login: Mon Dec 11 09:28:57 2023 from 192.168.99.254
[root@web2 ~]#    #实际登录到 web2

网站

HTTP常见状态码列表:

200:正常

301 & 302:重定向

400:请求语法错误

401:访问被拒绝(账户或密码错误)

403:禁止访问

404:资源找不到

414:请求URI头部太长

500:服务器内部错误

502:代理服务器无法正常获取下一个服务器正常的应答

[root@proxy nginx]# vim conf/nginx.conf
        charset utf-8;
        error_page  404              /404.html;
[root@proxy nginx]# echo "抱歉!页面不存在!" > html/404.html
[root@proxy nginx]# sbin/nginx -s reload

如何查看服务器状态信息

编译安装时使用 --with-http_stub_status_module  开启状态页面模块

如果要添加模块,但不想删除之前nginx数据,可以将nginx源码目录下面的objs目录中的nginx文件拷贝到nginx的sbin目录下替代现有主程序,然后killall nginx 再重启即可

Active connections:当前活动的连接数量

accepts:已经接受客户端的连接总数量

handled:已经处理客户端的连接总数量

requests:客户端发送的请求数量

Reading:当前服务器正在读取客户端请求头的数量

Writing:当前服务器正在写响应信息的数量

Waiting:当前多少客户端在等待服务器的响应

[root@proxy nginx-1.22.1]# killall nginx 
[root@proxy nginx-1.22.1]# cd ~/lnmp_soft/nginx-1.22.1/
[root@proxy nginx-1.22.1]# ./configure --with-stream --with-http_stub_status_module && make
[root@proxy nginx-1.22.1]# ls objs/nginx
[root@proxy nginx-1.22.1]# objs/nginx -V
[root@proxy nginx-1.22.1]# cp objs/nginx /usr/local/nginx/sbin/
[root@proxy nginx-1.22.1]# cd /usr/local/nginx/
[root@proxy nginx]# sbin/nginx -V
[root@proxy nginx]# vim conf/nginx.conf
        location /status {
            stub_status on;
            allow 192.168.99.5;
            deny all;
        }
[root@proxy nginx]# sbin/nginx
[root@proxy nginx]# curl 192.168.99.5/status
Active connections: 1 
server accepts handled requests
 10 10 3 
Reading: 0 Writing: 1 Waiting: 0

优化Nginx并发量

使用web1作为海量客户

-n        任务量

-c        连接数

[root@web1 ~]# ab -n 100 -c 100 http://192.168.99.5/
...
...
 100%      9 (longest request)    #成功
[root@web1 ~]# ab -n 2000 -c 2000 http://192.168.99.5/
socket: Too many open files (24)    #失败

修改Nginx配置文件,增加并发量

[root@proxy nginx]# vim conf/nginx.conf
worker_processes  2;                #与CPU核心数量一致
events {
    worker_connections  50000;      #每个worker最大并发连接数
}
[root@proxy nginx]# sbin/nginx -s reload

优化Linux内核参数(最大文件数量)

[root@proxy nginx]# ulimit -n            #查看最大文件数量
[root@proxy nginx]# ulimit -n 100000     #临时设置最大文件数量
[root@proxy nginx]# vim /etc/security/limits.conf 
*               soft    nofile            100000
*               hard    nofile            100000
用户或组    硬限制或软限制    需要限制的项目    限制的值

优化后测试服务器并发量

[root@web1 ~]# ab -n 2000 -c 2000 http://192.168.99.5/

支持超长地址

用户 浏览器---------------请求头---------------nginx    缓存1K(针对的是一个人,一人1k)

[root@proxy nginx]# vim conf/nginx.conf
    client_header_buffer_size 200k;        #设置nginx缓存
    large_client_header_buffers 4 200k;    #200不够时,再给4个200k
[root@proxy nginx]# sbin/nginx -s reload

本地缓存数据

本地指的是客户

[root@proxy nginx]# vim conf/nginx.conf
        location ~* \.(jpg|html|mp4|txt)$ {
            expires 30d;
        }
[root@proxy nginx]# sbin/nginx -s reload

session 共享

利用redis数据库存放session文件,实现session文件的共享,解决客户重复登录的问题

web1、web2

[root@web2 ~]# yum  -y install gcc make pcre-devel openssl-devel
[root@web2 ~]# yum -y install mariadb mariadb-server mariadb-devel php php-fpm php-mysqlnd
[root@web2 nginx-1.22.1]# ./configure && make && make install    #没有指定运行用户,默认为nobody用户
[root@web2 nginx-1.22.1]# cd /usr/local/nginx/
[root@web2 nginx]# yum  -y install gcc make pcre-devel openssl-devel
[root@web2 nginx]# vim /etc/php-fpm.d/www.conf 
listen = /run/php-fpm/www.sock            #进程间通信(socket)
listen.acl_users = apache,nginx,nobody    #添加nobody用户
[root@web2 nginx]# vim conf/nginx.conf
        location ~ \.php$ {
            root           html;
            fastcgi_pass   unix:/run/php-fpm/www.sock;
            fastcgi_index  index.php;
            #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }
[root@web2 nginx]# systemctl restart php-fpm
[root@web2 nginx]# sbin/nginx
[root@web2 nginx]# tar -xf ~/lnmp_soft/php_scripts/php-session-demo.tar.gz 
[root@web2 nginx]# cp -r php-session-demo/* html/
[root@web2 nginx]# systemctl disable firewalld --now

###为测试结果明显,改动首页文件
[root@web1 nginx]# vim html/index.php 

Web1 PHP Login Session Example

[root@web2 nginx]# vim html/index.php

Web2 PHP Login Session Example

session

存在服务器端的文件,保存了用户名、登录状态等信息

/var/lib/php/session/        #存放session文件的目录

cookies

由服务器端下发给客户端的文件,保存内容主要是sessionID(一串随机字符串---客户端和服务器持有)

redis是一种数据库,用来实现session共享

redis---用内存存数据,内存存放的是临时数据

键值对

###redis所在服务器
[root@proxy nginx]# yum -y install redis     #安装
[root@proxy nginx]# systemctl start redis    #启服务
[root@proxy nginx]# ss -ntulp | grep redis
tcp   LISTEN 0      128        127.0.0.1:6379      0.0.0.0:*    users:(("redis-server",pid=2204,fd=6))
[root@proxy nginx]# vim /etc/redis.conf
#bind 127.0.0.1                              #将起作用的bind这行注释
protected-mode no                            #关闭保护模式
[root@proxy nginx]# systemctl restart redis
[root@proxy nginx]# ss -ntulp | grep redis
tcp   LISTEN 0      128          0.0.0.0:6379      0.0.0.0:*    users:(("redis-server",pid=2287,fd=7))

###后端真实服务器(以web1示例)
[root@web1 session]# vim /etc/php-fpm.d/www.conf 
php_value[session.save_handler] = redis                        #以什么格式存放session文件
php_value[session.save_path]    = "tcp://192.168.99.5:6379"    #session文件存放在哪
[root@web1 session]# systemctl restart php-fpm
[root@web1 session]# cd ~/lnmp_soft/php_scripts/
[root@web1 php_scripts]# ls phpredis-5.1.0-1.x86_64.rpm 
phpredis-5.1.0-1.x86_64.rpm
[root@web1 php_scripts]# yum -y install phpredis-5.1.0-1.x86_64.rpm

###注意:
selinux模式、防火墙

Nginx跨域

同源策略

它定义了浏览器访问网站时,需要域名、协议、端口相同

是重要的安全策略,防止了恶意数据的传递

实现跨域

创建两个虚拟主机,分别是80端口和8080端口

[root@proxy nginx]# vim conf/nginx.conf
    server {
        listen 8080;
        charset utf-8;
        location / {
            root html;
            index index.html;
        }
    }
[root@proxy nginx]# sbin/nginx -s reload

uwsgi

uWSGI是一个Web服务器

主要用途是将 Web 应用程序部署到生产环境中

可以用来连接Nginx服务与Python动态网站

部署Python网站项目

Python安装

#安装编译工具
#安装Python与依赖
[root@proxy ~]# yum -y install gcc make python3 python3-devel

安装web项目工具与依赖

Python的web项目可以由不同的辅助工具完成,比如Flask和Django

将提前准备好的资料/python拷贝到虚拟机

[root@proxy python]# pip3 install pytz-2022.6-py2.py3-none-any.whl    #动态页面依赖包
[root@proxy python]# pip3 install Django-1.11.8-py2.py3-none-any.whl    #同上
[root@proxy python]# pip3 install django-bootstrap3-11.0.0.tar.gz        #同上

测试项目

通过Python开启网站,仅用于测试

[root@proxy python]# tar -xf python-project-demo.tar.gz    #测试成品网站
[root@proxy python]# cd python-project-demo/
[root@proxy python-project-demo]# python3 manage.py runserver 0.0.0.0:8000

在浏览器访问192.168.99.5:8000

安装uWSGI

[root@proxy python-project-demo]# cd ..
[root@proxy python]# pip3 install uWSGI-2.0.21.tar.gz
[root@proxy python]# vim   myproject.ini
[uwsgi]
socket=127.0.0.1:8000                  #与web服务(nginx)通信的接口
chdir=/root/python/python-project-demo          #项目的工作目录
wsgi-file=learning_log/wsgi.py            #指定项目中的wsgi.py配置文件
daemonize=/var/log/uwsgi.log            #指定日志文件位置
#processes=4    #指定启动进程的数目
#master=true     #开启主进程管理模式

运行uWSGI

[root@proxy python]# uwsgi --ini myproject.ini    #读取myproject.ini运行uWSGI

 修改nginx配置文件,添加uWSGI转发

[root@proxy python]# vim /usr/local/nginx/conf/nginx.conf
...
        location / {
            uwsgi_pass 127.0.0.1:8000;        #动态页面交给uWSGI
            include uwsgi_params;            #调用uWSGI配置文件
            root   html;
            index  index.html index.htm;
        }
...
[root@proxy python]# /usr/local/nginx/sbin/nginx

测试

使用浏览器访问192.168.99.5

灰度发布 

配置Nginx实现用IP测试灰度发布

不同IP的客户访问相同代理时,可以看到不同集群主机的内容

创建不同集群,准备多台集群主机,通过$remote_addr变量识别不同客户机

nginx配置创建集群

[root@proxy nginx]# vim /usr/local/nginx/conf/nginx.conf
http {
...
    upstream s8001 {                    #测试集群1
        server 192.168.99.100:8001;
    }
    upstream s8002 {                    #测试集群2
        server 192.168.99.200:8002;
    }
    upstream default {                  #正常业务集群
        server 192.168.99.100:80;
        server 192.168.99.200:80;
    }
    server {
        listen       80;
        server_name  localhost;
...
    set $group "default";                      #定义变量$group,默认值default
    if ($remote_addr ~ "192.168.99.1"){        #如果客户机ip是99.1就访问集群1
        set $group s8001;
    }
    if ($remote_addr ~ "192.168.99.2"){        #如果客户机ip是99.2就访问集群2
        set $group s8002;
    }
        location / {
            proxy_pass http://$group;          #调用集群
            root   html;
            index  index.html index.htm;
        }
...
}
[root@proxy nginx]# sbin/nginx  -s reload

为web1新建nginx虚拟主机

[root@web1 nginx]# vim /usr/local/nginx/conf/nginx.conf
http {    
...
server {
    listen 8001;
    server_name localhost;
    root html8001;
    index index.html;
}
...
}
[root@proxy nginx]# sbin/nginx  -s reload
[root@web1 nginx]# mkdir html8001
[root@web1 nginx]# echo web1-8001 > html8001/index.html

为web2新建nginx虚拟主机

[root@web2 nginx]# vim /usr/local/nginx/conf/nginx.conf
http {
...
server {
    listen 8002;
    server_name localhost;
    root html8002;
    index index.html;
}
...
}
[root@proxy nginx]# sbin/nginx  -s reload
[root@web2 nginx]# mkdir html8002
[root@web2 nginx]# echo web1-8002 > html8002/index.html

测试

192.168.99.1访问192.168.99.5

192.168.99.2访问192.168.99.5

其他ip访问192.168.99.5

通过不同用户ID测试灰度发布

不同ID的客户访问相同代理时,可以看到不同集群主机的内容

使用php页面,定义不同匹配语句

nginx配置可以解析动态网页

[root@proxy nginx]# vim html/home.php        #修改php页面,将原有Welcome那行修改成以下状态
Welcome :  开始";
}
else
{
echo "开始";
}
?>

测试

浏览器访问192.168.99.5/index.php分别输入不同名称的账户,可以看到"开始"连接的是不同的地址

referer字段 现在要访问的地址的上一页面

你可能感兴趣的:(nginx,服务器,linux)