[nginx] Core: "-e" command line option.
Igor Ippolitov
iippolitov at nginx.com
Thu Nov 19 17:06:36 UTC 2020
details: https://hg.nginx.org/nginx/rev/f18db38a9826
branches:
changeset: 7744:f18db38a9826
user: Igor Ippolitov <iippolitov at nginx.com>
date: Thu Nov 19 16:59:00 2020 +0000
description:
Core: "-e" command line option.
When installing or running from a non-root user it is sometimes required to
override default, compiled in error log path. There was no way to do this
without rebuilding the binary (ticket #147).
This patch introduced "-e" command line option which allows one to override
compiled in error log path.
diffstat:
auto/configure | 4 ++++
docs/man/nginx.8 | 9 ++++++++-
src/core/nginx.c | 41 +++++++++++++++++++++++++++++++++++++----
src/core/ngx_cycle.c | 9 +++++++++
src/core/ngx_cycle.h | 1 +
src/core/ngx_log.c | 19 ++++++++-----------
src/core/ngx_log.h | 2 +-
7 files changed, 68 insertions(+), 17 deletions(-)
diffs (233 lines):
diff -r 4b1299b1856a -r f18db38a9826 auto/configure
--- a/auto/configure Tue Nov 10 17:13:20 2020 +0300
+++ b/auto/configure Thu Nov 19 16:59:00 2020 +0000
@@ -87,6 +87,10 @@ have=NGX_PID_PATH value="\"$NGX_PID_PATH
have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . auto/define
have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . auto/define
+if [ ".$NGX_ERROR_LOG_PATH" = "." ]; then
+ have=NGX_ERROR_LOG_STDERR . auto/have
+fi
+
have=NGX_HTTP_LOG_PATH value="\"$NGX_HTTP_LOG_PATH\"" . auto/define
have=NGX_HTTP_CLIENT_TEMP_PATH value="\"$NGX_HTTP_CLIENT_TEMP_PATH\""
. auto/define
diff -r 4b1299b1856a -r f18db38a9826 docs/man/nginx.8
--- a/docs/man/nginx.8 Tue Nov 10 17:13:20 2020 +0300
+++ b/docs/man/nginx.8 Thu Nov 19 16:59:00 2020 +0000
@@ -25,7 +25,7 @@
.\" SUCH DAMAGE.
.\"
.\"
-.Dd December 5, 2019
+.Dd November 5, 2020
.Dt NGINX 8
.Os
.Sh NAME
@@ -35,6 +35,7 @@
.Nm
.Op Fl ?hqTtVv
.Op Fl c Ar file
+.Op Fl e Ar file
.Op Fl g Ar directives
.Op Fl p Ar prefix
.Op Fl s Ar signal
@@ -54,6 +55,12 @@ Print help.
.It Fl c Ar file
Use an alternative configuration
.Ar file .
+.It Fl e Ar file
+Use an alternative error log
+.Ar file .
+Special value
+.Cm stderr
+indicates that the standard error output should be used.
.It Fl g Ar directives
Set global configuration directives.
See
diff -r 4b1299b1856a -r f18db38a9826 src/core/nginx.c
--- a/src/core/nginx.c Tue Nov 10 17:13:20 2020 +0300
+++ b/src/core/nginx.c Thu Nov 19 16:59:00 2020 +0000
@@ -183,6 +183,7 @@ static ngx_uint_t ngx_show_help;
static ngx_uint_t ngx_show_version;
static ngx_uint_t ngx_show_configure;
static u_char *ngx_prefix;
+static u_char *ngx_error_log;
static u_char *ngx_conf_file;
static u_char *ngx_conf_params;
static char *ngx_signal;
@@ -230,7 +231,7 @@ main(int argc, char *const *argv)
ngx_pid = ngx_getpid();
ngx_parent = ngx_getppid();
- log = ngx_log_init(ngx_prefix);
+ log = ngx_log_init(ngx_prefix, ngx_error_log);
if (log == NULL) {
return 1;
}
@@ -393,9 +394,9 @@ ngx_show_version_info(void)
if (ngx_show_help) {
ngx_write_stderr(
- "Usage: nginx [-?hvVtTq] [-s signal] [-c filename] "
- "[-p prefix] [-g directives]" NGX_LINEFEED
- NGX_LINEFEED
+ "Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]" NGX_LINEFEED
+ " [-e filename] [-c filename] [-g directives]"
+ NGX_LINEFEED NGX_LINEFEED
"Options:" NGX_LINEFEED
" -?,-h : this help" NGX_LINEFEED
" -v : show version and exit" NGX_LINEFEED
@@ -414,6 +415,12 @@ ngx_show_version_info(void)
#else
" -p prefix : set prefix path (default: NONE)" NGX_LINEFEED
#endif
+ " -e filename : set error log file (default: "
+#ifdef NGX_ERROR_LOG_STDERR
+ "stderr)" NGX_LINEFEED
+#else
+ NGX_ERROR_LOG_PATH ")" NGX_LINEFEED
+#endif
" -c filename : set configuration file (default: " NGX_CONF_PATH
")" NGX_LINEFEED
" -g directives : set global directives out of configuration "
@@ -800,6 +807,24 @@ ngx_get_options(int argc, char *const *a
ngx_log_stderr(0, "option \"-p\" requires directory name");
return NGX_ERROR;
+ case 'e':
+ if (*p) {
+ ngx_error_log = p;
+
+ } else if (argv[++i]) {
+ ngx_error_log = (u_char *) argv[i];
+
+ } else {
+ ngx_log_stderr(0, "option \"-e\" requires file name");
+ return NGX_ERROR;
+ }
+
+ if (ngx_strcmp(ngx_error_log, "stderr") == 0) {
+ ngx_error_log = (u_char *) "";
+ }
+
+ goto next;
+
case 'c':
if (*p) {
ngx_conf_file = p;
@@ -992,6 +1017,14 @@ ngx_process_options(ngx_cycle_t *cycle)
}
}
+ if (ngx_error_log) {
+ cycle->error_log.len = ngx_strlen(ngx_error_log);
+ cycle->error_log.data = ngx_error_log;
+
+ } else {
+ ngx_str_set(&cycle->error_log, NGX_ERROR_LOG_PATH);
+ }
+
if (ngx_conf_params) {
cycle->conf_param.len = ngx_strlen(ngx_conf_params);
cycle->conf_param.data = ngx_conf_params;
diff -r 4b1299b1856a -r f18db38a9826 src/core/ngx_cycle.c
--- a/src/core/ngx_cycle.c Tue Nov 10 17:13:20 2020 +0300
+++ b/src/core/ngx_cycle.c Thu Nov 19 16:59:00 2020 +0000
@@ -96,6 +96,15 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
return NULL;
}
+ cycle->error_log.len = old_cycle->error_log.len;
+ cycle->error_log.data = ngx_pnalloc(pool, old_cycle->error_log.len + 1);
+ if (cycle->error_log.data == NULL) {
+ ngx_destroy_pool(pool);
+ return NULL;
+ }
+ ngx_cpystrn(cycle->error_log.data, old_cycle->error_log.data,
+ old_cycle->error_log.len + 1);
+
cycle->conf_file.len = old_cycle->conf_file.len;
cycle->conf_file.data = ngx_pnalloc(pool, old_cycle->conf_file.len + 1);
if (cycle->conf_file.data == NULL) {
diff -r 4b1299b1856a -r f18db38a9826 src/core/ngx_cycle.h
--- a/src/core/ngx_cycle.h Tue Nov 10 17:13:20 2020 +0300
+++ b/src/core/ngx_cycle.h Thu Nov 19 16:59:00 2020 +0000
@@ -80,6 +80,7 @@ struct ngx_cycle_s {
ngx_str_t conf_param;
ngx_str_t conf_prefix;
ngx_str_t prefix;
+ ngx_str_t error_log;
ngx_str_t lock_file;
ngx_str_t hostname;
};
diff -r 4b1299b1856a -r f18db38a9826 src/core/ngx_log.c
--- a/src/core/ngx_log.c Tue Nov 10 17:13:20 2020 +0300
+++ b/src/core/ngx_log.c Thu Nov 19 16:59:00 2020 +0000
@@ -315,7 +315,7 @@ ngx_log_errno(u_char *buf, u_char *last,
ngx_log_t *
-ngx_log_init(u_char *prefix)
+ngx_log_init(u_char *prefix, u_char *error_log)
{
u_char *p, *name;
size_t nlen, plen;
@@ -323,13 +323,11 @@ ngx_log_init(u_char *prefix)
ngx_log.file = &ngx_log_file;
ngx_log.log_level = NGX_LOG_NOTICE;
- name = (u_char *) NGX_ERROR_LOG_PATH;
+ if (error_log == NULL) {
+ error_log = (u_char *) NGX_ERROR_LOG_PATH;
+ }
- /*
- * we use ngx_strlen() here since BCC warns about
- * condition is always false and unreachable code
- */
-
+ name = error_log;
nlen = ngx_strlen(name);
if (nlen == 0) {
@@ -369,7 +367,7 @@ ngx_log_init(u_char *prefix)
*p++ = '/';
}
- ngx_cpystrn(p, (u_char *) NGX_ERROR_LOG_PATH, nlen + 1);
+ ngx_cpystrn(p, error_log, nlen + 1);
p = name;
}
@@ -403,8 +401,7 @@ ngx_log_init(u_char *prefix)
ngx_int_t
ngx_log_open_default(ngx_cycle_t *cycle)
{
- ngx_log_t *log;
- static ngx_str_t error_log = ngx_string(NGX_ERROR_LOG_PATH);
+ ngx_log_t *log;
if (ngx_log_get_file_log(&cycle->new_log) != NULL) {
return NGX_OK;
@@ -425,7 +422,7 @@ ngx_log_open_default(ngx_cycle_t *cycle)
log->log_level = NGX_LOG_ERR;
- log->file = ngx_conf_open_file(cycle, &error_log);
+ log->file = ngx_conf_open_file(cycle, &cycle->error_log);
if (log->file == NULL) {
return NGX_ERROR;
}
diff -r 4b1299b1856a -r f18db38a9826 src/core/ngx_log.h
--- a/src/core/ngx_log.h Tue Nov 10 17:13:20 2020 +0300
+++ b/src/core/ngx_log.h Thu Nov 19 16:59:00 2020 +0000
@@ -228,7 +228,7 @@ void ngx_cdecl ngx_log_debug_core(ngx_lo
/*********************************/
-ngx_log_t *ngx_log_init(u_char *prefix);
+ngx_log_t *ngx_log_init(u_char *prefix, u_char *error_log);
void ngx_cdecl ngx_log_abort(ngx_err_t err, const char *fmt, ...);
void ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...);
u_char *ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err);
More information about the nginx-devel
mailing list