Nginx 特性原理

本文介绍了Nginx的运行机制,包括其与Apache的区别。详细讲述了Nginx的安装编译过程,强调了配置文件的权限和端口冲突问题。探讨了Nginx如何解析PHP,重点放在Nginx的负载均衡策略,如轮询、ip_hash等。最后,文章解释了Nginx与PHP-FPM的交互,指出在结合PHP时,php-fpm的必要性及其优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Nginx 运行机制

Nginx 同 Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(Uniform Resources Identifier)URI或者统一资源定位符(Uniform Resources Locator)URL作为沟通依据,通过HTTP协议提供各种网络服务。
apache 被设计为一个重量级的,它不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。

安装与编译

安装nginx需要安装 GCC ,gcc是编译的基础
然后安装 nginx的扩展 pcre:nginx正则表达库;zlib:提供数据压缩用的函式库;openssl:提供加密方法

然后安装nginx时编译进去:
注意 前四个prefix,sbin,conf,pid的路径是nginx编译后的运行文件的位置
注意 with 后跟几个库的源码路径,在同一文件夹下注意写相对路径

sudo ./configure --prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-pcre=../pcre-8.38 \
--with-zlib=../zlib-1.2.11 \
--with-openssl=../openssl-1.0.2

有最新版本的扩展就安装最新版本的,老版本可能会出现意想不到的错误
可能会出现很多问题,有可能是没有使用管理员权限 sudo,有可能文件没有读写权限 chomd - R 777 文件名,有可能需要解压 tar -zxvf 压缩包名,移动文件 mv 文件 路径 ,卸载重装 rm -rf 文件名
具体安装参考网址:
https://www.zybuluo.com/phper/note/73025
https://blog.youkuaiyun.com/cnwyt/article/details/79161387
https://www.cnblogs.com/wyd168/p/6636529.html

启动和配置

找到刚刚编译时写的安装路径,我们首先需要确定nginx监听的端口没有被占用,如果被占用,如果之前安装过Apache, 它也是80端口,那么需要kill掉Apache,可以考虑更改监听窗口/usr/local/nginx/nginx.conf中36行 listen 为 8080或其他;编写时需要注意文件是否有读写权限,使用vim 文件名编写。a 进行插入,:wq 保存退出。

/usr/local/nginx/nginx

启动之后,浏览器访问http://localhost:端口号

nginx 平滑启动:/usr/local/nginx/nginx -s reload

查看nginx进程: ps -ef|grep nginx

nginx 并不解析php ,所以交给php-fpm解析,所以要确保php安装有php-fpm扩展

nginx解析php

1,进入查看nginx 编译安装后 nginx 的文件夹:
主要的有

nginx 启动文件  nginx
nginx配置文件  nginx.conf 
fastcgi配置文件 fastcgi.conf
日志文件夹 log: 里面两个文件链接日志access.log 和错误日志 error.log
nginx默认的web 目录:html 文件夹
_temp 文件,一些执行的临时文件

2,进入查看nginx.conf 文件:

#user  nobody; #用户名
worker_processes  1;	#进程数,一般由cpu核心数决定
#开启错误日志等级
#error_log  logs/error.log;
error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;

events {
    use epoll;	#nginx工作模式,select/poll为标准模式,epoll为高效模式
    worker_connections  1024;	#工作进程链接数
}

http {
    include       mime.types;	#包含解析的文件类型在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;
	
    sendfile        on;
    #tcp_nopush     on; #是否开启网络拥塞
	#连接超时时间设置
    #keepalive_timeout  0;
    keepalive_timeout  65;

 server {
        listen       8090; 	#监听的端口
        server_name  localhost;		#别名
        location / {	
            root   html;	# 网站根目录
            index  index.html index.htm index.php ; #允许访问的首页排序
        }
		error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ \.php$ {		#符合php扩展名的请求调度到fcgi server  
            root           html;
            fastcgi_pass   127.0.0.1:9000;	#抛给本机的9000端口
            fastcgi_index  index.php;	#设定动态首页
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
        }
		# 负载均衡配置
		upstream ytx.com{	#负载均衡名称
                ip_hash;	#调度算法
                server 59.110.175.142;	#服务器ip地址
                server 39.106.217.71;
        }

		}

Nginx的负载均衡模块目前支持4种调度算法:
weight 轮询(默认)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight。指定轮询权值,weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
ip_hash。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
fair。比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
url_hash。按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包

在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
注意 当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
(此部分参考文献:https://www.zybuluo.com/phper/note/89391)
3,我们修改nginx 的web 目录在 var/www 下
详细解析可参考 https://www.cnblogs.com/liang-wei/p/5849771.html
修改配置文件后,可能需要重新启动,平滑启动可能没有用(平滑启动有可能只杀生死了工作线程)
应查找nginx线程,并杀死 master 主线程,杀死worker工作线程,nginx会重启一个工作线程

查看并寻找线程 ps -ef|grep nginx

baimayou  8879  1737  0 12:51 ?        00:00:00 nginx: master process /usr/local/nginx/nginx
baimayou 12614  8879  0 15:53 ?        00:00:00 nginx: worker process
baimayou 12725  5748  0 15:55 pts/1    00:00:00 grep --color=auto nginx

查看占用端口的程序 ss -lntpd | grep :8090

tcp    LISTEN   0        128               0.0.0.0:8090          0.0.0.0:*       users:(("nginx",pid=12614,fd=6),("nginx",pid=8879,fd=6)) 

杀死线程 kill 线程pid
4,重启后若发现端口被占用,就查找端口被占用的程序,一般都是apache,杀掉进程再次重启即可

nginx与php交互

php 与 apache 或者 ngix 结合, 会用sapi 提供2种连接方法:mod_php和mod_fastcgi。mod_php 模式会将php模块安装到apache下面来运行,2者结合度较大。mod_fastcgi模式则是作为一个中间过程,apache接收用户请求后,就发送给fastcgi, 再连接php来完成访问。
fastcgi 是一个与平台无关,与语言无关,任何语言只要按照它的接口来实现,就能实现自己语言的fastcgi能力和web server 通讯。

PHP-CGI就是PHP实现的自带的FastCGI管理器
PHP-FPM 是一个PHP专用的fastcgi管理器,它克服了PHP-CGI的2个问题
php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启。
直接杀死php-cgi进程,php就不能运行了。
所以要想nginx运行php,php必须启动php-fpm。

sudo /usr/local/php/sbin/php-fpm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值