千家信息网

Linux自学笔记——LNMP

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下。生成一个新的进程/线程需要事先备好其运行时
千家信息网最后更新 2026年10月31日Linux自学笔记——LNMP

传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下。生成一个新的进程/线程需要事先备好其运行时环境,这包括为其分配堆内存和栈内存,以及为其创建新的执行上下文等。这些操作都需要占用CPU,而且过多的进程/线程还会带来线程抖动或频繁的上下文切换,系统性能也会由此进一步下降。

在设计的最初阶段,nginx的主要着眼点就是其高性能以及对物理计算资源的高密度利用,因此其采用了不同的架构模型。受启发与多种操作系统设计中基于"事件"的高级处理机制,nginx采用了模块化、事件驱动、异步、单线程及非阻塞的架构,并大量采用了多路复用及事件通知机制。在nginx中,连接请求由为数不多的几个仅包含一个线程的进程worker以高效的回环机制进行处理,而每个worker可以并行处理数千个的并发连接请求。

如果负载以cpu密集型应用为主,如ssl或压缩应用,则worker数应与cpu数相同;如果负载以IO密集型为主,如响应大量内容给客户端,则worker数应该为cpu个数的1.5或2倍。

Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过"共享内存"的机制实现进程间通信。主进程以root用户身份运行,erworker、cache loader和cache manager均应以非特权用户身份运行。

主进程主要完成如下工作:

1. 读取并验证配置信息;

2. 创建、绑定及关闭套接字;

3. 启动、终止及维护worker进程的个数;

4. 无须中止服务而重新配置工作特性;

5. 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;

6. 重新打开日志文件,实现日志滚动;

7. 编译嵌入式perl脚本;

Worker进程主要完成的任务包括:

1. 接收、传入并处理来自客户端的连接;

2. 提供反向代理及过滤功能;

3. Nginx任何能完成的其他任务;

Cache loader进程主要完成的任务包括:

1. 检查缓存存储中的缓存对象;

2. 使用缓存元数据建立内存数据库;

Cache manager进程的主要任务:

1. 缓存的失效及过期检验;

Nginx的配置有着几个不同的上下文:main、http、server、upstream和location(还有实现邮件服务反向代理的mail)。配置语法的格式和定义方式遵循所谓的c风格,因此支持嵌套,还有着逻辑清晰并易于创建、阅读和维护等优势。

Nginx的代码是由一个核心和一系列的模块组成,核心主要用于提供web server的基本功能,以及web和mail反向代理的功能:还用于启用网络协议,创建不要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的。这些功能模块大致可以分为事件模块、阶段性处理器、输出国滤器、变量处理器、协议、upstream和负载均衡几个级别,这些共同组成了nginx的http功能。事件模块主要用于提供OS独立的(不同操作系统的时间机制有所不同)事件通知机制如kqueue或epoll等。协议模块则负责实现nginx通过http、tls/ssl、smtp、pop3以及imap与对应的客户端建立会话。

在nginx内部,进程间的通信是通过模块的pipeline或chain实现的:换句话说,每一个功能或操作都由一个模块来实现。例如,压缩、通过fastcgi或uwcgi协议与upstream服务器通信,以及与mencached建立会话等。

以下手动编译安装部署LNMP环境:

一、 安装nginx;

1. 解决依赖关系

编译安装nginx需要实现安装开发包组"Development Tools"和"Server Platform Development"。同时还需安装pcre-devel,zlib-devel,openssl-devel依赖包,不过一般只需安装pcre-devel包,其它两个包已经安装;

实现安装/var/tmp/nginx此目录,不然启动nginx会出错;

2. 安装;

1) 添加用户和组,实现以之运行nginx进程;

# groupadd -r nginx

# useradd -r -g nginx nginx

2) 解压缩源码包,并进入目录;

3) 用命令./configure --help可以查看安装选项;

4) 编译安装;

# ./configure \

--prefix=/usr/local/nginx \

--sbin-path=/usr/local/nginx/sbin/nginx \

--conf-path=/etc/nginx/nginx.conf \

--error-log-path=/var/log/nginx/error.log \

--http-log-path=/var/log/nginx/access.log \

--pid-path=/var/run/nginx/nginx.pid \

--lock-path=/var/lock/nginx.lock \

--user=nginx \

--group=nginx \

--with-http_ssl_module \

--with-http_flv_module \

--with-http_stub_status_module \

--with-http_gzip_static_module \

--http-client-body-temp-path=/var/tmp/nginx/client/ \

--http-proxy-temp-path=/var/tmp/nginx/proxy/ \

--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \

--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \

--http-scgi-temp-path=/var/tmp/nginx/scgi \

--with-pcre

# make && make install

Note:如果想使用nginx的perl模块,可以编译时添加-with-http_perl_module选项来实现;

5) 提供Sysv init脚本;

新建文件/etc/rc.d/init.d/nginx,内容如下:

#!/bin/sh

#

# nginx - this script starts and stops the nginx daemon

#

# chkconfig: - 85 15

# description: Nginx is an HTTP(S) server, HTTP(S) reverse \

# proxy and IMAP/POP3 proxy server

# processname: nginx

# config: /etc/nginx/nginx.conf

# config: /etc/sysconfig/nginx

# pidfile: /var/run/nginx/nginx.pid

# Source function library.

. /etc/rc.d/init.d/functions

# Source networking configuration.

. /etc/sysconfig/network

# Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"

prog=$(basename $nginx)

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/nginx.lock

make_dirs() {

# make required directories

user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`

options=`$nginx -V 2>&1 | grep 'configure arguments:'`

for opt in $options; do

if [ `echo $opt | grep '.*-temp-path'` ]; then

value=`echo $opt | cut -d "=" -f 2`

if [ ! -d "$value" ]; then

# echo "creating" $value

mkdir -p $value && chown -R $user $value

fi

fi

done

}

start() {

[ -x $nginx ] || exit 5

[ -f $NGINX_CONF_FILE ] || exit 6

make_dirs

echo -n $"Starting $prog: "

daemon $nginx -c $NGINX_CONF_FILE

retval=$?

echo

[ $retval -eq 0 ] && touch $lockfile

return $retval

}

stop() {

echo -n $"Stopping $prog: "

killproc $prog -QUIT

retval=$?

echo

[ $retval -eq 0 ] && rm -f $lockfile

return $retval

}

restart() {

configtest || return $?

stop

sleep 1

start

}

reload() {

configtest || return $?

echo -n $"Reloading $prog: "

killproc $nginx -HUP

RETVAL=$?

echo

}

force_reload() {

restart

}

configtest() {

$nginx -t -c $NGINX_CONF_FILE

}

rh_status() {

status $prog

}

rh_status_q() {

rh_status >/dev/null 2>&1

}

case "$1" in

start)

rh_status_q && exit 0

$1

;;

stop)

rh_status_q || exit 0

$1

;;

restart|configtest)

$1

;;

reload)

rh_status_q || exit 7

$1

;;

force-reload)

force_reload

;;

status)

rh_status

;;

condrestart|try-restart)

rh_status_q || exit 0

;;

*)

echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"

exit 2

esac

6) 为此脚本添加执行权限;

7) 添加服务管理列表,并让其开启自动启动;

8) 启动服务并测试

二、 安装mariadb-5.5.46(通过二进制方式)

1. 准备数据存放目录;

2. 创建用户和组,实现运行进程;

3. 编译安装;

1) 解压缩源码包到指定目录/usr/local下,创建软连接mysql并进入mysql目录;

2) 修改目录内文件属主属组;

3) 运行脚本,生成元数据库;指明用户和数据路存放位置;

4. 为mysql提供主配置文件;

1) 复制文件;

2) 编辑配置文件/etc/my.cnf,添加或修改一下内容;

5. 为mysql提供Sysv init服务脚本,以下包括添加执行权限和添加服务列表并测试使用;

为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要执行如下步骤;

6. 输出mysql的man手册至man命令查找路径;

编辑/etc/man.config,添加如下行;

7. 输出mysql头文件至系统头文件路径下/usr/include;可以通过简单的创建链接实现;

8. 输出mysql的库文件给系统查找路径;

9. 修改PATH环境变量,让系统可以直接使用mysql相关命令。

测试:

至此,mariadb全部安装完成;

三、 安装php-5.4.26(以fpm方式)

1. 解决依赖关系

首先配置号yum源(系统安装及epel源)后执行如下命令

# yum -y groupinstall "Desktop Platform Development"

# yum -y install bzip2-devel libmcrypt-devel libxml2-devel

2. 编译安装php-5.4.26

1) 解压源码压缩文件,并进入解压后的目录;

2) 编译安装;

# ./configure --prefix=/usr/local/php-fpm --with-mysql=/usr/local/mysql --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --with-curl

# make && make install

3. 为php提供配置文件

4. 配置php-fpm

1) 为php-fpm提供Sysv init服务脚本,并添加至服务列表;

2) 为php-fpm提供配置文件;


3) 编辑此配置文件;

配置fpm的相关选项的值,并启用pid文件;

启用pid文件,去除分号即可启用:

4) 启动服务并测试;


四、 整合nginx和php-fpm

1. 编辑/etc/nginx/nginx.conf,启用如下选项;

Note:有的需要将/scripts替换为root绝对路径;这里可将/scripts替换为/usr/local/nginx/html

2. 在所支持的主页面格式中添加php格式的主页;

3. 新建index.php测试页面,测试php能否正常工作;

4. 测试;

五、 安装xcache,为php加速;

具体步骤可参看本人博客编译安装lamp;

六、 补充说明;

如果要在SSL中使用php,需要在php的location中添加此项:

fastcgi_param HTTPS on;


进程 文件 配置 模块 服务 系统 编译 功能 线程 运行 目录 缓存 处理 测试 事件 机制 脚本 不同 数据 用户 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 远信互联网科技 互联网科技的英文 融势互联网科技 互联网 视角下的科技创新 大白互联网科技 互联网科技宣传片 华中科技有哪些互联网大佬 济南华为互联网科技产业总部基地 互联网科技热点资讯 互联网校园科技培训 港股科技和互联网 翼展科技 首家互联网医院 深圳艾果互联网通讯科技 群盈汇互联网科技有限公司 为客找房互联网科技公司怎么样 山东星卡互联网科技有限公司官网 每天都有哪些好的互联网科技 宇信科技在杭州互联网排第几 河南商务圈互联网科技有限公司 六子台科技互联网展会 湖北九亚互联网络科技有限公司 广州为想互联网科技有限公司 伟宏互联网科技 广州万易互联网科技有限公司 深圳互联网科技公司 睿民互联网科技 互联网科技大奖都有哪些公司 深圳艾果互联网通讯科技 济南有互联网科技公司吗 科技美学互联网 艺术
0