1.WSL2子系统安装CentOS8及源码编译Nginx1.18+PHP7.4+MySql8.0开发环境
2.NGINX脚本语言原理及源码分析(一)
3.CentOS 6.2编译安装Nginx1.0.14+MySQL5.5.22+PHP5.3.10步骤分享
4.Nginx源码分析 - 主流程篇 - Nginx的编译编译启动流程
5.nginx源码分析--master和worker进程模型
6.Nginx源码交叉编译-保姆级移植ARM
WSL2子系统安装CentOS8及源码编译Nginx1.18+PHP7.4+MySql8.0开发环境
一、WSL2安装CentOS8及源码编译Nginx1.+PHP7.4+MySql8.0开发环境
在前文中介绍了WSL(Windows Subsystem for Linux)以及在Win中的源源码安装与配置WSL2。首先,安装安装并配置WSL2后,编译编译Ubuntu等Linux发行版可通过Windows应用商店直接安装。源源码但为了与线上服务器环境一致,安装牛牛源码组件授权这里介绍如何不通过应用商店手动安装适配WSL的编译编译Linux发行版,以 CentOS8为例。源源码
1. 安装Chocolatey
NuGet是安装一个用于.NET开发平台的软件包管理器,Chocolatey是编译编译基于NuGet的一个软件包管理器,在Windows中可通过命令行安装程序。源源码通过在PowerShell(管理员模式)中输入命令并执行,安装可以安装Chocolatey。编译编译详细安装说明请查阅其官网文档。源源码
2. 安装LxRunOffline
LxRunOffline是安装一款用于管理WSL子系统的实用工具,能备份、创建、恢复、导出WSL子系统,同时支持安装适配WSL的任何Linux发行版,并允许将WSL子系统安装到任意目录。在PowerShell窗口中输入命令安装LxRunOffline,安装完成后重启PowerShell。
3. 下载CentOS镜像
GitHub上有开源的适用于WSL的CentOS系统安装镜像,通过选择CentOS8分支并进入docker目录,下载文件centos-8-x_.tar.xz。将下载的文件保存在指定路径,如D盘。
4. 安装CentOS镜像
通过输入特定命令并回车,可以将CentOS系统安装到C盘的centos文件夹下,并命名为centos。注意文件路径在Linux与Windows下不同,这里C盘路径用反斜线表示,D盘路径为Windows下的路径。
5. 升级为WSL2
使用命令查看已安装的WSL信息,并将指定的WSL发行版升级为WSL2,格式为:命令格式,输入并执行命令,设置默认使用的自媒咖源码发行版,再次使用命令查看,查看到centos的VERSION已变为2,并且名称前加了*号。
6. WSL子系统的启动与关闭
通过命令即可启动WSL子系统,停止WSL子系统的命令为:wsl --shutdown -n 系统名称。若直接输入wsl --shutdown会停止所有已启动的WSL子系统。此外,通过命令net stop LxssManager也可以停止WSL子系统。
7. 使用Windows Terminal
为了更好地配合WSL,安装Windows Terminal是必要的。通过Terminal可以直接打开所有已安装的WSL发行版,并根据需要调整配色方案。
8. 目录设置
在WSL2系统中可直接访问Windows磁盘文件,建议将安装软件包放在F:\wsl目录下,将网站Web程序放在E:\wwwroot目录中,访问路径为/mnt/f/wsl和/mnt/e/wwwroot。若性能降低超出可忍受范围,再考虑将这两个目录移动到WSL的虚拟磁盘。
9. centos8基本配置
查看centos版本,安装wget、vim等工具,更换国内源并备份原始yum源,下载对应版本的repo文件,确保包含的源如aliyun符合需求。
. 源码编译安装Nginx
安装编译工具及库文件,如gcc、pcre、zlib、openssl等,下载并解压nginx源码,开始编译,检查系统环境、生成Makefile文件,生成脚本及配置文件,安装并创建目录,复制生成的模块和文件。
. 编译安装MySql8.0
下载并解压MySql8.0源码,解压后移动目录,电脑时间同步源码创建data目录并初始化MySql,添加需要的库文件,创建my.cnf配置文件,启动MySql。
. 源码编译安装php7.4
下载php7.4源码,安装编译工具和库文件,创建用户组和用户,配置编译参数,解压缩并移动到指定目录,检查配置并生成配置文件,安装完成。
. LNMP环境测试
测试Nginx和PHP-FPM的配合,配置Nginx和PHP-FPM,通过phpinfo文件验证php和Nginx的配合情况,测试phpMyAdmin,确保数据库连接无误,至此,LNMP环境测试完成。
NGINX脚本语言原理及源码分析(一)
NGINX提供了灵活的脚本解析功能,通过配置文件中的变量和指令实现特定功能。变量和指令是编程的基础,如若使用脚本语言,能提升配置的可扩展性,避免频繁添加新代码。
深入理解NGINX脚本语言,首先从变量的基本特性开始。在NGINX中,除了特殊类型的binary_remote_addr外,所有变量默认为字符串类型。变量名由美元符号或花括号包围,只接受特定字符(a-z、A-Z、0-9、_)。变量插入示例中,如set $def “this is a test $abc”,变量值会根据其他变量计算后再拼接。
NGINX变量分为内置和自定义两种,发卡网网站源码自定义变量由特定模块定义,如rewrite和geo模块。内置变量广泛覆盖系统、网络、四层、SSL/TLS和HTTP层信息,部分动态变量如arg_根据HTTP请求参数动态生成。
变量的作用域非常重要,未定义的变量在启动时会引发错误。全局可见的变量允许跨location使用,但每个请求有自己的变量实例。变量的可变性通过标记控制,如内置变量通常不可变,但如$args和$limit_rate可变。
关于缓存,变量的get_handler方法决定其是否实时计算。动态变量如$arg_name不可缓存,而set指令定义的变量可缓存。结合使用时,如"name"和"arg_name"可能产生不同结果,因为前者缓存,后者每次都从参数解析。
变量的隔离性基于请求,同一变量在不同请求间独立,如同C语言的局部和全局变量。NGINX内,变量值容器随请求而变化,与location无关。
后续文章将详细解析变量的实现原理和在脚本中的运用。对于更全面的NGINX资源,可访问NGINX开源社区获取。
CentOS 6.2编译安装Nginx1.0.+MySQL5.5.+PHP5.3.步骤分享
说明:操作系统:CentOS 6.2 位
准备篇:
一、配置好IP、DNS 、网关,确保使用远程连接工具能够连接服务器
二、配置防火墙,开启端口、chrome查看源码乱码端口
vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport -j ACCEPT(允许端口通过防火墙)
-A INPUT -m state --state NEW -m tcp -p tcp --dport -j ACCEPT(允许端口通过防火墙)
特别提示:很多网友把这两条规则添加到防火墙配置的最后一行,导致防火墙启动失败,正确的应该是添加到默认的端口这条规则的下面
添加好之后防火墙规则如下所示:
#########################################################
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
#########################################################
/etc/init.d/iptables restart #最后重启防火墙使配置生效
三、关闭SELINUX
vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq 保存,关闭
shutdown -r now #重启系统
四 、系统约定
软件源代码包存放位置:/usr/local/src
源码包编译安装位置:/usr/local/软件名字
五、下载软件包
1、下载nginx(目前稳定版)
.php.net/distributions/php-5.3..tar.gz
5、下载cmake(MySQL编译工具)
f /etc/my.cnf #拷贝配置文件(注意:如果/etc目录下面默认有一个my.cnf,直接覆盖即可)
vi /etc/my.cnf #编辑配置文件,在 [mysqld] 部分增加
datadir = /data/mysql #添加MySQL数据库路径
./scripts/mysql_install_db --user=mysql #生成mysql系统数据库
cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld #把Mysql加入系统启动
chmod /etc/init.d/mysqld #增加执行权限
chkconfig mysqld on #加入开机启动
vi /etc/rc.d/init.d/mysqld #编辑
basedir = /usr/local/mysql #MySQL程序安装路径
datadir = /data/mysql #MySQl数据库存放目录
service mysqld start #启动
vi /etc/profile #把mysql服务加入系统环境变量:在最后添加下面这一行
export PATH=$PATH:/usr/local/mysql/bin
下面这两行把myslq的库文件链接到系统默认的位置,这样你在编译类似PHP等软件时可以不用指定mysql的库文件地址。
ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
ln -s /usr/local/mysql/include/mysql /usr/include/mysql
shutdown -r now #需要重启系统,等待系统重新启动之后继续在终端命令行下面操作
mysql_secure_installation #设置Mysql密码
根据提示按Y 回车输入2次密码
或者直接修改密码/usr/local/mysql/bin/mysqladmin -u root -p password "" #修改密码
service mysqld restart #重启
到此,mysql安装完成!
五、安装 nginx
groupadd www #添加www组
useradd -g www www -s /bin/false #创建nginx运行账户www并加入到www组,不允许www用户直接登录系统cd /usr/local/src
tar zxvf nginx-1.0..tar.gz
cd nginx-1.0.
./configure --prefix=/usr/local/nginx --user=www --group=www --with-tl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --enable-session --with-mcrypt --with-curl #配置
make #编译
make install #安装
cp php.ini-production /usr/local/php5/etc/php.ini #复制php配置文件到安装目录
rm -rf /etc/php.ini #删除系统自带配置文件
ln -s /usr/local/php5/etc/php.ini /etc/php.ini #添加软链接
cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf #拷贝模板文件为php-fpm配置文件
vi /usr/local/php5/etc/php-fpm.conf #编辑
user = www #设置php-fpm运行账号为www
group = www #设置php-fpm运行组为www
pid = run/php-fpm.pid #取消前面的分号
设置 php-fpm开机启动
cp /usr/local/src/php-5.3./sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm #拷贝php-fpm到启动目录
chmod +x /etc/rc.d/init.d/php-fpm #添加执行权限
chkconfig php-fpm on #设置开机启动
vi /usr/local/php5/etc/php.ini #编辑配置文件
找到:;open_basedir =
修改为:open_basedir = .:/tmp/ #防止php木马跨站,重要!!
找到:disable_functions =
修改为:disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,getservbyport,disk_total_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname
#列出PHP可以禁用的函数,如果某些程序需要用到这个函数,可以删除,取消禁用。
找到:;date.timezone =
修改为:date.timezone = PRC #设置时区
找到:expose_php = On
修改为:expose_php = OFF #禁止显示php版本的信息
找到:display_errors = On
修改为:display_errors = OFF #关闭错误提示
七、配置nginx支持php
vi /usr/local/nginx/conf/nginx.conf
修改/usr/local/nginx/conf/nginx.conf 配置文件,需做如下修改
user www www; #首行user去掉注释,修改Nginx运行组为www www;必须与/usr/local/php5/etc/php-fpm.conf中的user,group配置相同,否则php运行出错
index index.php index.html index.htm; #添加index.php
# pass the PHP scripts to FastCGI server listening on .0.0.1:
#
location ~ /.php$ {
root html;
fastcgi_pass .0.0.1:;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#取消FastCGI server部分location的注释,并要注意fastcgi_param行的参数,改为$document_root$fastcgi_script_name,或者使用绝对路径
/etc/init.d/nginx restart #重启nginx
八、配置php支持Zend Guard
安装Zend Guard
cd /usr/local/src
mkdir /usr/local/zend #建立Zend安装目录
tar xvfz ZendGuardLoader-php-5.3-linux-glibc-i.tar.gz #解压安装文件
cp ZendGuardLoader-php-5.3-linux-glibc-i/php-5.3.x/ZendGuardLoader.so /usr/local/zend/ #拷贝文件到安装目录
vi /usr/local/php5/etc/php.ini #编辑文件
在最后位置添加以下内容
[Zend Guard]
zend_extension=/usr/local/zend/ZendGuardLoader.so
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path=
测试篇
cd /usr/local/nginx/html/ #进入nginx默认网站根目录
rm -rf /usr/local/nginx/html/* #删除默认测试页
vi index.php #新建index.php文件
?php
phpinfo();
?
:wq! #保存
chown www.www /usr/local/nginx/html/ -R #设置目录所有者
chmod /usr/local/nginx/html/ -R #设置目录权限
shutdown -r now #重启
在客户端浏览器输入服务器IP地址,可以看到相关的配置信息!
service nginx restart #重启nginx
service mysqld restart #重启mysql
/usr/local/php5/sbin/php-fpm #启动php-fpm
/etc/rc.d/init.d/php-fpm restart #重启php-fpm
/etc/rc.d/init.d/php-fpm stop #停止php-fpm
/etc/rc.d/init.d/php-fpm start #启动php-fpm
#############################################################################
备注:
nginx默认站点目录是:/usr/local/nginx/html/
权限设置:chown www.www /usr/local/nginx/html/ -R
MySQL数据库目录是:/data/mysql
权限设置:chown mysql.mysql -R /data/mysql
到此,CentOS 6.2下 Nginx1.0.+MySQL5.5.+PHP5.3.+Zend Guard Loader基本运行环境搭建完成!
Nginx源码分析 - 主流程篇 - Nginx的启动流程
深入解析Nginx的核心,理解基础数据结构对源码解读至关重要。主流程的精髓隐藏在nginx.c的main()函数中,它启动的每一个步骤都如同乐谱上的一段旋律,优雅而有序。启动乐章
首先,指挥棒落在ngx_get_options上,它如同乐团指挥,优雅地解析启动命令行参数。接着,ngx_time_init、ngx_getpid和ngx_log_init依次登场,为时间、进程标识和日志设置调音。它们共同完成了一次细致入微的初始化过程,为接下来的演出铺平道路。 紧接着,ngx_init_cycle指挥全局变量的诞生,包括一致性哈希表的初始化,以及处理系统变量的微妙操作。随后,它引导我们进入一个关键环节:继承socket,初始化模块,设置信号处理,配置文件的获取和pid文件的创建,如同交响乐中的序曲,为后续的进程管理做准备。乐章高潮
当进入ngx_master_process_cycle部分,主进程的魔法开始显现。它如魔术师般,通过创建子进程,让各个模块和事件监听开始各自的旋律。在这里,每个参数处理都如同精心编排的音符,确保演奏的和谐。关键步骤
在ngx_get_options中,启动命令参数如-s stop/start/restart的解读,是理解Nginx行为的关键。而在幕后,ngx_save_argv负责存储这些参数,ngx_process_options则如同指挥家,将参数的魔力注入到ngx_cycle的结构中。 特别关注的全局变量,如ngx_show_help、ngx_conf_file,它们是Nginx运行的调色板。ngx_save_argv和ngx_process_options如同调色师,精心调配每个参数的色彩。模块初始化的序曲
ngx_preinit_modules是模块世界的序曲,它负责初始化配置路径、处理参数,以及配置文件的定位。在这里,每个动作都精确而有序,确保每个模块都能在正确的时间奏响属于自己的旋律。 在ngx_module.c中,模块编号的分配和配置文件的处理,如同管弦乐队的编排,确保每个乐器都能和谐共奏。而创建PID文件的函数ngx_create_pidfile则如定音锤,为整个系统敲定最后的音符。 每个重要模块,如ngx_add_inherited_sockets、ngx_init_cycle、ngx_signal_process和ngx_master_process_cycle,都在各自的角色中发挥着不可或缺的作用,共同编织出Nginx启动的华美乐章。nginx源码分析--master和worker进程模型
一、Nginx整体架构
正常执行中的nginx会有多个进程,其中最基本的是master process(主进程)和worker process(工作进程),还可能包括cache相关进程。
二、核心进程模型
启动nginx的主进程将充当监控进程,主进程通过fork()产生的子进程则充当工作进程。
Nginx也支持单进程模型,此时主进程即是工作进程,不包含监控进程。
核心进程模型框图如下:
master进程
监控进程作为整个进程组与用户的交互接口,负责监护进程,不处理网络事件,不负责业务执行,仅通过管理worker进程实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。
master进程通过sigsuspend()函数调用大部分时间处于挂起状态,直到接收到信号。
master进程通过检查7个标志位来决定ngx_master_process_cycle方法的运行:
sig_atomic_t ngx_reap;
sig_atomic_t ngx_terminate;
sig_atomic_t ngx_quit;
sig_atomic_t ngx_reconfigure;
sig_atomic_t ngx_reopen;
sig_atomic_t ngx_change_binary;
sig_atomic_t ngx_noaccept;
进程中接收到的信号对Nginx框架的意义:
还有一个标志位:ngx_restart,仅在master工作流程中作为标志位使用,与信号无关。
核心代码(ngx_process_cycle.c):
ngx_start_worker_processes函数:
worker进程
worker进程主要负责具体任务逻辑,主要关注与客户端或后端真实服务器之间的数据可读/可写等I/O交互事件,因此工作进程的阻塞点在select()、epoll_wait()等I/O多路复用函数调用处,等待数据可读/写事件。也可能被新收到的进程信号中断。
master进程如何通知worker进程进行某些工作?采用的是信号。
当收到信号时,信号处理函数ngx_signal_handler()会执行。
对于worker进程的工作方法ngx_worker_process_cycle,它主要关注4个全局标志位:
sig_atomic_t ngx_terminate;//强制关闭进程
sig_atomic_t ngx_quit;//优雅地关闭进程(有唯一一段代码会设置它,就是接受到QUIT信号。ngx_quit只有在首次设置为1时,才会将ngx_exiting置为1)
ngx_uint_t ngx_exiting;//退出进程标志位
sig_atomic_t ngx_reopen;//重新打开所有文件
其中ngx_terminate、ngx_quit、ngx_reopen都将由ngx_signal_handler根据接收到的信号来设置。ngx_exiting标志位仅由ngx_worker_cycle方法在退出时作为标志位使用。
核心代码(ngx_process_cycle.c):
Nginx源码交叉编译-保姆级移植ARM
在Ubuntu..7 位系统上,使用arm-linux-gnueabihf-gcc作为交叉编译器,针对arm内核4.1.和恩智浦imx6ul嵌入式平台,进行了一次详细的Nginx源码的交叉编译移植过程。
准备工作包括了下载Nginx(1..0)、pcre(8.)、zlib(1.3.1)和openssl(1.1.1)的最新版本。在编译过程中,作者尝试了openssl的3.0.版本,但遇到编译问题,最终选择1.1.1版本进行编译。
在进入Nginx源码目录后,需要对部分源码进行修改,如移除退出函数并调整size大小。增加PCRE配置后,对Nginx进行配置,如果不需要ssl,应移除相关部分。配置完成后生成Makefile,但在此阶段并未进行编译。
Pcre源码的处理包括切换目录、配置和编译,编译成功且无误。对于openssl(选配),需要确保安装路径设置正确,配置后删除部分Makefile内容,进行编译,可能需要清理缓存以解决编译问题。
在Nginx部分的后续操作中,添加了必要的定义以避免malloc未引用错误,并调整了Makefile以排除之前手动编译的影响。最后进行编译,安装完成后,检查可执行文件类型和大小,进行优化以减少调试信息,使文件减小至2.8M。
测试阶段,将编译后的文件复制到arm设备,通过修改配置文件解决报错后,成功运行并访问测试页面,完成了基础的移植工作。
centos8编译安装nginx
安装前准备
首先,确保您的 CentOS-8 系统已更新软件包。
接下来,安装编译器及相应的开发库。
访问 nginx 官网下载最新的 nginx 版本。
解压下载的 nginx 安装包。
对 nginx 源码进行预编译和配置,以便生成可执行的二进制文件。
启动编译和安装过程,完成 nginx 的安装。
Nginx编译所需基本库pcre、zlib、openssl
在构建和配置 Nginx Web 服务器时,pcre、zlib 和 openssl 这三个基本库扮演着关键角色。它们各自提供核心功能:pcre 用于正则表达式处理,zlib 用于数据压缩,而 openssl 则确保安全的网络通信。在进行源码编译时,至关重要的是确保系统上安装了这些库的开发版本,以便编译器能够正确链接。
通常情况下,可以通过包管理器轻松安装这些库的开发版本,按照官方指南进行编译。然而,如果在编译过程中遇到错误,如提示缺少 openssl-devel,可能是因为缺少了 SSL 模块所需的 OpenSSL 库。解决方法是安装 OpenSSL,或者将其静态编译到 Nginx 中,使用 --with-openssl= 选项。
对于静态编译,比如指定 pcre 的源码路径,Nginx 将直接包含 PCRE 的代码,不再依赖系统中的动态库。这意味着即使不安装系统库,编译后的 Nginx 仍然能运行,但前提是正确配置了库路径。
如果选择通过 rpm 包安装 Nginx,比如从 nginx.org/packages 下载的版本,通常情况下,rpm 包已经包含了编译后的 Nginx 二进制文件,因此无需额外安装 pcre-devel、zlib-devel 和 openssl-devel。这意味着在这些情况下,基本库的编译步骤可以省略。