皮皮网

【拍照考勤源码】【出售scrm源码】【小白站源码】编译nginx源码_nginx源码编译安装

2024-11-23 12:54:32 来源:区块链源码阅读

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

编译nginx源码_nginx源码编译安装

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,格式为:命令格式,输入并执行命令,设置默认使用的出售scrm源码发行版,再次使用命令查看,查看到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 、网关,确保使用远程连接工具能够连接服务器

           二、配置防火墙,开启端口、vue源码说明端口

           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_initngx_getpidngx_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。这意味着在这些情况下,基本库的编译步骤可以省略。