Home Backend Development PHP Tutorial nginx source code (1) compilation

nginx source code (1) compilation

Aug 08, 2016 am 09:28 AM
event module nginx src

This year I plan to study the nginx source code seriously. The purpose is to learn network programming. The source code I use is the first version nginx-0.1.0-RELEASE that is publicly released. The code address is:
http://hg.nginx.org/nginx /rev/551102312e19
Just click zip or gz on the left in the browser to download. After decompression, there are 4 folders in the source code directory:

  • auto
  • conf
  • docs
  • src

Copy the configure file in the auto directory to the source code directory and run
.configure
The Makefile can be generated, and the output of the configure command looks like this on my ubuntu:

Configuration summary
+ PCRE library is not found
+ md5 library is not used
+ OpenSSL library is not used
+ using system zlib library

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using –without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using –with-pcre= option.`

The PCRE library was not found, so the HTTP rewrite module could not be installed correctly.
Execute command:
sudo apt-get install libpcre3 libpcre3-dev
Then execute make clean, configure; display results:

Configuration summary
+ using system PCRE library
+ md5 library is not used
+ OpenSSL library is not used
+ using system zlib library

nginx path prefix: /usr/local/nginx
nginx binary file: /usr/local/nginx/sbin/nginx
nginx configuration file: /usr/local/nginx/conf/nginx.conf
nginx pid file: /usr/local/nginx/logs/nginx.pid
nginx error log file: /usr/local/nginx/logs/error.log
nginx http access log file: /usr/local/nginx/logs/access.log

md5 and openssl are not used, we will talk about this later. Then make, an error will appear, open the objs/Makefie file and view the current compilation options:
CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused -Werror -g
Among them
-Werror Treat warnings as errors. Abort compilation if any warning occurs.
-Wpointer-arith Warn when performing arithmetic operations on function pointers or pointers of type void *. Also very useful. -Wall does not turn this on.
-pipe Use pipes instead of temporary files.
-Wno-unused Warn about unused variables
Remove all the following options and make again. There will also be an error: the display macro ngx_blocking_n is not declared in the file ngx_event_accept.c. Check objs/Makefile and find that this compilation error comes from the command:
gcc -c -I src/core -I src/event -I src/event/modules - I src/os/unix -I objs src/event/ngx_event_accept.c -o ngx_event_accept.o
Finally, check the file src/os/unix/ngx_socket.h. The definition is as follows:

<code><span>#if (HAVE_FIONBIO)</span><span>int</span> ngx_nonblocking(ngx_socket_t s);
<span>int</span> ngx_blocking(ngx_socket_t s);

<span>#define ngx_nonblocking_n   "ioctl(FIONBIO)"</span><span>#define ngx_blocking_n      "ioctl(!FIONBIO)"</span><span>#else</span><span>#define ngx_nonblocking(s)  fcntl(s, F_SETFL, O_NONBLOCK)</span><span>#define ngx_nonblocking_n   "fcntl(O_NONBLOCK)"</span><span>#define ngx_blocking_n      "ioctl(!FIONBIO)"</span><span>#endif</span></code>
Copy after login

does not include the second to last line of code, which I added newly. The test found that the if branch above is the else code under ubuntu. block, but the macro ngx_blocking_n is not defined in else, so just add it.

Continue making.
Found that IOV_MAX cannot be found in ngx_writev_chain.c, use the command
grep IOV_MAX -r src/os/unix/*
I found that this macro is only defined under the freebsd system and is added directly to core/ngx_config.h.

Continue making.
It was found that there are no members msg_accrights and msg_accrightslen in struct msghdr. These are variable names that are only available in two lower versions of the operating system. Higher versions also have them but the names have changed. Check the code in the file src/os/unix/ngx_channel.c as follows:

<code><span>#if (HAVE_MSGHDR_MSG_CONTROL)</span>
    msg.msg_control = (caddr_t) &cmsg;
    msg.msg_controllen = <span>sizeof</span>(cmsg);
<span>#else</span>
    msg.msg_accrights = (caddr_t) &fd;
    msg.msg_accrightslen = <span>sizeof</span>(<span>int</span>);
<span>#endif</span></code>
Copy after login

The version issue has been considered here, and a macro has been defined to distinguish it. It must be that this macro is not defined, and the condition reaches the else branch, so an error is reported. Define the macro directly in the file:

<code><span>#define HAVE_MSGHDR_MSG_CONTROL 1</span></code>
Copy after login

Continue making.
This time all the target files have been generated, but an error occurred during linking. The reason is that some symbols cannot be found. The error content is as follows:

objs/src/core/ngx_times.o: In the function ‘ngx_time_update’:
/home/nginx-0.1.1/src/core/ngx_times.c:179: undefined reference to ‘ngx_timezone’
objs/src/event/ngx_event_accept.o: In function ‘ngx_event_accept’:
/home/nginx-0.1.1/src/event/ngx_event_accept.c:165: undefined reference to ‘ngx_blocking’
objs/src/event/ngx_event_connect.o: In function ‘ngx_event_connect_peer’:
/home/nginx-0.1.1/src/event/ngx_event_connect.c:301: undefined reference to ‘ngx_blocking’
objs/src/event/modules/ngx_rtsig_module.o: In function ‘ngx_rtsig_done’:
/home/nginx-0.1.1/src/event/modules/ngx_rtsig_module.c:173: undefined reference to ‘ngx_poll_module_ctx’
objs/src/event/modules/ngx_rtsig_module.o: In function ‘ngx_rtsig_init’:
/home/nginx-0.1.1/src/event/modules/ngx_rtsig_module.c:134: undefined reference to ‘ngx_poll_module_ctx’
collect2: error: ld returned 1 exit status

一次全部解决
1 在src/core/ngx_times.c文件里代码又走到了else分支里,然后在 src/os/unix/ngx_time.h中只有solaris才定义了ngx_timezone这个函数:

<code><span>#<span>define</span> ngx_timezone(isdst) (- (isdst ? altzone : timezone) / 60)</span></code>
Copy after login

放开宏定义会发现找不到altzone, 暂时不管这个,把它直接改成0:

<code><span>#<span>define</span> ngx_timezone(isdst) (- (isdst ? 0 : timezone) / 60)</span></code>
Copy after login

2 src/event/ngx_event_accept.c中未定义引用ngx_blocking,原因刚才已经找到了,在src/os/unix/ngx_socket.h中走了else分支,把if里的函数声明直接拷贝一份到else中,因为这是个函数,还有定义部分,在src/os/unix/ngx_socket.c中把这个函数从if宏定义中移出来。 注意,不要修改ngx_nonblocking函数。
3 src/event/modules/ngx_rtsig_module.c中未定义引用ngx_poll_module_ctx,查代码发现这是一个全局变量:

<code><span>extern</span> ngx_event_module_t  ngx_poll_module_ctx;</code>
Copy after login

被定义在poll模块内,但编译的时候在objs/Makefile中没有编译这个模块,把它一起编译了,改3个地方,和epoll的编译一样,有epoll的地方直接复制epoll相关的内容,把里面的epoll改成poll就可以了。

最后make成功!
生成了nginx二进制文件。直接./nginx运行,报错:

[emerg] 11732#0: open() /usr/local/nginx/conf/nginx.conf failed (2: No such file or directory)

to be continued…

以上就介绍了nginx 源码(1)编译,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1664
14
PHP Tutorial
1267
29
C# Tutorial
1239
24
How to configure nginx in Windows How to configure nginx in Windows Apr 14, 2025 pm 12:57 PM

How to configure Nginx in Windows? Install Nginx and create a virtual host configuration. Modify the main configuration file and include the virtual host configuration. Start or reload Nginx. Test the configuration and view the website. Selectively enable SSL and configure SSL certificates. Selectively set the firewall to allow port 80 and 443 traffic.

How to start containers by docker How to start containers by docker Apr 15, 2025 pm 12:27 PM

Docker container startup steps: Pull the container image: Run "docker pull [mirror name]". Create a container: Use "docker create [options] [mirror name] [commands and parameters]". Start the container: Execute "docker start [Container name or ID]". Check container status: Verify that the container is running with "docker ps".

How to check the name of the docker container How to check the name of the docker container Apr 15, 2025 pm 12:21 PM

You can query the Docker container name by following the steps: List all containers (docker ps). Filter the container list (using the grep command). Gets the container name (located in the "NAMES" column).

How to check whether nginx is started How to check whether nginx is started Apr 14, 2025 pm 01:03 PM

How to confirm whether Nginx is started: 1. Use the command line: systemctl status nginx (Linux/Unix), netstat -ano | findstr 80 (Windows); 2. Check whether port 80 is open; 3. Check the Nginx startup message in the system log; 4. Use third-party tools, such as Nagios, Zabbix, and Icinga.

How to create containers for docker How to create containers for docker Apr 15, 2025 pm 12:18 PM

Create a container in Docker: 1. Pull the image: docker pull [mirror name] 2. Create a container: docker run [Options] [mirror name] [Command] 3. Start the container: docker start [Container name]

How to check nginx version How to check nginx version Apr 14, 2025 am 11:57 AM

The methods that can query the Nginx version are: use the nginx -v command; view the version directive in the nginx.conf file; open the Nginx error page and view the page title.

How to configure cloud server domain name in nginx How to configure cloud server domain name in nginx Apr 14, 2025 pm 12:18 PM

How to configure an Nginx domain name on a cloud server: Create an A record pointing to the public IP address of the cloud server. Add virtual host blocks in the Nginx configuration file, specifying the listening port, domain name, and website root directory. Restart Nginx to apply the changes. Access the domain name test configuration. Other notes: Install the SSL certificate to enable HTTPS, ensure that the firewall allows port 80 traffic, and wait for DNS resolution to take effect.

What to do if nginx server is hung What to do if nginx server is hung Apr 14, 2025 am 11:42 AM

When the Nginx server goes down, you can perform the following troubleshooting steps: Check that the nginx process is running. View the error log for error messages. Check the syntax of nginx configuration. Make sure nginx has the permissions you need to access the file. Check file descriptor to open limits. Confirm that nginx is listening on the correct port. Add firewall rules to allow nginx traffic. Check reverse proxy settings, including backend server availability. For further assistance, please contact technical support.

See all articles