nginx实例

nginx的由来
Nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始,第一次公开发布时间是2004年10月4日,版本号是0.1.0。2019年3月11日F5 与 NGINX达成协议,F5 将收购 NGINX 的所有已发行股票,总价值约为 6.7 亿美元。6.7亿美金约合44.97亿人民币,nginx核心模块代码长度198430(包括空格、注释),所以一行代码约为2.2万人民币。官网地址 www.nginx.org
nginx的作用
Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php 等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发, 性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高 达 50,000 个并发连接数。
nginx和apache的对比
1.Nginx 配置简洁, Apache 复杂 ;Nginx 静态处理性能比 Apache 高 2倍以上 ;
2.Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端用;Apache 的组件比 Nginx 多 ;
3.apache是同步多进程模型,一个连接对应一个进程;Nginx是异步的,多个连接(万级别)可以对应一个进程;
4.Nginx处理静态文件好,耗费内存少;动态请求由apache去做,Nginx只适合静态和反向;
5.Nginx适合做前端服务器,负载性能很好;Nginx本身就是一个反向代理服务器 ,且支持负载均衡。
两者最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程,而 nginx 是异步的,多个连接(万级别)可以对应一个进程
一般来说,需要性能的 web 服务,用 nginx 。如果不需要性能只求稳定,更考虑 apache ,后者的各种功能模块实现得比前者,例如 ssl 的模块就比前者好,可配置项多。epoll(freebsd 上是 kqueue ) 网络 IO 模型是 nginx 处理性能高的根本理由,但并不是所有的情况下都是 epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文件,apache 的 select 模型或许比 epoll 更高性能。当然,这只是根据网络 IO 模型的原理作的一个假设,真正的应用还是需要实测了再说的。
更为通用的方案是,前端Nginx抗并发,后端apache集群,配合起来会更好。
nginx的安装
nginx一般不用yum安装,因为linux内置版本太老。一般用安装包安装。
官方源码包下载地址:https://nginx.org/en/download.html

 dnf install gcc pcre-devel zlib-devel openssl-devel -y		#先下载所需命令
 mkdir nginx
 tar zxf nginx-1.26.2
 cd nginx-1.26.2
 useradd  -s /sbin/nologin -M nginx
 
 ./configure  --prefix=/usr/local/nginx \
 --user=nginx \ 	#指定nginx运行用户
 --group=nginx \	#指定nginx运行组
 --with-http_ssl_module \		#支持https://
 --with-http_v2_module \		 #支持http版本2
 --with-http_realip_module \		#支持ip透传
 --with-http_stub_status_module \		 #支持状态页面
 --with-http_gzip_static_module \ 		 #支持压缩
 --with-pcre \		#支持正则 
 --with-stream \	#支持tcp反向代理
 --with-stream_ssl_module \		#支持tcp的ssl加密
 --with-stream_realip_module		#支持tcp的透传ip

make && make install

nginx安装后会有四个主要目录

 ls /usr/local/nginx/
 conf  html  logs  sbin


conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,配置文件一般都有一个样板配置文件,是以.default为后缀,使用时可将其复制并将default后缀去掉即可。
html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面。
logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比如/var/logs/nginx里面。
sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。
验证版本及编译参数

vim ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin		#添加在最后

source  ~/.bash_profile

nginx -V
nginx version: nginx/1.24.0
built by gcc 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC)
built with OpenSSL 3.0.7 1 Nov 2022
TLS SNI support enabled
configure arguments: --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 -g "daemon off;"

nginx启动文件

vim /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl start nginx

用systemctl start nginx启动时,如果linux内已经有了nginx进程,要先删除nginx进程,再启动。
nginx版本的平滑升级和回滚
在这里插入图片描述
nginx 方便地帮助我们实现了平滑升级。其原理简单概括,就是: (1)在不停掉老进程的情况下,启动新进程。 (2)老进程负责处理仍然没有处理完的请求,但不再接受处理请求。 (3)新进程接受新请求。 (4)老进程处理完所有请求,关闭所有连接后,停止。 这样就很方便地实现了平滑升级。一般有两种情况下需要升级 nginx,一种是确实要升级 nginx 的版本,另一种是要为 nginx 添加新的模块。

平滑升级

 tar zxf nginx-1.26.2.tar.gz
 cd nginx-1.26.1/
 
./configure --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		#无需make install 

ll  objs/nginx /usr/local/nginx/sbin/nginx			#查看新旧两个版本的nginx

cd /usr/local/nginx/sbin/
cp nginx nginx.24			#备份旧版nginx命令

\cp  -f /root/nginx/nginx-1.26.1/objs/nginx		#复制到新版nginx

nginx -t 		#检测一下有没有问题

kill -USR2 48732 #nginx worker ID
#USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名nginx.pid.oldbin,并启动新的nginx
#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80 #此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理

ps aux | grep nginx		#查看nginx进程
curl -I  localhost 			#查看是哪个版本生效

kill -WINCH 48732		#回收旧版本(删除旧版本进程)

curl  -I localhost 			#再次检测版本

回退(发现新版本有问题时,可以回退至旧版本)

cp nginx nginx.26		#复制新版本的nginx
mv nginx.24 nginx		#覆盖新版本的nginx

ps aux | grep nginx		#查看现在的nginx进程

kill -WINCH 52075		#杀死新版本的进程

curl  -I  localhost			#查看nginx版本

nginx配置
nginx主配置文件格式

main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
 ...
 }  
#http/https 协议相关配置段
http {
默认的nginx.conf 配置文件格式说明
 ...
 } 
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
 ...
 }
 #stream 服务器相关配置段
stream {
 ...
 } 

默认的nginx.conf 配置文件格式说明

#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID路
径,日志路径等。
user nginx nginx;
worker_processes  1;    #启动工作进程数数量
events { #events        #设置快,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连接,使用哪种事件驱动模型                        #处理请求,每个工作进程可以同时支持的
最大连接数,是否开启对多工作进程下的网络连接进行序列化等。
     worker_connections  1024;   #设置单个nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数为                                           #worker_connections * 
worker_processes,作为反向代理的时候为
                                 #(worker_connections * worker_processes)/2
 }
http {                          #http块是Nginx服务器配置中的重要部分,缓存、代理和日志格
式定义等绝大多数功能和第三方模块                                #可以在这设置,http块可以包含多个server块,而一个server块中又可以包含多个location块,
                                #server块可以配置文件引入、MIME-Type定义、日志自定义、是
否启用sendfile、连接超时时间和                                 #单个链接的请求上限等。
   include       mime.types;
   default_type application/octet-stream;
   sendfile       on;           #作为web服务器的时候打开sendfile加快静态文件传输,指定是否使用
                                #sendfile系统调用来传输文件
                                #sendfile系统调用在两个文件描述符之间直接传递数据(完全在
内核中操作)
                                #从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝,
                                #硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈。
                                
   keepalive_timeout  65;       #长连接超时时间,单位是秒
server {                     #设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多个location模块
                                #比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个
server 可以使用一个端口比如都使用                                #80端口提供web服务
                                
       listen       80;         #配置server监听的端口
	   server_name localhost;   #本server的名称,当访问此名称的时候nginx会调用当前serevr
内部的配置进程匹配。
       
       location / {             #location其实是server的一个指令,为nginx服务器提供比较
多而且灵活的指令
                                #都是在location中体现的,主要是基于nginx接受到的请求字符
串
                                #对用户请求的UIL进行匹配,并对特定的指令进行处理
                                #包括地址重定向、数据缓存和应答控制等功能都是在这部分实现
                                #另外很多第三方模块的配置也是在location模块中配置。
                                
           root   html;         #相当于默认页面的目录名称,默认是安装目录的相对路径,可以使
用绝对路径配置。
           index index.html index.htm;          #默认的页面文件名称
                 }
       error_page   500 502 503 504 /50x.html;  #错误页面的文件名称
       location = /50x.html {                   #location处理对应的不同错误码的页面定义到/50x.html
                                                #这个跟对应其server中定义的目录下。
           root   html;                         #定义默认页面所在的目录
       }
   }
    
#和邮件相关的配置
#mail {
 #               ...
 #       }         mail 协议相关配置段
#tcp代理配置,1.9版本以上支持
#stream {
 #               ...
 #       }       stream 服务器相关配置段
#导入其他路径的配置文件
#include /apps/nginx/conf.d/*.conf
 }

新建一个web站点

mkdir  /usr/local/nginx/conf.d/
vim /usr/local/nginx/conf/nginx.conf
http {
  ......
include /usr/local/nginx/conf.d/*.conf;  		#不能放在前面,会导致前面的命令不能执行   

}

vim /usr/local/nginx/conf.d/vhosts.conf
server {
		listen 80;
		server_name www.kkk.org;
		root  /web/data/html;
		index index.html;
		location / {
					root /data/web/html;
					}
}
mkdir /data/web/html
echo kkk > /data/web/html/index.html

curl www.kkk.org
kkk

root与alias
root:指定web的家目录,在定义location的时候,文件的绝对路径等于root+location
alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于location上下文,此指令使用较少

location的详细使用
1.在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;
2.ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri
3.uri是用户请求的字符串,即域名后面的web文件路径
4.然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。

语法规则

location [ = | ~ | ~* | ^~ ] uri { ... }
 =           			#用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
^~          			#用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头
						#对uri的最左边部分做匹配检查,不区分字符大小写
~  					#用于标准uri前,表示包含正则表达式,并且区分大小写         
~*          			#用于标准uri前,表示包含正则表达式,并且不区分大写
不带符号			#匹配起始于此uri的所有的uri
\            			#用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号


#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号

nginx账户认证

httpaswd -cm /usr/local/nginx/.htpasswd admin

cat /usr/local/nginx/.htpasswd
admin:~~~~~~~~~

httpasswd -m /usr/local/nginx/.httpasswd leo

vim /usr/local/nginx/conf.d/vhost.conf
server {
		listen 80;
		server_name www.kkk.org;
		root /data/web/html;
		index index.html;

		location /leo {
					root /data/web;
					auth_basic "password";
					auth_basic_user_file "usr/local/nginx/.htpasswd"
					}
}

nginx -s reload

在这里插入图片描述

自定义错误页面

server {
		listen 80;
		server_name www.kkk.org;
		root /data/web/html;
		index index.html;
		error_page 404 /40x.html;
		error_log /var/log/kkk.org/error.log
		access_log /var/log/kkk.org/access.log

		location /leo {
					root /data/web;
					auth_basic "password";
					auth_basic_user_file "usr/local/nginx/.htpasswd"

		location = /40x.html {
					root /data/web/errorpage;
					}
}


curl www.kkk.org
error page

作为下载服务器

server {
		listen 80;
		server_name www.kkk.org;
		root /data/web/html;
		index index.html;
		error page 404 /40x.html;
		error log /var/log/timinglee.org/error.log;
		access log /var/log/timinglee.org/access.log;

		locaton /leo {
				root /data/web/;
				auth basic "login password !!";
				auth basic user file "/usr/local/nginx/.htpasswd";
				}
			
		location = /40x.html {
				root /data/web/errorpage;
				}
		location /downloadfroot {
				root /data/web; 
				autoindex on;
				autoindex localtime on;
				autoindexexact size off;
				limit rate 1024k;
				}
	}			
		

ngx_http_rewrite_module 模块指令
if指令
用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断。用法如下:

if (条件匹配) { 
action
 }

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接:

=       #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!=       #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~       #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~      #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~*      #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~*     #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真



-f 和 !-f 		#判断请求的文件是否存在和是否不存在
-d 和 !-d		#判断请求的目录是否存在和是否不存在
-x 和 !-x       #判断文件是否可执行和是否不可执行
 -e 和 !-e      #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)

#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false

set指令
指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key
另外set定义格式为set $key value,value可以是text, variables和两者的组合。

break指令
用于中断当前相同作用域(location)中的其他Nginx配置
与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效
位于后面的 ngx_http_rewrite_module 模块中指令就不再执行
Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置
该指令可以在server块和locationif块中使用
注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module模块的指令,其它指令还会执行

return指令
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置
语法格式

return code;        #返回给客户端指定的HTTP状态码

return code [text];   #返回给客户端的状态码及响应报文的实体内容
                      #可以调用变量,其中text如果有空格,需要用单或双引号
return code URL;      #返回给客户端的URL地址

rewrite指令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配
rewrite主要是针对用户请求的URL或者是URI做具体处理
rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制
如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向301
语法格式

rewrite regex replacement [flag];

正则表达式格式

.       #匹配除换行符以外的任意字符
\w     #匹配字母或数字或下划线或汉字 
\s      #匹配任意的空白符
\d      #匹配数字
\b      #匹配单词的开始或结束
^       #匹配字付串的开始
$       #匹配字符串的结束
*       #匹配重复零次或更多次
+       #匹配重复一次或更多次
?       #匹配重复零次或一次
(n)     #匹配重复n次
{n,}    #匹配重复n次或更多次
{n,m}   #匹配重复n到m次
*?      #匹配重复任意次,但尽可能少重复
+?      #匹配重复1次或更多次,但尽可能少重复
??      #匹配重复0次或1次,但尽可能少重复
{n,m}?  #匹配重复n到m次,但尽可能少重复
{n,}?   #匹配重复n次以上,但尽可能少重复
\W      #匹配任意不是字母,数字,下划线,汉字的字符
\S      #匹配任意不是空白符的字符
\D      #匹配任意非数字的字符
\B      #匹配不是单词开头或结束的位置
[^x]    #匹配除了x以外的任意字符

rewrite flag 的使用
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrite有四种不同的flag,分别是redirect(临时重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型
跳转型指由客户端浏览器重新对新地址进行请求
代理型是在WEB服务器内部实现跳转

rewrite格式

Syntax: rewrite regex replacement [flag];   #通过正则表达式处理用户请求并返回替换后的数据包。
Default: —
 Context: server, location, if

flag说明

redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端
#由客户端重新发起请求,状态码:301
break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作
#而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在location中使用
#适用于一个URL一次重写
last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,
#而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户

nginx防盗链
防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链,referer就是之前的那个网站域名,正常的referer信息有:

none:	#请求报文首部没有referer首部,
        #比如用户直接在浏览器输入域名访问web网站,就没有referer信息               
blocked:            #请求报文有referer首部,但无有效值,比如为空。
server_names:       #referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string:   #自定义指定字符串,但可使用*作通配符。示例: *.timinglee.org 
www.timinglee.*

regular expression: #被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:
~.*\.timinglee\.com

实现盗链
在一个web 站点盗链另一个站点的资源信息,比如:图片、视频等

#盗链网页
<html>

  <head>
    <meta http-equiv=Content-Type content="text/html;charset=utf-8">
    <title>盗链</title>
</head>

  <body>
    <img src="http://www.timinglee.org/images/lee.png" >
    <h1 style="color:red">欢迎大家</h1>
    <p><a href=http://www.timinglee.org>狂点老李</a>出门见喜</p>
  </body>

</html>

实现防盗链
基于访问安全考虑,nginx支持通过ngx_http_referer_module模块,检查访问请求的referer信息是否有效实现防盗链功能

server {
    listen 80;
    listen 443 ssl;
    server_name www.timinglee.org;
    root /data/web/html;
    index index.html;
    ssl_certificate /usr/local/nginx/certs/timinglee.org.crt;
    ssl_certificate_key /usr/local/nginx/certs/timinglee.org.key;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    location / {
        if ( $scheme = http ){
            rewrite /(.*) https://$host/$1 redirect;
        }

        if ( !-e $request_filename ){
            rewrite /(.*) https://$host/index.html redirect;
        }
    }


#防盗链

    location /images  {
        valid_referers none blocked server_names *.timinglee.org ~/.baidu/.;
        if ( $invalid_referer ){
                rewrite ^/   http://www.timinglee.org/daolian.png;
        }

    }


#盗链网页
<html>

  <head>
    <meta http-equiv=Content-Type content="text/html;charset=utf-8">
    <title>盗链</title>
</head>

  <body>
    <img src="http://www.timinglee.org/images/lee.png" >
    <h1 style="color:red">欢迎大家</h1>
    <p><a href=http://www.timinglee.org>狂点老李</a>出门见喜</p>
  </body>

</html>

安装php

yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel oniguruma-devel

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-curl --with-iconv --with-mhash --with-zlib --with-openssl --enable-mysqlnd --with-mysqli --with-pdo-mysql --disable-debug --enable-sockets --enable-soap --enable-xml --enable-ftp --enable-gd --enable-exif --enable-mbstring --enable-bcmath --with-fpm-systemd

make && make install

php测试页面

server {
      listen 80;
      server_name www.kkk.org;
      root /data/web/php;
      index index.html; 

      location /leo {
                root /data/web;
                auth_basic "password";
                auth_basic_user_file "usr/local/nginx/.htpasswd";
        }

}

mkdir  /data/web/php
touch  /data/web/php/index.php

vim /data/web/php/index.php
<?php
 phpinfo();
 ?>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值