Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

use shared memory #13

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open

Conversation

Lex-2008
Copy link

@Lex-2008 Lex-2008 commented Jan 7, 2025

Issue was that different worker processes had different value of "nonce", thus producing different ipscrub value for same IP.

Consider this nginx.conf:

load_module modules/ngx_ipscrub_module.so;
events {
  accept_mutex on;
}
worker_processes 2;
daemon off;
http {
  server {
listen 8000 default_server reuseport;
location / { return 200 "hello from $pid $remote_addr_ipscrub\n"; }
  }
}

interesting parts here are accept_mutex on and worker_processes 2 - these two options mean that nginx will start two worker processes, and they will accept connections by turn. For some reason, I also had to add reuseport to listen for this to work, too.

If you run nginx with above config and run curl in a loop, you would get output like this:

$ while true; do curl localhost:8000/; done
hello from 533073 1xGVi2
hello from 533072 +G8Qbi
hello from 533073 1xGVi2
hello from 533072 +G8Qbi
hello from 533072 +G8Qbi
hello from 533072 +G8Qbi
hello from 533073 1xGVi2
hello from 533072 +G8Qbi
^C

Probably that's not what you wanted :)

This commit fixes it by using shared memory.
As another benefit, nonce now also "survives" nginx reconfiguration events.

Issue was that different worker processes had different value of
"nonce", thus producing different ipscrub value for same IP.

Consider this nginx.conf:

    load_module modules/ngx_ipscrub_module.so;
    events {
      accept_mutex on;
    }
    worker_processes 2;
    daemon off;
    http {
      server {
	listen 8000 default_server reuseport;
	location / { return 200 "hello from $pid $remote_addr_ipscrub\n"; }
      }
    }

interesting parts here are `accept_mutex on` and `worker_processes 2` - these
two options mean that nginx will start two worker processes, and they will
accept connections by turn. For some reason, I also had to add `reuseport` to
`listen` for this to work, too.

If you run nginx with above config and run curl in a loop, you would get output
like this:

$ while true; do curl localhost:8000/; done
hello from 533073 1xGVi2
hello from 533072 +G8Qbi
hello from 533073 1xGVi2
hello from 533072 +G8Qbi
hello from 533072 +G8Qbi
hello from 533072 +G8Qbi
hello from 533073 1xGVi2
hello from 533072 +G8Qbi
^C

Probably that's not what you wanted :)

This commit fixes it by using shared memory.
As another benefit, nonce now also "survives" nginx reconfiguration events.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant