CINXE.COM
GitHub - trimstray/nginx-admins-handbook: How to improve NGINX performance, security, and other important things.
<!DOCTYPE html> <html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" data-a11y-animated-images="system" data-a11y-link-underlines="true" > <head> <meta charset="utf-8"> <link rel="dns-prefetch" href="https://github.githubassets.com"> <link rel="dns-prefetch" href="https://avatars.githubusercontent.com"> <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com"> <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/"> <link rel="preconnect" href="https://github.githubassets.com" crossorigin> <link rel="preconnect" href="https://avatars.githubusercontent.com"> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-74231a1f3bbb.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-8a995f0bacd4.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-f37fb7684b1f.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-9ac301c3ebe5.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-cd826e8636dc.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-f91b0f603451.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-83beb16e0ecf.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-6e122dab64fc.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-18119e682df0.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-225433424a87.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-aaa714e5674d.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-0a3c53b9d1c2.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-ea73c9cb5377.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-4fce88777fa8.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-0210be90f4d3.css" /> <script type="application/json" id="client-env">{"locale":"en","featureFlags":["a11y_quote_reply_fix","copilot_immersive_issue_preview","copilot_new_references_ui","copilot_chat_repo_custom_instructions_preview","copilot_no_floating_button","copilot_topics_as_references","copilot_read_shared_conversation","copilot_duplicate_thread","copilot_buffered_streaming","dotcom_chat_client_side_skills","experimentation_azure_variant_endpoint","failbot_handle_non_errors","geojson_azure_maps","ghost_pilot_confidence_truncation_25","ghost_pilot_confidence_truncation_40","github_models_gateway_parse_params","github_models_o3_mini_streaming","insert_before_patch","issues_react_remove_placeholders","issues_react_blur_item_picker_on_close","marketing_pages_search_explore_provider","primer_react_css_modules_ga","react_data_router_pull_requests","remove_child_patch","sample_network_conn_type","swp_enterprise_contact_form","site_proxima_australia_update","viewscreen_sandbox","issues_react_create_milestone","issues_react_cache_fix_workaround","lifecycle_label_name_updates","copilot_task_oriented_assistive_prompts","issue_types_prevent_private_type_creation","refresh_image_video_src","react_router_dispose_on_disconnect","codespaces_prebuild_region_target_update","turbo_app_id_restore","copilot_code_review_sign_up_closed"]}</script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-900d20148682.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover_js-9da652f58479.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_arianotify-polyfill_ariaNotify-polyfill_js-node_modules_github_mi-3abb8f-46b9f4874d95.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_failbot_failbot_ts-75968cfb5298.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/environment-f04cb2a9fc8c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_primer_behaviors_dist_esm_index_mjs-0dbb79f97f8f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_selector-observer_dist_index_esm_js-f690fd9ae3d5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_relative-time-element_dist_index_js-62d275b7ddd9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_text-expander-element_dist_index_js-78748950cb0c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_auto-complete-element_dist_index_js-node_modules_github_catalyst_-8e9f78-a90ac05d2469.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-b5f1d7-a1760ffda83d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_markdown-toolbar-element_dist_index_js-ceef33f593fa.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_primer_view-co-c44a69-efa32db3a345.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-394f8eb34f19.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-25113a65b77f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_braintree_browser-detection_dist_browser-detection_js-node_modules_githu-2906d7-2a07a295af40.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-html_lit-html_js-be8cb88f481b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_morphdom_dist_morphdom-e-7c534c-a4a1922eb55f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_turbo_dist_turbo_es2017-esm_js-a03ee12d659a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-893f9f-b6294cf703b7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_color-convert_index_js-e3180fe3bcb3.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_quote-selection_dist_index_js-node_modules_github_session-resume_-947061-e7a6c4a19f98.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_updatable-content_updatable-content_ts-eb3147a21e96.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_task-list_ts-app_assets_modules_github_sso_ts-ui_packages-900dde-768abe60b1f8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_sticky-scroll-into-view_ts-3e000c5d31a9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_ajax-error_ts-app_assets_modules_github_behaviors_include-87a4ae-4c160a67a3f8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_commenting_edit_ts-app_assets_modules_github_behaviors_ht-83c235-e429cff6ceb1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-1f167e0c2aee.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_delegated-events_dist_index_js-node_modules_github_catalyst_lib_index_js-f6223d90c7ba.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-01e85cd1be94.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_virtualized-list_es_index_js-node_modules_github_template-parts_lib_index_js-94dc7a2157c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-70450e-4b93df70b903.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_ref-selector_ts-3e9d848bab5f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/codespaces-f76fb2dd7b91.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-3eebbd-0763620ad7bf.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_decorators_js-node_modules_delegated-events_di-e161aa-9d41fb1b6c9e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_github_remote--3c9c82-b71ef90fbdc7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repositories-e6e7c7ff47a3.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_github_catalyst_lib_inde-dbbea9-26cce2010167.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/code-menu-1c0aedc134b1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-602097a4b0db.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-0bc17999cb79.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-f1bca44e0926.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-cf2f2ab8dab4.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-62da9f-2df2f32ec596.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-9a233856b02c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-55fea94174bf.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-57956eade845.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.8157a56b30ae88a1b356.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.8157a56b30ae88a1b356.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <title>GitHub - trimstray/nginx-admins-handbook: How to improve NGINX performance, security, and other important things.</title> <meta name="route-pattern" content="/:user_id/:repository" data-turbo-transient> <meta name="route-controller" content="files" data-turbo-transient> <meta name="route-action" content="disambiguate" data-turbo-transient> <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb"> <meta name="request-id" content="AA92:3EDA94:1F403A2:269E855:67E9AB7A" data-pjax-transient="true"/><meta name="html-safe-nonce" content="a091efd0a8e37e50435b92785ac55e186f2b9937cc3bc9258b217415c8b9b068" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBQTkyOjNFREE5NDoxRjQwM0EyOjI2OUU4NTU6NjdFOUFCN0EiLCJ2aXNpdG9yX2lkIjoiMjU2ODMyNDg4MjA3NTU5MzU5NCIsInJlZ2lvbl9lZGdlIjoic291dGhlYXN0YXNpYSIsInJlZ2lvbl9yZW5kZXIiOiJzb3V0aGVhc3Rhc2lhIn0=" data-pjax-transient="true"/><meta name="visitor-hmac" content="bdf87c4b531a4c7f548897e24a6a521d250393f52fa831f9c9adababe70df175" data-pjax-transient="true"/> <meta name="hovercard-subject-tag" content="repository:167966270" data-turbo-transient> <meta name="github-keyboard-shortcuts" content="repository,copilot" data-turbo-transient="true" /> <meta name="selected-link" value="repo_source" data-turbo-transient> <link rel="assets" href="https://github.githubassets.com/"> <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I"> <meta name="octolytics-url" content="https://collector.github.com/github/collect" /> <meta name="analytics-location" content="/<user-name>/<repo-name>" data-turbo-transient="true" /> <meta name="user-login" content=""> <meta name="viewport" content="width=device-width"> <meta name="description" content="How to improve NGINX performance, security, and other important things. - trimstray/nginx-admins-handbook"> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub"> <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub"> <meta property="fb:app_id" content="1401488693436528"> <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/trimstray/nginx-admins-handbook" /> <meta name="twitter:image" content="https://opengraph.githubassets.com/08150f57d548c6c58ce283247296b197e925929493af745e78b67dc6c588f346/trimstray/nginx-admins-handbook" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="GitHub - trimstray/nginx-admins-handbook: How to improve NGINX performance, security, and other important things." /><meta name="twitter:description" content="How to improve NGINX performance, security, and other important things. - trimstray/nginx-admins-handbook" /> <meta property="og:image" content="https://opengraph.githubassets.com/08150f57d548c6c58ce283247296b197e925929493af745e78b67dc6c588f346/trimstray/nginx-admins-handbook" /><meta property="og:image:alt" content="How to improve NGINX performance, security, and other important things. - trimstray/nginx-admins-handbook" /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="GitHub - trimstray/nginx-admins-handbook: How to improve NGINX performance, security, and other important things." /><meta property="og:url" content="https://github.com/trimstray/nginx-admins-handbook" /><meta property="og:description" content="How to improve NGINX performance, security, and other important things. - trimstray/nginx-admins-handbook" /> <meta name="hostname" content="github.com"> <meta name="expected-hostname" content="github.com"> <meta http-equiv="x-pjax-version" content="154e3ed6ec9e0d6fff5da6846be55e3cefb81f7aa557cdcfe2a45d929fc158d2" data-turbo-track="reload"> <meta http-equiv="x-pjax-csp-version" content="e26f9f0ba624ee85cc7ac057d8faa8618a4f25a85eab052c33d018ac0f6b1a46" data-turbo-track="reload"> <meta http-equiv="x-pjax-css-version" content="159e03504eed5183f9787c72780a7d8c1460af30746ab09d728b048c41719efa" data-turbo-track="reload"> <meta http-equiv="x-pjax-js-version" content="3ef84064f1c111becc704df35223db168ecae977ac2d9ec422601ed98490e586" data-turbo-track="reload"> <meta name="turbo-cache-control" content="no-preview" data-turbo-transient=""> <meta data-hydrostats="publish"> <meta name="go-import" content="github.com/trimstray/nginx-admins-handbook git https://github.com/trimstray/nginx-admins-handbook.git"> <meta name="octolytics-dimension-user_id" content="31127917" /><meta name="octolytics-dimension-user_login" content="trimstray" /><meta name="octolytics-dimension-repository_id" content="167966270" /><meta name="octolytics-dimension-repository_nwo" content="trimstray/nginx-admins-handbook" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="167966270" /><meta name="octolytics-dimension-repository_network_root_nwo" content="trimstray/nginx-admins-handbook" /> <link rel="canonical" href="https://github.com/trimstray/nginx-admins-handbook" data-turbo-transient> <meta name="turbo-body-classes" content="logged-out env-production page-responsive"> <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats"> <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors"> <meta name="release" content="e4df4c5836d283ae011f7e3d74c48a4a579478a3"> <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000"> <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png"> <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon"> <meta name="theme-color" content="#1e2327"> <meta name="color-scheme" content="light dark" /> <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials"> </head> <body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div class="position-relative header-wrapper js-header-wrapper "> <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a> <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full"> <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span> </span> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ui-commands_ui-commands_ts-2ea4e93613c0.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-79d6a754ebf9.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.8157a56b30ae88a1b356.module.css" /> <react-partial partial-name="keyboard-shortcuts-dialog" data-ssr="false" data-attempted-ssr="false" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script> <div data-target="react-partial.reactRoot"></div> </react-partial> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-94fd67-4898d1bf4b51.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/sessions-730dca81d0a2.js"></script> <header class="HeaderMktg header-logged-out js-details-container js-header Details f4 py-3" role="banner" data-is-top="true" data-color-mode=light data-light-theme=light data-dark-theme=dark> <h2 class="sr-only">Navigation Menu</h2> <button type="button" class="HeaderMktg-backdrop d-lg-none border-0 position-fixed top-0 left-0 width-full height-full js-details-target" aria-label="Toggle navigation"> <span class="d-none">Toggle navigation</span> </button> <div class="d-flex flex-column flex-lg-row flex-items-center px-3 px-md-4 px-lg-5 height-full position-relative z-1"> <div class="d-flex flex-justify-between flex-items-center width-full width-lg-auto"> <div class="flex-1"> <button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="js-details-target js-nav-padding-recalculate js-header-menu-toggle Button--link Button--medium Button d-lg-none color-fg-inherit p-1"> <span class="Button-content"> <span class="Button-label"><div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div></span> </span> </button> </div> <a class="mr-lg-3 color-fg-inherit flex-order-2 js-prevent-focus-on-mobile-nav" href="/" aria-label="Homepage" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Logomark;ref_loc:Header"}"> <svg height="32" aria-hidden="true" viewBox="0 0 24 24" version="1.1" width="32" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12 1C5.9225 1 1 5.9225 1 12C1 16.8675 4.14875 20.9787 8.52125 22.4362C9.07125 22.5325 9.2775 22.2025 9.2775 21.9137C9.2775 21.6525 9.26375 20.7862 9.26375 19.865C6.5 20.3737 5.785 19.1912 5.565 18.5725C5.44125 18.2562 4.905 17.28 4.4375 17.0187C4.0525 16.8125 3.5025 16.3037 4.42375 16.29C5.29 16.2762 5.90875 17.0875 6.115 17.4175C7.105 19.0812 8.68625 18.6137 9.31875 18.325C9.415 17.61 9.70375 17.1287 10.02 16.8537C7.5725 16.5787 5.015 15.63 5.015 11.4225C5.015 10.2262 5.44125 9.23625 6.1425 8.46625C6.0325 8.19125 5.6475 7.06375 6.2525 5.55125C6.2525 5.55125 7.17375 5.2625 9.2775 6.67875C10.1575 6.43125 11.0925 6.3075 12.0275 6.3075C12.9625 6.3075 13.8975 6.43125 14.7775 6.67875C16.8813 5.24875 17.8025 5.55125 17.8025 5.55125C18.4075 7.06375 18.0225 8.19125 17.9125 8.46625C18.6138 9.23625 19.04 10.2125 19.04 11.4225C19.04 15.6437 16.4688 16.5787 14.0213 16.8537C14.42 17.1975 14.7638 17.8575 14.7638 18.8887C14.7638 20.36 14.75 21.5425 14.75 21.9137C14.75 22.2025 14.9563 22.5462 15.5063 22.4362C19.8513 20.9787 23 16.8537 23 12C23 5.9225 18.0775 1 12 1Z"></path> </svg> </a> <div class="flex-1 flex-order-2 text-right"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2Ftrimstray%2Fnginx-admins-handbook" class="HeaderMenu-link HeaderMenu-button d-inline-flex d-lg-none flex-order-1 f5 no-underline border color-border-default rounded-2 px-2 py-1 color-fg-inherit js-prevent-focus-on-mobile-nav" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/trimstray/nginx-admins-handbook","user_id":null}}" data-hydro-click-hmac="936a13b814831241c21d889d8562d519d1c4908e1273ef0cfd42dc303cf3d645" data-analytics-event="{"category":"Marketing nav","action":"click to Sign in","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> </div> <div class="HeaderMenu js-header-menu height-fit position-lg-relative d-lg-flex flex-column flex-auto top-0"> <div class="HeaderMenu-wrapper d-flex flex-column flex-self-start flex-lg-row flex-auto rounded rounded-lg-0"> <nav class="HeaderMenu-nav" aria-label="Global"> <ul class="d-lg-flex list-style-none"> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Product <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"github_copilot","context":"product","tag":"link","label":"github_copilot_link_product_navbar"}" href="https://github.com/features/copilot"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Write better code with AI </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"security","context":"product","tag":"link","label":"security_link_product_navbar"}" href="https://github.com/features/security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Security</div> Find and fix vulnerabilities </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"actions","context":"product","tag":"link","label":"actions_link_product_navbar"}" href="https://github.com/features/actions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-workflow color-fg-subtle mr-3"> <path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path> </svg> <div> <div class="color-fg-default h4">Actions</div> Automate any workflow </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"codespaces","context":"product","tag":"link","label":"codespaces_link_product_navbar"}" href="https://github.com/features/codespaces"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-codespaces color-fg-subtle mr-3"> <path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> <div> <div class="color-fg-default h4">Codespaces</div> Instant dev environments </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"issues","context":"product","tag":"link","label":"issues_link_product_navbar"}" href="https://github.com/features/issues"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-issue-opened color-fg-subtle mr-3"> <path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path> </svg> <div> <div class="color-fg-default h4">Issues</div> Plan and track work </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"code_review","context":"product","tag":"link","label":"code_review_link_product_navbar"}" href="https://github.com/features/code-review"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-review color-fg-subtle mr-3"> <path d="M10.3 6.74a.75.75 0 0 1-.04 1.06l-2.908 2.7 2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M1.5 4.25c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v12.5a1.75 1.75 0 0 1-1.75 1.75h-9.69l-3.573 3.573A1.458 1.458 0 0 1 5 21.043V18.5H3.25a1.75 1.75 0 0 1-1.75-1.75ZM3.25 4a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 .75.75v3.19l3.72-3.72a.749.749 0 0 1 .53-.22h10a.25.25 0 0 0 .25-.25V4.25a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Review</div> Manage code changes </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"discussions","context":"product","tag":"link","label":"discussions_link_product_navbar"}" href="https://github.com/features/discussions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Discussions</div> Collaborate outside of code </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"code_search","context":"product","tag":"link","label":"code_search_link_product_navbar"}" href="https://github.com/features/code-search"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-square color-fg-subtle mr-3"> <path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Search</div> Find more, search less </div> </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="product-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="product-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"all_features","context":"product","tag":"link","label":"all_features_link_product_navbar"}" href="https://github.com/features"> All features </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"documentation","context":"product","tag":"link","label":"documentation_link_product_navbar"}" href="https://docs.github.com"> Documentation <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"github_skills","context":"product","tag":"link","label":"github_skills_link_product_navbar"}" href="https://skills.github.com"> GitHub Skills <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"blog","context":"product","tag":"link","label":"blog_link_product_navbar"}" href="https://github.blog"> Blog <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Solutions <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 pb-lg-3 mb-3 mb-lg-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-company-size-heading">By company size</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-company-size-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"enterprises","context":"solutions","tag":"link","label":"enterprises_link_solutions_navbar"}" href="https://github.com/enterprise"> Enterprises </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"small_and_medium_teams","context":"solutions","tag":"link","label":"small_and_medium_teams_link_solutions_navbar"}" href="https://github.com/team"> Small and medium teams </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"startups","context":"solutions","tag":"link","label":"startups_link_solutions_navbar"}" href="https://github.com/enterprise/startups"> Startups </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"nonprofits","context":"solutions","tag":"link","label":"nonprofits_link_solutions_navbar"}" href="/solutions/industry/nonprofits"> Nonprofits </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-use-case-heading">By use case</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-use-case-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devsecops","context":"solutions","tag":"link","label":"devsecops_link_solutions_navbar"}" href="/solutions/use-case/devsecops"> DevSecOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"solutions","tag":"link","label":"devops_link_solutions_navbar"}" href="/solutions/use-case/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ci_cd","context":"solutions","tag":"link","label":"ci_cd_link_solutions_navbar"}" href="/solutions/use-case/ci-cd"> CI/CD </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_use_cases","context":"solutions","tag":"link","label":"view_all_use_cases_link_solutions_navbar"}" href="/solutions/use-case"> View all use cases </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-industry-heading">By industry</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-industry-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"healthcare","context":"solutions","tag":"link","label":"healthcare_link_solutions_navbar"}" href="/solutions/industry/healthcare"> Healthcare </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"financial_services","context":"solutions","tag":"link","label":"financial_services_link_solutions_navbar"}" href="/solutions/industry/financial-services"> Financial services </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"manufacturing","context":"solutions","tag":"link","label":"manufacturing_link_solutions_navbar"}" href="/solutions/industry/manufacturing"> Manufacturing </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"government","context":"solutions","tag":"link","label":"government_link_solutions_navbar"}" href="/solutions/industry/government"> Government </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_industries","context":"solutions","tag":"link","label":"view_all_industries_link_solutions_navbar"}" href="/solutions/industry"> View all industries </a></li> </ul> </div> </div> <div class="HeaderMenu-trailing-link rounded-bottom-2 flex-shrink-0 mt-lg-4 px-lg-4 py-4 py-lg-3 f5 text-semibold"> <a href="/solutions"> View all solutions <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-right HeaderMenu-trailing-link-icon"> <path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path> </svg> </a> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Resources <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-topics-heading">Topics</span> <ul class="list-style-none f5" aria-labelledby="resources-topics-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ai","context":"resources","tag":"link","label":"ai_link_resources_navbar"}" href="/resources/articles/ai"> AI </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"resources","tag":"link","label":"devops_link_resources_navbar"}" href="/resources/articles/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"security","context":"resources","tag":"link","label":"security_link_resources_navbar"}" href="/resources/articles/security"> Security </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"software_development","context":"resources","tag":"link","label":"software_development_link_resources_navbar"}" href="/resources/articles/software-development"> Software Development </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all","context":"resources","tag":"link","label":"view_all_link_resources_navbar"}" href="/resources/articles"> View all </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="resources-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"learning_pathways","context":"resources","tag":"link","label":"learning_pathways_link_resources_navbar"}" href="https://resources.github.com/learn/pathways"> Learning Pathways <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"events_amp_webinars","context":"resources","tag":"link","label":"events_amp_webinars_link_resources_navbar"}" href="https://resources.github.com"> Events & Webinars <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ebooks_amp_whitepapers","context":"resources","tag":"link","label":"ebooks_amp_whitepapers_link_resources_navbar"}" href="https://github.com/resources/whitepapers"> Ebooks & Whitepapers </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"customer_stories","context":"resources","tag":"link","label":"customer_stories_link_resources_navbar"}" href="https://github.com/customer-stories"> Customer Stories </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"partners","context":"resources","tag":"link","label":"partners_link_resources_navbar"}" href="https://partner.github.com"> Partners <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"executive_insights","context":"resources","tag":"link","label":"executive_insights_link_resources_navbar"}" href="https://github.com/solutions/executive-insights"> Executive Insights </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Open Source <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"github_sponsors","context":"open_source","tag":"link","label":"github_sponsors_link_open_source_navbar"}" href="/sponsors"> <div> <div class="color-fg-default h4">GitHub Sponsors</div> Fund open source developers </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"the_readme_project","context":"open_source","tag":"link","label":"the_readme_project_link_open_source_navbar"}" href="https://github.com/readme"> <div> <div class="color-fg-default h4">The ReadME Project</div> GitHub community articles </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="open-source-repositories-heading">Repositories</span> <ul class="list-style-none f5" aria-labelledby="open-source-repositories-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"topics","context":"open_source","tag":"link","label":"topics_link_open_source_navbar"}" href="https://github.com/topics"> Topics </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"trending","context":"open_source","tag":"link","label":"trending_link_open_source_navbar"}" href="https://github.com/trending"> Trending </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"collections","context":"open_source","tag":"link","label":"collections_link_open_source_navbar"}" href="https://github.com/collections"> Collections </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Enterprise <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"enterprise_platform","context":"enterprise","tag":"link","label":"enterprise_platform_link_enterprise_navbar"}" href="/enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-stack color-fg-subtle mr-3"> <path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path> </svg> <div> <div class="color-fg-default h4">Enterprise platform</div> AI-powered developer platform </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="enterprise-available-add-ons-heading">Available add-ons</span> <ul class="list-style-none f5" aria-labelledby="enterprise-available-add-ons-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"advanced_security","context":"enterprise","tag":"link","label":"advanced_security_link_enterprise_navbar"}" href="https://github.com/enterprise/advanced-security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Advanced Security</div> Enterprise-grade security features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"copilot_for_business","context":"enterprise","tag":"link","label":"copilot_for_business_link_enterprise_navbar"}" href="/features/copilot/copilot-business"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">Copilot for business</div> Enterprise-grade AI features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"premium_support","context":"enterprise","tag":"link","label":"premium_support_link_enterprise_navbar"}" href="/premium-support"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Premium Support</div> Enterprise-grade 24/7 support </div> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <a class="HeaderMenu-link no-underline px-0 px-lg-2 py-3 py-lg-2 d-block d-lg-inline-block" data-analytics-event="{"location":"navbar","action":"pricing","context":"global","tag":"link","label":"pricing_link_global_navbar"}" href="https://github.com/pricing">Pricing</a> </li> </ul> </nav> <div class="d-flex flex-column flex-lg-row width-full flex-justify-end flex-lg-items-center text-center mt-3 mt-lg-0 text-lg-left ml-lg-3"> <qbsearch-input class="search-input" data-scope="repo:trimstray/nginx-admins-handbook" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="elB2L00P9jJ-pYEthBTbx5JRt4ez15dAYMhs5FXljGnTWutWuRvYpfNH8j8Q4GUBv_6FOT7UD0wg8vQokGKI6Q" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="trimstray/nginx-admins-handbook" data-current-org="" data-current-owner="trimstray" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true"> <div class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center mr-4 rounded" data-action="click:qbsearch-input#searchInputContainerClicked" > <button type="button" class="header-search-button placeholder input-button form-control d-flex flex-1 flex-self-stretch flex-items-center no-wrap width-full py-0 pl-2 pr-0 text-left border-0 box-shadow-none" data-target="qbsearch-input.inputButton" aria-label="Search or jump to…" aria-haspopup="dialog" placeholder="Search or jump to..." data-hotkey=s,/ autocapitalize="off" data-analytics-event="{"location":"navbar","action":"searchbar","context":"global","tag":"input","label":"searchbar_input_global_navbar"}" data-action="click:qbsearch-input#handleExpand" > <div class="mr-2 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </div> <span class="flex-1" data-target="qbsearch-input.inputButtonText">Search or jump to...</span> <div class="d-flex" data-target="qbsearch-input.hotkeyIndicator"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="20" aria-hidden="true" class="mr-1"><path fill="none" stroke="#979A9C" opacity=".4" d="M3.5.5h12c1.7 0 3 1.3 3 3v13c0 1.7-1.3 3-3 3h-12c-1.7 0-3-1.3-3-3v-13c0-1.7 1.3-3 3-3z"></path><path fill="#979A9C" d="M11.8 6L8 15.1h-.9L10.8 6h1z"></path></svg> </div> </button> <input type="hidden" name="type" class="js-site-search-type-field"> <div class="Overlay--hidden " data-modal-dialog-overlay> <modal-dialog data-action="close:qbsearch-input#handleClose cancel:qbsearch-input#handleClose" data-target="qbsearch-input.searchSuggestionsDialog" role="dialog" id="search-suggestions-dialog" aria-modal="true" aria-labelledby="search-suggestions-dialog-header" data-view-component="true" class="Overlay Overlay--width-large Overlay--height-auto"> <h1 id="search-suggestions-dialog-header" class="sr-only">Search code, repositories, users, issues, pull requests...</h1> <div class="Overlay-body Overlay-body--paddingNone"> <div data-view-component="true"> <div class="search-suggestions position-fixed width-full color-shadow-large border color-fg-default color-bg-default overflow-hidden d-flex flex-column query-builder-container" style="border-radius: 12px;" data-target="qbsearch-input.queryBuilderContainer" hidden > <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="query-builder-test-form" action="" accept-charset="UTF-8" method="get"> <query-builder data-target="qbsearch-input.queryBuilder" id="query-builder-query-builder-test" data-filter-key=":" data-view-component="true" class="QueryBuilder search-query-builder"> <div class="FormControl FormControl--fullWidth"> <label id="query-builder-test-label" for="query-builder-test" class="FormControl-label sr-only"> Search </label> <div class="QueryBuilder-StyledInput width-fit " data-target="query-builder.styledInput" > <span id="query-builder-test-leadingvisual-wrap" class="FormControl-input-leadingVisualWrap QueryBuilder-leadingVisualWrap"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search FormControl-input-leadingVisual"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </span> <div data-target="query-builder.styledInputContainer" class="QueryBuilder-StyledInputContainer"> <div aria-hidden="true" class="QueryBuilder-StyledInputContent" data-target="query-builder.styledInputContent" ></div> <div class="QueryBuilder-InputWrapper"> <div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div> <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-0bb52232-c008-40ec-84d7-7f86980fc27e" data-target="query-builder.input" data-action=" input:query-builder#inputChange blur:query-builder#inputBlur keydown:query-builder#inputKeydown focus:query-builder#inputFocus " data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" /> </div> </div> <span class="sr-only" id="query-builder-test-clear">Clear</span> <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-target="query-builder.clearButton" data-action=" click:query-builder#clear focus:query-builder#clearButtonFocus blur:query-builder#clearButtonBlur " variant="small" hidden="hidden" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual"> <path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path> </svg> </button> </div> <template id="search-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </template> <template id="code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="file-code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-code"> <path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path> </svg> </template> <template id="history-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history"> <path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path> </svg> </template> <template id="repo-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> </template> <template id="bookmark-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bookmark"> <path d="M3 2.75C3 1.784 3.784 1 4.75 1h6.5c.966 0 1.75.784 1.75 1.75v11.5a.75.75 0 0 1-1.227.579L8 11.722l-3.773 3.107A.751.751 0 0 1 3 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.91l3.023-2.489a.75.75 0 0 1 .954 0l3.023 2.49V2.75a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="plus-circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-plus-circle"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7.25-3.25v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> </template> <template id="trash-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-trash"> <path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"></path> </svg> </template> <template id="team-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-people"> <path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path> </svg> </template> <template id="project-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-project"> <path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"></path> </svg> </template> <template id="pencil-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pencil"> <path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path> </svg> </template> <template id="copilot-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot"> <path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="copilot-error-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot-error"> <path d="M16 11.24c0 .112-.072.274-.21.467L13 9.688V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-.198 0-.388-.009-.571-.029L6.833 5.226a4.01 4.01 0 0 0 .17-.782c.117-.935-.037-1.395-.241-1.614-.193-.206-.637-.413-1.682-.297-.683.076-1.115.231-1.395.415l-1.257-.91c.579-.564 1.413-.877 2.485-.996 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095Zm-5.083-8.707c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Zm2.511 11.074c-1.393.776-3.272 1.428-5.43 1.428-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.18-.455-.241-.963-.252-1.475L.31 4.107A.747.747 0 0 1 0 3.509V3.49a.748.748 0 0 1 .625-.73c.156-.026.306.047.435.139l14.667 10.578a.592.592 0 0 1 .227.264.752.752 0 0 1 .046.249v.022a.75.75 0 0 1-1.19.596Zm-1.367-.991L5.635 7.964a5.128 5.128 0 0 1-.889.073c-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433 1.539 0 3.089-.505 4.063-.934Z"></path> </svg> </template> <template id="workflow-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-workflow"> <path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="book-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> </template> <template id="code-review-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-review"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 13H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25v-8.5C0 1.784.784 1 1.75 1ZM1.5 2.75v8.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm5.28 1.72a.75.75 0 0 1 0 1.06L5.31 7l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.75.75 0 0 1 1.06 0Zm2.44 0a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L10.69 7 9.22 5.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="codespaces-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-codespaces"> <path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> </template> <template id="comment-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment"> <path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="comment-discussion-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> </template> <template id="organization-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-organization"> <path d="M1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.749.749 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.766.766 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75Zm-.25-1.75c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM3.75 6h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75Zm4 3A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75ZM7.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75ZM7.75 9h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="rocket-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-rocket"> <path d="M14.064 0h.186C15.216 0 16 .784 16 1.75v.186a8.752 8.752 0 0 1-2.564 6.186l-.458.459c-.314.314-.641.616-.979.904v3.207c0 .608-.315 1.172-.833 1.49l-2.774 1.707a.749.749 0 0 1-1.11-.418l-.954-3.102a1.214 1.214 0 0 1-.145-.125L3.754 9.816a1.218 1.218 0 0 1-.124-.145L.528 8.717a.749.749 0 0 1-.418-1.11l1.71-2.774A1.748 1.748 0 0 1 3.31 4h3.204c.288-.338.59-.665.904-.979l.459-.458A8.749 8.749 0 0 1 14.064 0ZM8.938 3.623h-.002l-.458.458c-.76.76-1.437 1.598-2.02 2.5l-1.5 2.317 2.143 2.143 2.317-1.5c.902-.583 1.74-1.26 2.499-2.02l.459-.458a7.25 7.25 0 0 0 2.123-5.127V1.75a.25.25 0 0 0-.25-.25h-.186a7.249 7.249 0 0 0-5.125 2.123ZM3.56 14.56c-.732.732-2.334 1.045-3.005 1.148a.234.234 0 0 1-.201-.064.234.234 0 0 1-.064-.201c.103-.671.416-2.273 1.15-3.003a1.502 1.502 0 1 1 2.12 2.12Zm6.94-3.935c-.088.06-.177.118-.266.175l-2.35 1.521.548 1.783 1.949-1.2a.25.25 0 0 0 .119-.213ZM3.678 8.116 5.2 5.766c.058-.09.117-.178.176-.266H3.309a.25.25 0 0 0-.213.119l-1.2 1.95ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </template> <template id="shield-check-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield-check"> <path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="heart-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart"> <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path> </svg> </template> <template id="server-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-server"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v4c0 .372-.116.717-.314 1 .198.283.314.628.314 1v4a1.75 1.75 0 0 1-1.75 1.75H1.75A1.75 1.75 0 0 1 0 12.75v-4c0-.358.109-.707.314-1a1.739 1.739 0 0 1-.314-1v-4C0 1.784.784 1 1.75 1ZM1.5 2.75v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm.25 5.75a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25ZM7 4.75A.75.75 0 0 1 7.75 4h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 7 4.75ZM7.75 10h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM3 4.75A.75.75 0 0 1 3.75 4h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 4.75ZM3.75 10h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="globe-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-globe"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path> </svg> </template> <template id="issue-opened-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </template> <template id="device-mobile-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-mobile"> <path d="M3.75 0h8.5C13.216 0 14 .784 14 1.75v12.5A1.75 1.75 0 0 1 12.25 16h-8.5A1.75 1.75 0 0 1 2 14.25V1.75C2 .784 2.784 0 3.75 0ZM3.5 1.75v12.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM8 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path> </svg> </template> <template id="package-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-package"> <path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path> </svg> </template> <template id="credit-card-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-credit-card"> <path d="M10.75 9a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5Z"></path><path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25ZM14.5 6.5h-13v5.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm0-2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25V5h13Z"></path> </svg> </template> <template id="play-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </template> <template id="gift-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gift"> <path d="M2 2.75A2.75 2.75 0 0 1 4.75 0c.983 0 1.873.42 2.57 1.232.268.318.497.668.68 1.042.183-.375.411-.725.68-1.044C9.376.42 10.266 0 11.25 0a2.75 2.75 0 0 1 2.45 4h.55c.966 0 1.75.784 1.75 1.75v2c0 .698-.409 1.301-1 1.582v4.918A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V9.332C.409 9.05 0 8.448 0 7.75v-2C0 4.784.784 4 1.75 4h.55c-.192-.375-.3-.8-.3-1.25ZM7.25 9.5H2.5v4.75c0 .138.112.25.25.25h4.5Zm1.5 0v5h4.5a.25.25 0 0 0 .25-.25V9.5Zm0-4V8h5.5a.25.25 0 0 0 .25-.25v-2a.25.25 0 0 0-.25-.25Zm-7 0a.25.25 0 0 0-.25.25v2c0 .138.112.25.25.25h5.5V5.5h-5.5Zm3-4a1.25 1.25 0 0 0 0 2.5h2.309c-.233-.818-.542-1.401-.878-1.793-.43-.502-.915-.707-1.431-.707ZM8.941 4h2.309a1.25 1.25 0 0 0 0-2.5c-.516 0-1 .205-1.43.707-.337.392-.646.975-.879 1.793Z"></path> </svg> </template> <template id="code-square-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="device-desktop-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-desktop"> <path d="M14.25 1c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.752.752 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5C0 1.784.784 1 1.75 1ZM1.75 2.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25ZM9.018 12H6.982a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5Z"></path> </svg> </template> <div class="position-relative"> <ul role="listbox" class="ActionListWrap QueryBuilder-ListWrap" aria-label="Suggestions" data-action=" combobox-commit:query-builder#comboboxCommit mousedown:query-builder#resultsMousedown " data-target="query-builder.resultsList" data-persist-list=false id="query-builder-test-results" ></ul> </div> <div class="FormControl-inlineValidation" id="validation-0bb52232-c008-40ec-84d7-7f86980fc27e" hidden="hidden"> <span class="FormControl-inlineValidation--visual"> <svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill"> <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path> </svg> </span> <span></span> </div> </div> <div data-target="query-builder.screenReaderFeedback" aria-live="polite" aria-atomic="true" class="sr-only"></div> </query-builder></form> <div class="d-flex flex-row color-fg-muted px-3 text-small color-bg-default search-feedback-prompt"> <a target="_blank" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax" data-view-component="true" class="Link color-fg-accent text-normal ml-2">Search syntax tips</a> <div class="d-flex flex-1"></div> </div> </div> </div> </div> </modal-dialog></div> </div> <div data-action="click:qbsearch-input#retract" class="dark-backdrop position-fixed" hidden data-target="qbsearch-input.darkBackdrop"></div> <div class="color-fg-default"> <dialog-helper> <dialog data-target="qbsearch-input.feedbackDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="feedback-dialog" aria-modal="true" aria-labelledby="feedback-dialog-title" aria-describedby="feedback-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="feedback-dialog-title"> Provide feedback </h1> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="feedback-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="feedback-dialog-title"> <div data-view-component="true" class="Overlay-body"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="zaRblRaqqxuYN+2Czlyx8vj1GOIMcHzE/yujG1LiRa2mkciRtYYNDSy4/dIv/hZ/DBJHICUpbwYvpHd93D7TxQ==" /> <p>We read every piece of feedback, and take your input very seriously.</p> <textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea> <input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox"> <label for="include_email" style="font-weight: normal">Include my email address so I can be contacted</label> </form></div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd"> <button data-close-dialog-id="feedback-dialog" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="code-search-feedback-form" data-action="click:qbsearch-input#submitFeedback" type="submit" data-view-component="true" class="btn-primary btn"> Submit feedback </button> </div> </dialog></dialog-helper> <custom-scopes data-target="qbsearch-input.customScopesManager"> <dialog-helper> <dialog data-target="custom-scopes.customScopesModalDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="custom-scopes-dialog" aria-modal="true" aria-labelledby="custom-scopes-dialog-title" aria-describedby="custom-scopes-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header Overlay-header--divided"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="custom-scopes-dialog-title"> Saved searches </h1> <h2 id="custom-scopes-dialog-description" class="Overlay-description">Use saved searches to filter your results more quickly</h2> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="custom-scopes-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="custom-scopes-dialog-title"> <div data-view-component="true" class="Overlay-body"> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="jwRPOxyjCV2Y2IwstDJoK79Dm4KIJToCTcQg6KF7FNvO7lqCZNXcU2LZAbp4yxGpWv8W+/KTtJ102MKJLYzoWg==" /> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField"> <div class="form-group"> <label for="custom_scope_name">Name</label> <auto-check src="/search/custom_scopes/check_name" required only-validate-on-blur="false"> <input type="text" name="custom_scope_name" id="custom_scope_name" data-target="custom-scopes.customScopesNameField" class="form-control" autocomplete="off" placeholder="github-ruby" required maxlength="50"> <input type="hidden" data-csrf="true" value="xyQjhIlDK+ZI+JYBCOeKL+SHa6m3BWENXHMNjSHZniC+JRgbqJ9H2b16Xrge7/wO31w/jeJxmtwNUS7Uaj8lMw==" /> </auto-check> </div> <div class="form-group"> <label for="custom_scope_query">Query</label> <input type="text" name="custom_scope_query" id="custom_scope_query" data-target="custom-scopes.customScopesQueryField" class="form-control" autocomplete="off" placeholder="(repo:mona/a OR repo:mona/b) AND lang:python" required maxlength="500"> </div> <p class="text-small color-fg-muted"> To see all available qualifiers, see our <a class="Link--inTextBlock" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax">documentation</a>. </p> </form> </div> <div data-target="custom-scopes.manageCustomScopesForm"> <div data-target="custom-scopes.list"></div> </div> </div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided"> <button data-action="click:custom-scopes#customScopesCancel" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="custom-scopes-dialog-form" data-action="click:custom-scopes#customScopesSubmit" data-target="custom-scopes.customScopesSubmitButton" type="submit" data-view-component="true" class="btn-primary btn"> Create saved search </button> </div> </dialog></dialog-helper> </custom-scopes> </div> </qbsearch-input> <div class="position-relative HeaderMenu-link-wrap d-lg-inline-block"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2Ftrimstray%2Fnginx-admins-handbook" class="HeaderMenu-link HeaderMenu-link--sign-in HeaderMenu-button flex-shrink-0 no-underline d-none d-lg-inline-flex border border-lg-0 rounded rounded-lg-0 px-2 py-1" style="margin-left: 12px;" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/trimstray/nginx-admins-handbook","user_id":null}}" data-hydro-click-hmac="936a13b814831241c21d889d8562d519d1c4908e1273ef0cfd42dc303cf3d645" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> <a href="/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E&source=header-repo&source_repo=trimstray%2Fnginx-admins-handbook" class="HeaderMenu-link HeaderMenu-link--sign-up HeaderMenu-button flex-shrink-0 d-flex d-lg-inline-flex no-underline border color-border-default rounded px-2 py-1" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/trimstray/nginx-admins-handbook","user_id":null}}" data-hydro-click-hmac="936a13b814831241c21d889d8562d519d1c4908e1273ef0cfd42dc303cf3d645" data-analytics-event="{"category":"Sign up","action":"click to sign up for account","label":"ref_page:/<user-name>/<repo-name>;ref_cta:Sign up;ref_loc:header logged out"}" > Sign up </a> <button type="button" class="sr-only js-header-menu-focus-trap d-block d-lg-none">Reseting focus</button> </div> </div> </div> </div> </header> <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <button id="icon-button-f5adf185-0cbb-4721-847f-eb5c3c332f16" aria-labelledby="tooltip-d4887460-e084-4915-8a5f-75b51a20ade0" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button><tool-tip id="tooltip-d4887460-e084-4915-8a5f-75b51a20ade0" for="icon-button-f5adf185-0cbb-4721-847f-eb5c3c332f16" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip> </div> </div> <div id="start-of-content" class="show-on-focus"></div> <div id="js-flash-container" class="flash-container" data-turbo-replace> <template class="js-flash-template"> <div class="flash flash-full {{ className }}"> <div > <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div aria-atomic="true" role="alert" class="js-flash-alert"> <div>{{ message }}</div> </div> </div> </div> </template> </div> <div class="application-main " data-commit-hovercards-enabled data-discussion-hovercards-enabled data-issue-and-pr-hovercards-enabled data-project-hovercards-enabled > <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class=""> <main id="js-repo-pjax-container" > <div id="repository-container-header" class="pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace> <div class="d-flex flex-nowrap flex-justify-end mb-3 px-3 px-lg-5" style="gap: 1rem;"> <div class="flex-auto min-width-0 width-fit"> <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> <span class="author flex-self-stretch" itemprop="author"> <a class="url fn" rel="author" data-hovercard-type="user" data-hovercard-url="/users/trimstray/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/trimstray"> trimstray </a> </span> <span class="mx-1 flex-self-stretch color-fg-muted">/</span> <strong itemprop="name" class="mr-2 flex-self-stretch"> <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/trimstray/nginx-admins-handbook">nginx-admins-handbook</a> </strong> <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span> </div> </div> <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;"> <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;"> <li> <a href="/login?return_to=%2Ftrimstray%2Fnginx-admins-handbook" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/trimstray/nginx-admins-handbook","user_id":null}}" data-hydro-click-hmac="e79a3b7601d41217cc3302e8d4cdf7b46c18bfa0998f51ee89b685df047695fd" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-937a87d6-2004-4e14-9898-7e269ae6bccb" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </li> <li> <a icon="repo-forked" id="fork-button" href="/login?return_to=%2Ftrimstray%2Fnginx-admins-handbook" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"repo details fork button","repository_id":167966270,"auth_type":"LOG_IN","originating_url":"https://github.com/trimstray/nginx-admins-handbook","user_id":null}}" data-hydro-click-hmac="03571489a4664fad639624fd9ee9739974c63d1546794fd8048ecdb91e11e118" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg>Fork <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="1,099" data-view-component="true" class="Counter">1.1k</span> </a> </li> <li> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2Ftrimstray%2Fnginx-admins-handbook" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":167966270,"auth_type":"LOG_IN","originating_url":"https://github.com/trimstray/nginx-admins-handbook","user_id":null}}" data-hydro-click-hmac="8973593ef63652b9c43e96647e1a66146691c485ac3193285f93c9ae26b137f7" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> <span id="repo-stars-counter-star" aria-label="13636 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="13,636" data-view-component="true" class="Counter js-social-count">13.6k</span> </a></div> </li> </ul> </div> </div> <div id="responsive-meta-container" data-turbo-replace> <div class="d-block d-md-none mb-2 px-3 px-md-4 px-lg-5"> <p class="f4 mb-3 "> How to improve NGINX performance, security, and other important things. </p> <h3 class="sr-only">License</h3> <div class="mb-2"> <a href="/trimstray/nginx-admins-handbook/blob/master/LICENSE.md" class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:license"}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> MIT license </a> </div> <div class="mb-3"> <a class="Link--secondary no-underline mr-3" href="/trimstray/nginx-admins-handbook/stargazers"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-1"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <span class="text-bold">13.6k</span> stars </a> <a class="Link--secondary no-underline mr-3" href="/trimstray/nginx-admins-handbook/forks"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-1"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <span class="text-bold">1.1k</span> forks </a> <a class="Link--secondary no-underline mr-3 d-inline-block" href="/trimstray/nginx-admins-handbook/branches"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-branch mr-1"> <path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path> </svg> <span>Branches</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/trimstray/nginx-admins-handbook/tags"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-tag mr-1"> <path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path> </svg> <span>Tags</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/trimstray/nginx-admins-handbook/activity"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-1"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span>Activity</span> </a> </div> <div class="d-flex flex-wrap gap-2"> <div class="flex-1"> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2Ftrimstray%2Fnginx-admins-handbook" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":167966270,"auth_type":"LOG_IN","originating_url":"https://github.com/trimstray/nginx-admins-handbook","user_id":null}}" data-hydro-click-hmac="8973593ef63652b9c43e96647e1a66146691c485ac3193285f93c9ae26b137f7" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> </a></div> </div> <div class="flex-1"> <a href="/login?return_to=%2Ftrimstray%2Fnginx-admins-handbook" rel="nofollow" id="files-overview-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/trimstray/nginx-admins-handbook","user_id":null}}" data-hydro-click-hmac="e79a3b7601d41217cc3302e8d4cdf7b46c18bfa0998f51ee89b685df047695fd" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-8001d078-4476-4d28-ba41-483fe9f16c4a" for="files-overview-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </div> <span> </span> </div> </div> </div> <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 px-md-4 px-lg-5"> <ul data-view-component="true" class="UnderlineNav-body list-style-none"> <li data-view-component="true" class="d-inline-flex"> <a id="code-tab" href="/trimstray/nginx-admins-handbook" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /trimstray/nginx-admins-handbook" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Code","target":"UNDERLINE_NAV.TAB"}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> <span data-content="Code">Code</span> <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="issues-tab" href="/trimstray/nginx-admins-handbook/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /trimstray/nginx-admins-handbook/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Issues","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> <span data-content="Issues">Issues</span> <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="2" data-view-component="true" class="Counter">2</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="pull-requests-tab" href="/trimstray/nginx-admins-handbook/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /trimstray/nginx-admins-handbook/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Pull requests","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> <span data-content="Pull requests">Pull requests</span> <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="1" data-view-component="true" class="Counter">1</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="actions-tab" href="/trimstray/nginx-admins-handbook/actions" data-tab-item="i3actions-tab" data-selected-links="repo_actions /trimstray/nginx-admins-handbook/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Actions","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> <span data-content="Actions">Actions</span> <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="security-tab" href="/trimstray/nginx-admins-handbook/security" data-tab-item="i4security-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /trimstray/nginx-admins-handbook/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Security","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span data-content="Security">Security</span> <include-fragment src="/trimstray/nginx-admins-handbook/security/overall-count" accept="text/fragment+html"></include-fragment> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="insights-tab" href="/trimstray/nginx-admins-handbook/pulse" data-tab-item="i5insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /trimstray/nginx-admins-handbook/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Insights","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> <span data-content="Insights">Insights</span> <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> </ul> <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 pr-md-4 pr-lg-5 right-0"> <action-menu data-select-variant="none" data-view-component="true"> <focus-group direction="vertical" mnemonics retain> <button id="action-menu-cefc6c2a-f1d9-4b26-8588-0e6eb7b39c97-button" popovertarget="action-menu-cefc6c2a-f1d9-4b26-8588-0e6eb7b39c97-overlay" aria-controls="action-menu-cefc6c2a-f1d9-4b26-8588-0e6eb7b39c97-list" aria-haspopup="true" aria-labelledby="tooltip-3d35ba2c-a2db-4238-b6ee-82276977df33" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual"> <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path> </svg> </button><tool-tip id="tooltip-3d35ba2c-a2db-4238-b6ee-82276977df33" for="action-menu-cefc6c2a-f1d9-4b26-8588-0e6eb7b39c97-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip> <anchored-position data-target="action-menu.overlay" id="action-menu-cefc6c2a-f1d9-4b26-8588-0e6eb7b39c97-overlay" anchor="action-menu-cefc6c2a-f1d9-4b26-8588-0e6eb7b39c97-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true"> <div data-view-component="true" class="Overlay Overlay--size-auto"> <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone"> <action-list> <div data-view-component="true"> <ul aria-labelledby="action-menu-cefc6c2a-f1d9-4b26-8588-0e6eb7b39c97-button" id="action-menu-cefc6c2a-f1d9-4b26-8588-0e6eb7b39c97-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap"> <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-3337e481-fadb-4482-b4d0-598ba94b034a" href="/trimstray/nginx-admins-handbook" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Code </span> </a> </li> <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-ce43bb6e-41d0-4157-87e7-e16c9e9762e9" href="/trimstray/nginx-admins-handbook/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Issues </span> </a> </li> <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-fb405179-6726-4776-9cab-9c3143ec576f" href="/trimstray/nginx-admins-handbook/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Pull requests </span> </a> </li> <li hidden="hidden" data-menu-item="i3actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-92cbab71-07e7-43b8-8b29-41d96a23c2d5" href="/trimstray/nginx-admins-handbook/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Actions </span> </a> </li> <li hidden="hidden" data-menu-item="i4security-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-18c6464b-b7e0-4db9-84de-bb5bc6cf161e" href="/trimstray/nginx-admins-handbook/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Security </span> </a> </li> <li hidden="hidden" data-menu-item="i5insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-31502c7e-d3b7-4415-9b98-947f4fafdd59" href="/trimstray/nginx-admins-handbook/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Insights </span> </a> </li> </ul> </div></action-list> </div> </div></anchored-position> </focus-group> </action-menu></div> </nav> </div> <turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class=""> <div id="repo-content-pjax-container" class="repository-content " > <h1 class='sr-only'>trimstray/nginx-admins-handbook</h1> <div class="clearfix container-xl px-md-4 px-lg-5 px-3"> <div> <div style="max-width: 100%" data-view-component="true" class="Layout Layout--flowRow-until-md react-repos-overview-margin Layout--sidebarPosition-end Layout--sidebarPosition-flowRow-end"> <div data-view-component="true" class="Layout-main"> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_dompurify_dist_purify_es_mjs-dd1d3ea6a436.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryObserver_js-node_modules_tanstack_-defd52-843b41414e0e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_aria-live_aria-live_ts-ui_packages_history_history_ts-ui_packages_promise-with-re-01dc80-134579ff449f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_paths_index_ts-3adbcf6faa83.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ref-selector_RefSelector_tsx-7496afc3784d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_commit-attribution_index_ts-ui_packages_commit-checks-status_index_ts-ui_packages-7094d4-b869a469ca5e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_hydro-analytics_hydro-analytics_ts-ui_packages_verified-fetch_verified-fetch_ts-u-4672d1-96a19eaeffb7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_use-canonical-object_ts-ui_packages_code-view-shared_hooks-d63960-3a5579c864b4.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repos-overview-fa360a7b1b46.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.8157a56b30ae88a1b356.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repos-overview.0ee7cac3ab511a65d9f9.module.css" /> <react-partial partial-name="repos-overview" data-ssr="true" data-attempted-ssr="true" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"initialPayload":{"allShortcutsEnabled":false,"path":"/","repo":{"id":167966270,"defaultBranch":"master","name":"nginx-admins-handbook","ownerLogin":"trimstray","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2019-01-28T13:24:15.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/31127917?v=4","public":true,"private":false,"isOrgOwned":false},"currentUser":null,"refInfo":{"name":"master","listCacheKey":"v0:1634756146.2137752","canEdit":false,"refType":"branch","currentOid":"5aea1f81a2fd7bd505af82cfebbdb5ac8526ff2d"},"tree":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"doc","path":"doc","contentType":"directory"},{"name":"lib","path":"lib","contentType":"directory"},{"name":"static/img","path":"static/img","contentType":"directory","hasSimplifiedPath":true},{"name":"LICENSE.md","path":"LICENSE.md","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":null,"totalCount":6,"showBranchInfobar":false},"fileTree":null,"fileTreeProcessingTime":null,"foldersToFetch":[],"treeExpanded":false,"symbolsExpanded":false,"isOverview":true,"overview":{"banners":{"shouldRecommendReadme":false,"isPersonalRepo":false,"showUseActionBanner":false,"actionSlug":null,"actionId":null,"showProtectBranchBanner":false,"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_repo","releasePath":"/trimstray/nginx-admins-handbook/releases/new?marketplace=true","showPublishActionBanner":false},"interactionLimitBanner":null,"showInvitationBanner":false,"inviterName":null,"actionsMigrationBannerInfo":{"releaseTags":[],"showImmutableActionsMigrationBanner":false,"initialMigrationStatus":null}},"codeButton":{"contactPath":"/contact","isEnterprise":false,"local":{"protocolInfo":{"httpAvailable":true,"sshAvailable":null,"httpUrl":"https://github.com/trimstray/nginx-admins-handbook.git","showCloneWarning":null,"sshUrl":null,"sshCertificatesRequired":null,"sshCertificatesAvailable":null,"ghCliUrl":"gh repo clone trimstray/nginx-admins-handbook","defaultProtocol":"http","newSshKeyUrl":"/settings/ssh/new","setProtocolPath":"/users/set_protocol"},"platformInfo":{"cloneUrl":"https://desktop.github.com","showVisualStudioCloneButton":false,"visualStudioCloneUrl":"https://windows.github.com","showXcodeCloneButton":false,"xcodeCloneUrl":"xcode://clone?repo=https%3A%2F%2Fgithub.com%2Ftrimstray%2Fnginx-admins-handbook","zipballUrl":"/trimstray/nginx-admins-handbook/archive/refs/heads/master.zip"}},"newCodespacePath":"/codespaces/new?hide_repo_select=true\u0026repo=167966270"},"popovers":{"rename":null,"renamedParentRepo":null},"commitCount":"1,338","overviewFiles":[{"displayName":"README.md","repoName":"nginx-admins-handbook","refName":"master","path":"README.md","preferredFileType":"readme","tabName":"README","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv align=\"center\" dir=\"auto\"\u003e\n \u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNginx Admin's Handbook\u003c/h1\u003e\u003ca id=\"user-content-nginx-admins-handbook\" class=\"anchor\" aria-label=\"Permalink: Nginx Admin's Handbook\" href=\"#nginx-admins-handbook\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n \u003cb\u003e\u003ccode\u003eMy notes on NGINX administration basics, tips \u0026amp; tricks, caveats, and gotchas.\u003c/code\u003e\u003c/b\u003e\n\u003c/div\u003e\n\u003cbr\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca href=\"https://www.hostingadvice.com/how-to/nginx-vs-apache/\" rel=\"nofollow\"\u003e\n \u003cimg src=\"https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/nginx_meme.png\" alt=\"Meme\" style=\"max-width: 100%;\"\u003e\n \u003c/a\u003e\n\u003c/p\u003e\n\u003cbr\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003csup\u003e\n \u003ci\u003e\n Hi-diddle-diddle, he played on his\u003cbr\u003e\n fiddle and danced with lady pigs.\u003cbr\u003e\n Number three said, \"Nicks on tricks!\u003cbr\u003e\n I'll build my house with \u003cb\u003eEN-jin-EKS\u003c/b\u003e!\".\u003cbr\u003e\n \u003ca href=\"https://g.co/kgs/HCcQVz\" rel=\"nofollow\"\u003eThe Three Little Pigs: Who's Afraid of the Big Bad Wolf?\u003c/a\u003e\n \u003c/i\u003e\n \u003c/sup\u003e\n\u003c/p\u003e\n\u003cbr\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca href=\"https://github.com/trimstray/nginx-admins-handbook/pulls\"\u003e\n \u003cimg src=\"https://camo.githubusercontent.com/fbf99ae78847941f3b58690e70c3068e9954eb6997437fdd37f38988e102927d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d627269676874677265656e2e7376673f6c6f6e6743616368653d74727565\" alt=\"Pull Requests\" data-canonical-src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?longCache=true\" style=\"max-width: 100%;\"\u003e\n \u003c/a\u003e\n \u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/LICENSE.md\"\u003e\n \u003cimg src=\"https://camo.githubusercontent.com/996d6bf9a5ed2958d53e90aad9e4d2425848f511a0efb51fef7efa68d93e4dc9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d6c69676874677265792e7376673f6c6f6e6743616368653d74727565\" alt=\"MIT License\" data-canonical-src=\"https://img.shields.io/badge/License-MIT-lightgrey.svg?longCache=true\" style=\"max-width: 100%;\"\u003e\n \u003c/a\u003e\n\u003c/p\u003e\n\u003cbr\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTable of Contents\u003c/h1\u003e\u003ca id=\"user-content-table-of-contents\" class=\"anchor\" aria-label=\"Permalink: Table of Contents\" href=\"#table-of-contents\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"#introduction\"\u003eIntroduction\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-introduction\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#prologue\"\u003ePrologue\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#why-i-created-this-handbook\"\u003eWhy I created this handbook\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#who-this-handbook-is-for\"\u003eWho this handbook is for\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#before-you-start\"\u003eBefore you start\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#contributing--support\"\u003eContributing \u0026amp; Support\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#rss-feed--updates\"\u003eRSS Feed \u0026amp; Updates\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#checklist-to-rule-them-all\"\u003eChecklist to rule them all\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"#bonus-stuff\"\u003eBonus Stuff\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-bonus-stuff\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#configuration-reports\"\u003eConfiguration reports\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#ssl-labs\"\u003eSSL Labs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#mozilla-observatory\"\u003eMozilla Observatory\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#printable-hardening-cheatsheets\"\u003ePrintable hardening cheatsheets\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#fully-automatic-installation\"\u003eFully automatic installation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#static-error-pages-generator\"\u003eStatic error pages generator\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#server-names-parser\"\u003eServer names parser\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"#books\"\u003eBooks\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-books\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#nginx-essentials\"\u003eNginx Essentials\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nginx-cookbook\"\u003eNginx Cookbook\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nginx-http-server\"\u003eNginx HTTP Server\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nginx-high-performance\"\u003eNginx High Performance\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#mastering-nginx\"\u003eMastering Nginx\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#modsecurity-30-and-nginx-quick-start-guide\"\u003eModSecurity 3.0 and NGINX: Quick Start Guide\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#cisco-ace-to-nginx-migration-guide\"\u003eCisco ACE to NGINX: Migration Guide\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"#external-resources\"\u003eExternal Resources\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-external-resources\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#nginx-official\"\u003eNginx official\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nginx-distributions\"\u003eNginx distributions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#comparison-reviews\"\u003eComparison reviews\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#cheatsheets--references\"\u003eCheatsheets \u0026amp; References\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#performance--hardening\"\u003ePerformance \u0026amp; Hardening\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#presentations--videos\"\u003ePresentations \u0026amp; Videos\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#playgrounds\"\u003ePlaygrounds\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#config-generators\"\u003eConfig generators\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#config-parsers\"\u003eConfig parsers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#config-managers\"\u003eConfig managers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#static-analyzers\"\u003eStatic analyzers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#log-analyzers\"\u003eLog analyzers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#performance-analyzers\"\u003ePerformance analyzers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#builder-tools\"\u003eBuilder tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#benchmarking-tools\"\u003eBenchmarking tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#debugging-tools\"\u003eDebugging tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#security--web-testing-tools\"\u003eSecurity \u0026amp; Web testing tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#development\"\u003eDevelopment\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#online--web-tools\"\u003eOnline \u0026amp; Web tools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#other-stuff\"\u003eOther stuff\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"#whats-next\"\u003eWhat's next?\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eOther chapters\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-basics\"\u003eHTTP Basics\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-http-basics\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#introduction-1\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#features-and-architecture\"\u003eFeatures and architecture\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http2\"\u003eHTTP/2\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#how-to-debug-http2\"\u003eHow to debug HTTP/2?\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http3\"\u003eHTTP/3\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#uri-vs-url\"\u003eURI vs URL\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#connection-vs-request\"\u003eConnection vs request\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-headers\"\u003eHTTP Headers\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#header-compression\"\u003eHeader compression\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-methods\"\u003eHTTP Methods\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#request\"\u003eRequest\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#request-line\"\u003eRequest line\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#methods\"\u003eMethods\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#request-uri\"\u003eRequest URI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-version\"\u003eHTTP version\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#request-header-fields\"\u003eRequest header fields\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#message-body\"\u003eMessage body\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#generate-requests\"\u003eGenerate requests\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#response\"\u003eResponse\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#status-line\"\u003eStatus line\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-version-1\"\u003eHTTP version\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#status-codes-and-reason-phrase\"\u003eStatus codes and reason phrase\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#response-header-fields\"\u003eResponse header fields\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#message-body-1\"\u003eMessage body\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-client\"\u003eHTTP client\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#ip-address-shortcuts\"\u003eIP address shortcuts\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#back-end-web-architecture\"\u003eBack-End web architecture\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#useful-video-resources\"\u003eUseful video resources\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#ssltls-basics\"\u003eSSL/TLS Basics\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-ssltls-basics\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#introduction-2\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#tls-versions\"\u003eTLS versions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#tls-handshake\"\u003eTLS handshake\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#in-which-layer-is-tls-situated-within-the-tcpip-stack\"\u003eIn which layer is TLS situated within the TCP/IP stack?\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#rsa-and-ecc-keyscertificates\"\u003eRSA and ECC keys/certificates\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#cipher-suites\"\u003eCipher suites\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#authenticated-encryption-aead-cipher-suites\"\u003eAuthenticated encryption (AEAD) cipher suites\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#why-cipher-suites-are-important\"\u003eWhy cipher suites are important?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#what-does-insecure-weak-secure-and-recommended-mean\"\u003eWhat does insecure, weak, secure and recommended mean?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#nginx-and-tls-13-cipher-suites\"\u003eNGINX and TLS 1.3 Cipher Suites\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#diffie-hellman-key-exchange\"\u003eDiffie-Hellman key exchange\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#what-exactly-is-the-purpose-of-these-dh-parameters\"\u003eWhat exactly is the purpose of these DH Parameters?\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#certificates\"\u003eCertificates\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#chain-of-trust\"\u003eChain of Trust\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#what-is-the-main-purpose-of-the-intermediate-ca\"\u003eWhat is the main purpose of the Intermediate CA?\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#single-domain\"\u003eSingle-domain\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#multi-domain\"\u003eMulti-domain\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#wildcard\"\u003eWildcard\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#wildcard-ssl-doesnt-handle-root-domain\"\u003eWildcard SSL doesn't handle root domain?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#https-with-self-signed-certificate-vs-http\"\u003eHTTPS with self-signed certificate vs HTTP\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#tls-server-name-indication\"\u003eTLS Server Name Indication\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#verify-your-ssl-tls--ciphers-implementation\"\u003eVerify your SSL, TLS \u0026amp; Ciphers implementation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#useful-video-resources\"\u003eUseful video resources\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#nginx-basics\"\u003eNGINX Basics\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-nginx-basics\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#directories-and-files\"\u003eDirectories and files\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#commands\"\u003eCommands\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#processes\"\u003eProcesses\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#cpu-pinning\"\u003eCPU pinning\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#shutdown-of-worker-processes\"\u003eShutdown of worker processes\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#configuration-syntax\"\u003eConfiguration syntax\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#comments\"\u003eComments\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#end-of-lines\"\u003eEnd of lines\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#variables-strings-and-quotes\"\u003eVariables, Strings, and Quotes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#directives-blocks-and-contexts\"\u003eDirectives, Blocks, and Contexts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#external-files\"\u003eExternal files\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#measurement-units\"\u003eMeasurement units\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#regular-expressions-with-pcre\"\u003eRegular expressions with PCRE\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#enable-syntax-highlighting\"\u003eEnable syntax highlighting\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#connection-processing\"\u003eConnection processing\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#event-driven-architecture\"\u003eEvent-Driven architecture\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#multiple-processes\"\u003eMultiple processes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#simultaneous-connections\"\u003eSimultaneous connections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#http-keep-alive-connections\"\u003eHTTP Keep-Alive connections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#sendfile-tcp_nodelay-and-tcp_nopush\"\u003esendfile, tcp_nodelay, and tcp_nopush\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#request-processing-stages\"\u003eRequest processing stages\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#server-blocks-logic\"\u003eServer blocks logic\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#handle-incoming-connections\"\u003eHandle incoming connections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#matching-location\"\u003eMatching location\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#rewrite-vs-return\"\u003erewrite vs return\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#url-redirections\"\u003eURL redirections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#try_files-directive\"\u003etry_files directive\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#if-break-and-set\"\u003eif, break, and set\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#root-vs-alias\"\u003eroot vs alias\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#internal-directive\"\u003einternal directive\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#external-and-internal-redirects\"\u003eExternal and internal redirects\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#allow-and-deny\"\u003eallow and deny\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#uri-vs-request_uri\"\u003euri vs request_uri\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#compression-and-decompression\"\u003eCompression and decompression\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#what-is-the-best-nginx-compression-gzip-level\"\u003eWhat is the best NGINX compression gzip level?\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#hash-tables\"\u003eHash tables\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#server-names-hash-table\"\u003eServer names hash table\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#log-files\"\u003eLog files\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#conditional-logging\"\u003eConditional logging\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#manually-log-rotation\"\u003eManually log rotation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#error-log-severity-levels\"\u003eError log severity levels\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#how-to-log-the-start-time-of-a-request\"\u003eHow to log the start time of a request?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#how-to-log-the-http-request-body\"\u003eHow to log the HTTP request body?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#nginx-upstream-variables-returns-2-values\"\u003eNGINX upstream variables returns 2 values\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#reverse-proxy\"\u003eReverse proxy\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#passing-requests\"\u003ePassing requests\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#trailing-slashes\"\u003eTrailing slashes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#passing-headers-to-the-backend\"\u003ePassing headers to the backend\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#importance-of-the-host-header\"\u003eImportance of the Host header\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#redirects-and-x-forwarded-proto\"\u003eRedirects and X-Forwarded-Proto\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#a-warning-about-the-x-forwarded-for\"\u003eA warning about the X-Forwarded-For\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#improve-extensibility-with-forwarded\"\u003eImprove extensibility with Forwarded\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#response-headers\"\u003eResponse headers\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#load-balancing-algorithms\"\u003eLoad balancing algorithms\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#backend-parameters\"\u003eBackend parameters\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#upstream-servers-with-ssl\"\u003eUpstream servers with SSL\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#round-robin\"\u003eRound Robin\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#weighted-round-robin\"\u003eWeighted Round Robin\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#least-connections\"\u003eLeast Connections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#weighted-least-connections\"\u003eWeighted Least Connections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#ip-hash\"\u003eIP Hash\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#generic-hash\"\u003eGeneric Hash\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#other-methods\"\u003eOther methods\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#rate-limiting\"\u003eRate limiting\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#variables\"\u003eVariables\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#directives-keys-and-zones\"\u003eDirectives, keys, and zones\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#burst-and-nodelay-parameters\"\u003eBurst and nodelay parameters\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#naxsi-web-application-firewall\"\u003eNAXSI Web Application Firewall\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#owasp-modsecurity-core-rule-set-crs\"\u003eOWASP ModSecurity Core Rule Set (CRS)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#core-modules\"\u003eCore modules\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#ngx_http_geo_module\"\u003engx_http_geo_module\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#3rd-party-modules\"\u003e3rd party modules\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#ngx_set_misc\"\u003engx_set_misc\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#ngx_http_geoip_module\"\u003engx_http_geoip_module\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#helpers\"\u003eHelpers\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-helpers\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installing-from-prebuilt-packages\"\u003eInstalling from prebuilt packages\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#rhel7-or-centos-7\"\u003eRHEL7 or CentOS 7\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#debian-or-ubuntu\"\u003eDebian or Ubuntu\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#freebsd\"\u003eFreeBSD\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installing-from-source\"\u003eInstalling from source\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#automatic-installation-on-rheldebianbsd\"\u003eAutomatic installation on RHEL/Debian/BSD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#nginx-package\"\u003eNginx package\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#dependencies\"\u003eDependencies\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#patches\"\u003ePatches\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#3rd-party-modules\"\u003e3rd party modules\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#cconfigure-options\"\u003eConfigure options\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#compiler-and-linker\"\u003eCompiler and linker\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#debugging-symbols\"\u003eDebugging Symbols\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#systemtap\"\u003eSystemTap\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#stapxx\"\u003estapxx\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installation-nginx-on-centos-7\"\u003eInstallation Nginx on CentOS 7\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#pre-installation-tasks\"\u003ePre installation tasks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#dependencies\"\u003eDependencies\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#get-nginx-sources\"\u003eGet Nginx sources\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#download-3rd-party-modules\"\u003eDownload 3rd party modules\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#build-nginx\"\u003eBuild Nginx\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#post-installation-tasks\"\u003ePost installation tasks\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installation-openresty-on-centos-7\"\u003eInstallation OpenResty on CentOS 7\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installation-tengine-on-ubuntu-1804\"\u003eInstallation Tengine on Ubuntu 18.04\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installation-nginx-on-freebsd-113\"\u003eInstallation Nginx on FreeBSD 11.3\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installation-nginx-on-freebsd-113-from-ports\"\u003eInstallation Nginx on FreeBSD 11.3 (from ports)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-configuration\"\u003eAnalyse configuration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#monitoring\"\u003eMonitoring\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#goaccess\"\u003eGoAccess\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#build-and-install\"\u003eBuild and install\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-log-file-and-enable-all-recorded-statistics\"\u003eAnalyse log file and enable all recorded statistics\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-compressed-log-file\"\u003eAnalyse compressed log file\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-log-file-remotely\"\u003eAnalyse log file remotely\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-log-file-and-generate-html-report\"\u003eAnalyse log file and generate html report\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#ngxtop\"\u003eNgxtop\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-log-file\"\u003eAnalyse log file\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-log-file-and-print-requests-with-4xx-and-5xx\"\u003eAnalyse log file and print requests with 4xx and 5xx\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-log-file-remotely-1\"\u003eAnalyse log file remotely\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing\"\u003eTesting\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#build-openssl-102-chacha-version\"\u003eBuild OpenSSL 1.0.2-chacha version\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#send-request-and-show-response-headers\"\u003eSend request and show response headers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#send-request-with-http-method-user-agent-follow-redirects-and-show-response-headers\"\u003eSend request with http method, user-agent, follow redirects and show response headers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#send-multiple-requests\"\u003eSend multiple requests\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-ssl-connection\"\u003eTesting SSL connection\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-ssl-connection-debug-mode\"\u003eTesting SSL connection (debug mode)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-ssl-connection-with-sni-support\"\u003eTesting SSL connection with SNI support\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-ssl-connection-with-specific-ssl-version\"\u003eTesting SSL connection with specific SSL version\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-ssl-connection-with-specific-cipher\"\u003eTesting SSL connection with specific cipher\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-ocsp-stapling\"\u003eTesting OCSP Stapling\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#verify-0-rtt\"\u003eVerify 0-RTT\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-scsv\"\u003eTesting SCSV\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#load-testing-with-apachebench-ab\"\u003eLoad testing with ApacheBench (ab)\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#standard-test\"\u003eStandard test\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#test-with-keep-alive-header\"\u003eTest with Keep-Alive header\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#load-testing-with-wrk2\"\u003eLoad testing with wrk2\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#standard-scenarios\"\u003eStandard scenarios\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#post-call-with-lua\"\u003ePOST call (with Lua)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#random-paths-with-lua\"\u003eRandom paths (with Lua)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#multiple-paths-with-lua\"\u003eMultiple paths (with Lua)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#random-server-address-to-each-thread-with-lua\"\u003eRandom server address to each thread (with Lua)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#multiple-json-requests-with-lua\"\u003eMultiple json requests (with Lua)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#debug-mode-with-lua\"\u003eDebug mode (with Lua)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-data-pass-to-and-from-the-threads\"\u003eAnalyse data pass to and from the threads\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#parsing-wrk-result-and-generate-report\"\u003eParsing wrk result and generate report\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#load-testing-with-locust\"\u003eLoad testing with locust\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#multiple-paths\"\u003eMultiple paths\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#multiple-paths-with-different-user-sessions\"\u003eMultiple paths with different user sessions\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#tcp-syn-flood-denial-of-service-attack\"\u003eTCP SYN flood Denial of Service attack\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#tcp-syn-flood-denial-of-service-attack\"\u003eHTTP Denial of Service attack\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#debugging\"\u003eDebugging\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-information-about-nginx-processes\"\u003eShow information about processes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-memoryusage\"\u003eCheck memory usage\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-open-files\"\u003eShow open files\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-segmentation-fault-messages\"\u003eCheck segmentation fault messages\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#dump-configuration\"\u003eDump configuration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#get-the-list-of-configure-arguments\"\u003eGet the list of configure arguments\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-if-the-module-has-been-compiled\"\u003eCheck if the module has been compiled\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-accessed-ip-addresses\"\u003eShow the most accessed IP addresses\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-accessed-ip-addresses-ip-and-url\"\u003eShow the most accessed IP addresses (ip and url)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-accessed-ip-addresses-method-code-ip-and-url\"\u003eShow the most accessed IP addresses (method, code, ip, and url)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-top-5-visitors-ip-addresses\"\u003eShow the top 5 visitors (IP addresses)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-requested-urls\"\u003eShow the most requested urls\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-requested-urls-containing-string\"\u003eShow the most requested urls containing 'string'\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-requested-urls-with-http-methods\"\u003eShow the most requested urls with http methods\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-accessed-response-codes\"\u003eShow the most accessed response codes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-web-server-log-and-show-only-2xx-http-codes\"\u003eAnalyse web server log and show only 2xx http codes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-web-server-log-and-show-only-5xx-http-codes\"\u003eAnalyse web server log and show only 5xx http codes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-requests-which-result-502-and-sort-them-by-number-per-requests-by-url\"\u003eShow requests which result 502 and sort them by number per requests by url\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-requests-which-result-404-for-php-files-and-sort-them-by-number-per-requests-by-url\"\u003eShow requests which result 404 for php files and sort them by number per requests by url\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#calculating-amount-of-http-response-codes\"\u003eCalculating amount of http response codes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#calculating-requests-per-second\"\u003eCalculating requests per second\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#calculating-requests-per-second-with-ip-addresses\"\u003eCalculating requests per second with IP addresses\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#calculating-requests-per-second-with-ip-addresses-and-urls\"\u003eCalculating requests per second with IP addresses and urls\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#get-entries-within-last-n-hours\"\u003eGet entries within last n hours\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#get-entries-between-two-timestamps-range-of-dates\"\u003eGet entries between two timestamps (range of dates)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#get-line-rates-from-web-server-log\"\u003eGet line rates from web server log\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#trace-network-traffic-for-all-nginx-processes\"\u003eTrace network traffic for all processes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#list-all-files-accessed-by-a-nginx\"\u003eList all files accessed by a NGINX\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-that-the-gzip_static-module-is-working\"\u003eCheck that the gzip_static module is working\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#which-worker-processing-current-request\"\u003eWhich worker processing current request\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#capture-only-http-packets\"\u003eCapture only http packets\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#extract-user-agent-from-the-http-packets\"\u003eExtract User Agent from the http packets\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#capture-only-http-get-and-post-packets\"\u003eCapture only http GET and POST packets\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#capture-requests-and-filter-by-source-ip-and-destination-port\"\u003eCapture requests and filter by source ip and destination port\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#capture-http-requests--responses-in-real-time-filter-by-get-head-and-save-to-a-file\"\u003eCapture HTTP requests/responses in real time, filter by GET, HEAD and save to a file\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#dump-a-processs-memory\"\u003eDump a process's memory\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#gnu-debugger-gdb\"\u003eGNU Debugger (gdb)\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#dump-configuration-from-a-running-process\"\u003eDump configuration from a running process\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-debug-log-in-memory\"\u003eShow debug log in memory\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#core-dump-backtrace\"\u003eCore dump backtrace\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#debugging-socket-leaks\"\u003eDebugging socket leaks\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#shell-aliases\"\u003eShell aliases\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#configuration-snippets\"\u003eConfiguration snippets\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#nginx-server-header-removal\"\u003eNginx server header removal\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#custom-log-formats\"\u003eCustom log formats\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#log-only-4xx5xx\"\u003eLog only 4xx/5xx\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#restricting-access-with-basic-authentication\"\u003eRestricting access with basic authentication\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#restricting-access-with-client-certificate\"\u003eRestricting access with client certificate\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#restricting-access-by-geographical-location\"\u003eRestricting access by geographical location\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#geoip-2-database\"\u003eGeoIP 2 database\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#dynamic-error-pages-with-ssi\"\u003eDynamic error pages with SSI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#blockingallowing-ip-addresses\"\u003eBlocking/allowing IP addresses\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#blocking-referrer-spam\"\u003eBlocking referrer spam\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#limiting-referrer-spam\"\u003eLimiting referrer spam\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#blocking-user-agent\"\u003eBlocking User-Agent\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#limiting-user-agent\"\u003eLimiting User-Agent\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#limiting-the-rate-of-requests-with-burst-mode\"\u003eLimiting the rate of requests with burst mode\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#limiting-the-rate-of-requests-with-burst-mode-and-nodelay\"\u003eLimiting the rate of requests with burst mode and nodelay\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#limiting-the-rate-of-requests-per-ip-with-geo-and-map\"\u003eLimiting the rate of requests per IP with geo and map\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#limiting-the-number-of-connections\"\u003eLimiting the number of connections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#using-trailing-slashes\"\u003eUsing trailing slashes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#properly-redirect-all-http-requests-to-https\"\u003eProperly redirect all HTTP requests to HTTPS\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#adding-and-removing-the-www-prefix\"\u003eAdding and removing the www prefix\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#proxyrewrite-and-keep-the-original-url\"\u003eProxy/rewrite and keep the original URL\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#proxyrewrite-and-keep-the-part-of-original-url\"\u003eProxy/rewrite and keep the part of original URL\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#proxyrewrite-without-changing-the-original-url-in-browser\"\u003eProxy/rewrite without changing the original URL (in browser)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#modify-301302-response-body\"\u003eModify 301/302 response body\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#redirect-post-request-with-payload-to-external-endpoint\"\u003eRedirect POST request with payload to external endpoint\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#route-to-different-backends-based-on-HTTP-method\"\u003eRoute to different backends based on HTTP method\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#allow-multiple-cross-domains-using-the-cors-headers\"\u003eAllow multiple cross-domains using the CORS headers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#set-correct-scheme-passed-in-x-forwarded-proto\"\u003eSet correct scheme passed in X-Forwarded-Proto\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#other-snippets\"\u003eOther snippets\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#recreate-base-directory\"\u003eRecreate base directory\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#create-a-temporary-static-backend\"\u003eCreate a temporary static backend\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#create-a-temporary-static-backend-with-ssl-support\"\u003eCreate a temporary static backend with SSL support\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-password-file-with-htpasswd-command\"\u003eGenerate password file with htpasswd command\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-private-key-without-passphrase\"\u003eGenerate private key without passphrase\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-private-key-with-passphrase\"\u003eGenerate private key with passphrase\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#remove-passphrase-from-private-key\"\u003eRemove passphrase from private key\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#encrypt-existing-private-key-with-a-passphrase\"\u003eEncrypt existing private key with a passphrase\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-csr\"\u003eGenerate CSR\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-csr-metadata-from-existing-certificate\"\u003eGenerate CSR (metadata from existing certificate)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-csr-with--config-param\"\u003eGenerate CSR with -config param\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-private-key-and-csr\"\u003eGenerate private key and CSR\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#list-available-ec-curves\"\u003eList available EC curves\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#print-ecdsa-private-and-public-keys\"\u003ePrint ECDSA private and public keys\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-ecdsa-private-key\"\u003eGenerate ECDSA private key\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-private-key-and-csr-ecc\"\u003eGenerate private key and CSR (ECC)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-self-signed-certificate\"\u003eGenerate self-signed certificate\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-self-signed-certificate-from-existing-private-key\"\u003eGenerate self-signed certificate from existing private key\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-self-signed-certificate-from-existing-private-key-and-csr\"\u003eGenerate self-signed certificate from existing private key and csr\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-multidomain-certificate-certbot\"\u003eGenerate multidomain certificate (Certbot)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-wildcard-certificate-certbot\"\u003eGenerate wildcard certificate (Certbot)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-certificate-with-4096-bit-private-key-certbot\"\u003eGenerate certificate with 4096 bit private key (Certbot)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-dh-public-parameters\"\u003eGenerate DH public parameters\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#display-dh-public-parameters\"\u003eDisplay DH public parameters\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#extract-private-key-from-pfx\"\u003eExtract private key from pfx\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#extract-private-key-and-certs-from-pfx\"\u003eExtract private key and certs from pfx\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#extract-certs-from-p7b\"\u003eExtract certs from p7b\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#convert-der-to-pem\"\u003eConvert DER to PEM\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#convert-pem-to-der\"\u003eConvert PEM to DER\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#verification-of-the-certificates-supported-purposes\"\u003eVerification of the certificate's supported purposes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-private-key\"\u003eCheck private key\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#verification-of-the-private-key\"\u003eVerification of the private key\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#get-public-key-from-private-key\"\u003eGet public key from private key\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#verification-of-the-public-key\"\u003eVerification of the public key\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#verification-of-the-certificate\"\u003eVerification of the certificate\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#verification-of-the-csr\"\u003eVerification of the CSR\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-the-private-key-and-the-certificate-are-match\"\u003eCheck the private key and the certificate are match\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-the-private-key-and-the-csr-are-match\"\u003eCheck the private key and the CSR are match\u003c/a\u003e\n\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#tlsv13-and-ccm-ciphers\"\u003eTLSv1.3 and CCM ciphers\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#base-rules\"\u003eBase Rules (16)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-base-rules\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-organising-nginx-configuration\"\u003eOrganising Nginx configuration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-format-prettify-and-indent-your-nginx-code\"\u003eFormat, prettify and indent your Nginx code\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-reload-option-to-change-configurations-on-the-fly\"\u003eUse reload option to change configurations on the fly\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-separate-listen-directives-for-80-and-443-ports\"\u003eSeparate listen directives for 80 and 443 ports\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-define-the-listen-directives-with-addressport-pair\"\u003eDefine the listen directives with address:port pair\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-processing-requests-with-undefined-server-names\"\u003ePrevent processing requests with undefined server names\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-never-use-a-hostname-in-a-listen-or-upstream-directives\"\u003eNever use a hostname in a listen or upstream directives\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-the-http-headers-with-add_header-and-proxy__header-directives-properly\"\u003eSet the HTTP headers with add_header and proxy_*_header directives properly\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-only-one-ssl-config-for-the-listen-directive\"\u003eUse only one SSL config for the listen directive\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-geomap-modules-instead-of-allowdeny\"\u003eUse geo/map modules instead of allow/deny\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-map-all-the-things\"\u003eMap all the things...\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-global-root-directory-for-unmatched-locations\"\u003eSet global root directory for unmatched locations\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-return-directive-for-url-redirection-301-302\"\u003eUse return directive for URL redirection (301, 302)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-configure-log-rotation-policy\"\u003eConfigure log rotation policy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-simple-custom-error-pages\"\u003eUse simple custom error pages\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-dont-duplicate-index-directive-use-it-only-in-the-http-block\"\u003eDon't duplicate index directive, use it only in the http block\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#debugging\"\u003eDebugging (5)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-debugging\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-custom-log-formats\"\u003eUse custom log formats\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-debug-mode-to-track-down-unexpected-behaviour\"\u003eUse debug mode to track down unexpected behaviour\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-improve-debugging-by-disable-daemon-master-process-and-all-workers-except-one\"\u003eImprove debugging by disable daemon, master process, and all workers except one\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-core-dumps-to-figure-out-why-nginx-keep-crashing\"\u003eUse core dumps to figure out why NGINX keep crashing\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-mirror-module-to-copy-requests-to-another-backend\"\u003eUse mirror module to copy requests to another backend\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#performance\"\u003ePerformance (13)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-performance\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-adjust-worker-processes\"\u003eAdjust worker processes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-http2\"\u003eUse HTTP/2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-maintaining-ssl-sessions\"\u003eMaintaining SSL sessions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-ocsp-stapling\"\u003eEnable OCSP Stapling\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-exact-names-in-a-server_name-directive-if-possible\"\u003eUse exact names in a server_name directive if possible\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-avoid-checks-server_name-with-if-directive\"\u003eAvoid checks server_name with if directive\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-request_uri-to-avoid-using-regular-expressions\"\u003eUse $request_uri to avoid using regular expressions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-try_files-directive-to-ensure-a-file-exists\"\u003eUse try_files directive to ensure a file exists\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-return-directive-instead-of-rewrite-for-redirects\"\u003eUse return directive instead of rewrite for redirects\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-pcre-jit-to-speed-up-processing-of-regular-expressions\"\u003eEnable PCRE JIT to speed up processing of regular expressions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-activate-the-cache-for-connections-to-upstream-servers\"\u003eActivate the cache for connections to upstream servers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-make-an-exact-location-match-to-speed-up-the-selection-process\"\u003eMake an exact location match to speed up the selection process\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-limit_conn-to-improve-limiting-the-download-speed\"\u003eUse limit_conn to improve limiting the download speed\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#hardening\"\u003eHardening (31)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-hardening\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-always-keep-nginx-up-to-date\"\u003eAlways keep NGINX up-to-date\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-run-as-an-unprivileged-user\"\u003eRun as an unprivileged user\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-disable-unnecessary-modules\"\u003eDisable unnecessary modules\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-protect-sensitive-resources\"\u003eProtect sensitive resources\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-take-care-about-your-acl-rules\"\u003eTake care about your ACL rules\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-hide-nginx-version-number\"\u003eHide Nginx version number\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-hide-nginx-server-signature\"\u003eHide Nginx server signature\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-hide-upstream-proxy-headers\"\u003eHide upstream proxy headers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-remove-support-for-legacy-and-risky-http-request-headers\"\u003eRemove support for legacy and risky HTTP request headers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-only-the-latest-supported-openssl-version\"\u003eUse only the latest supported OpenSSL version\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-force-all-connections-over-tls\"\u003eForce all connections over TLS\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-min-2048-bit-for-rsa-and-256-bit-for-ecc\"\u003eUse min. 2048-bit for RSA and 256-bit for ECC\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-keep-only-tls-13-and-tls-12\"\u003eKeep only TLS 1.3 and TLS 1.2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-only-strong-ciphers\"\u003eUse only strong ciphers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-more-secure-ecdh-curve\"\u003eUse more secure ECDH Curve\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-strong-key-exchange-with-perfect-forward-secrecy\"\u003eUse strong Key Exchange with Perfect Forward Secrecy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-replay-attacks-on-zero-round-trip-time\"\u003ePrevent Replay Attacks on Zero Round-Trip Time\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-defend-against-the-beast-attack\"\u003eDefend against the BEAST attack\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-mitigation-of-crimebreach-attacks\"\u003eMitigation of CRIME/BREACH attacks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-http-strict-transport-security\"\u003eEnable HTTP Strict Transport Security\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-reduce-xss-risks-content-security-policy\"\u003eReduce XSS risks (Content-Security-Policy)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-control-the-behaviour-of-the-referer-header-referrer-policy\"\u003eControl the behaviour of the Referer header (Referrer-Policy)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-provide-clickjacking-protection-x-frame-options\"\u003eProvide clickjacking protection (X-Frame-Options)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-some-categories-of-xss-attacks-x-xss-protection\"\u003ePrevent some categories of XSS attacks (X-XSS-Protection)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-sniff-mimetype-middleware-x-content-type-options\"\u003ePrevent Sniff Mimetype middleware (X-Content-Type-Options)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-deny-the-use-of-browser-features-feature-policy\"\u003eDeny the use of browser features (Feature-Policy)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-reject-unsafe-http-methods\"\u003eReject unsafe HTTP methods\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-caching-of-sensitive-data\"\u003ePrevent caching of sensitive data\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-limit-concurrent-connections\"\u003eLimit concurrent connections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-control-buffer-overflow-attacks\"\u003eControl Buffer Overflow attacks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-mitigating-slow-http-dos-attacks-closing-slow-connections\"\u003eMitigating Slow HTTP DoS attacks (Closing Slow Connections)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#reverse-proxy\"\u003eReverse Proxy (8)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-reverse-proxy\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-pass-directive-compatible-with-backend-protocol\"\u003eUse pass directive compatible with backend protocol\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-be-careful-with-trailing-slashes-in-proxy_pass-directive\"\u003eBe careful with trailing slashes in proxy_pass directive\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-and-pass-host-header-only-with-host-variable\"\u003eSet and pass Host header only with $host variable\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-properly-values-of-the-x-forwarded-for-header\"\u003eSet properly values of the X-Forwarded-For header\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-dont-use-x-forwarded-proto-with-scheme-behind-reverse-proxy\"\u003eDon't use X-Forwarded-Proto with $scheme behind reverse proxy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-always-pass-host-x-real-ip-and-x-forwarded-headers-to-the-backend\"\u003eAlways pass Host, X-Real-IP, and X-Forwarded headers to the backend\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-custom-headers-without-x--prefix\"\u003eUse custom headers without X- prefix\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-always-use-request_uri-instead-of-uri-in-proxy_pass\"\u003eAlways use $request_uri instead of $uri in proxy_pass\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#load-balancing\"\u003eLoad Balancing (2)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-load-balancing\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-tweak-passive-health-checks\"\u003eTweak passive health checks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-dont-disable-backends-by-comments-use-down-parameter\"\u003eDon't disable backends by comments, use down parameter\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#others\"\u003eOthers (4)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-others\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-the-certificate-chain-correctly\"\u003eSet the certificate chain correctly\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-dns-caa-policy\"\u003eEnable DNS CAA Policy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-define-security-policies-with-securitytxt\"\u003eDefine security policies with security.txt\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-tcpdump-to-monitor-http-traffic\"\u003eUse tcpdump to diagnose and troubleshoot the HTTP issues\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#configuration-examples\"\u003eConfiguration Examples\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-configuration-examples\"\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#reverse-proxy\"\u003eReverse Proxy\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#configuration\"\u003eConfiguration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#import-configuration\"\u003eImport configuration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#set-bind-ip-address\"\u003eSet bind IP address\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#set-your-domain-name\"\u003eSet your domain name\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#regenerate-private-keys-and-certs\"\u003eRegenerate private keys and certs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#update-modules-list\"\u003eUpdate modules list\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#generating-the-necessary-error-pages\"\u003eGenerating the necessary error pages\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#add-new-domain\"\u003eAdd new domain\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#test-your-configuration\"\u003eTest your configuration\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eIntroduction\u003c/h1\u003e\u003ca id=\"user-content-introduction\" class=\"anchor\" aria-label=\"Permalink: Introduction\" href=\"#introduction\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cbr\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca href=\"https://www.nginx.com/\" rel=\"nofollow\"\u003e\n \u003cimg src=\"https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/nginx_admins_handbook_logo.png\" style=\"max-width: 100%;\"\u003e\n \u003c/a\u003e\n\u003c/p\u003e\n\u003cbr\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eBefore you start playing with NGINX please read an official \u003cstrong\u003e\u003ca href=\"http://nginx.org/en/docs/beginners_guide.html\" rel=\"nofollow\"\u003eBeginner’s Guide\u003c/a\u003e\u003c/strong\u003e. It's a great introduction for everyone.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNginx\u003c/strong\u003e (\u003cem\u003e/ˌɛndʒɪnˈɛks/ EN-jin-EKS\u003c/em\u003e, stylized as NGINX or nginx) is an open source HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server with a strong focus on high concurrency, performance and low memory usage. It is originally written by \u003ca href=\"http://sysoev.ru/en/\" rel=\"nofollow\"\u003eIgor Sysoev\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor a long time, it has been running on many heavily loaded Russian sites including Yandex, Mail.Ru, VK, and Rambler. At this moment some high-profile companies using NGINX include Cisco, DuckDuckGo, Facebook, GitLab, Google, Twitter, Apple, Intel, and many more. In the September 2019 it was the most commonly used HTTP server (see \u003ca href=\"https://news.netcraft.com/archives/category/web-server-survey/\" rel=\"nofollow\"\u003eNetcraft survey\u003c/a\u003e).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNGINX is a fast, light-weight and powerful web server that can also be used as a:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003efast HTTP reverse proxy\u003c/li\u003e\n\u003cli\u003ereliable load balancer\u003c/li\u003e\n\u003cli\u003ehigh performance caching server\u003c/li\u003e\n\u003cli\u003efull-fledged web platform\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eSo, to be brief, it provides the core of complete web stacks and is designed to help build scalable web applications. When it comes to performance, NGINX can easily handle a huge amount of traffic. The other main advantage of the NGINX is that allows you to do the same thing in different ways.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUnlike traditional HTTP servers, NGINX doesn't rely on threads to handle requests and it was written with a different architecture in mind - one which is much more suitable for nonlinear scalability in both the number of simultaneous connections and requests per second.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNGINX is also known as a \u003cem\u003eApache Killer\u003c/em\u003e (mainly because of its lightness and much less RAM consumption). It is event-based, so it does not follow Apache's style of spawning new processes or threads for each web page request. Generally, it was created to solve the \u003ca href=\"http://www.kegel.com/c10k.html\" rel=\"nofollow\"\u003eC10K problem\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor me, it is a one of the best and most important service that I used in my SysAdmin career.\u003c/p\u003e\n\u003chr\u003e\n\u003cp dir=\"auto\"\u003eThese essential documents should be the main source of knowledge for you:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://www.nginx.com/resources/wiki/start/\" rel=\"nofollow\"\u003eGetting Started\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://nginx.org/en/docs/\" rel=\"nofollow\"\u003eNGINX Documentation\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"http://nginx.org/en/docs/dev/development_guide.html\" rel=\"nofollow\"\u003eDevelopment guide\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://docs.nginx.com/nginx/admin-guide/security-controls/\" rel=\"nofollow\"\u003eSecurity Controls\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eIn addition, I would like to recommend three great docs focuses on the concept of the HTTP protocol:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://www.jmarshall.com/easy/http/\" rel=\"nofollow\"\u003eHTTP Made Really Easy\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://www.w3.org/Protocols/\" rel=\"nofollow\"\u003eHypertext Transfer Protocol Specification\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP\" rel=\"nofollow\"\u003eWeb technology for developers - HTTP\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eIf you love security keep your eye on this one: \u003ca href=\"https://eprint.iacr.org/\" rel=\"nofollow\"\u003eCryptology ePrint Archive\u003c/a\u003e. It provides access to recent research in cryptology and explores many subjects of security (e.g. Ciphers, Algorithms, SSL/TLS protocols). A great introduction that covers core concepts of cryptography is \u003ca href=\"https://cryptobook.nakov.com/\" rel=\"nofollow\"\u003ePractical Cryptography for Developers\u003c/a\u003e. I also recommend to read the \u003ca href=\"https://www.feistyduck.com/books/bulletproof-ssl-and-tls/\" rel=\"nofollow\"\u003eBulletproof SSL and TLS\u003c/a\u003e. Yep, it's definitely the most comprehensive book about deploying TLS for me.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAn obligatory source of knowledge is also the \u003ca href=\"https://cheatsheetseries.owasp.org/\" rel=\"nofollow\"\u003eOWASP Cheat Sheet Series\u003c/a\u003e. You should ought treat it as an excellent security guidance. \u003ca href=\"https://portswigger.net/kb/issues\" rel=\"nofollow\"\u003eBurp Scanner - Issue Definitions\u003c/a\u003e introduces you to the web apps and security vulnerabilities. Finally, \u003ca href=\"https://portswigger.net/web-security\" rel=\"nofollow\"\u003eThe Web Security Academy\u003c/a\u003e is a free online training center for web application security with high-quality reading materials and interactive labs of varying levels of difficulty. All are really good source to start learning about web application security.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAnd, of course, always browse official \u003ca href=\"http://nginx.org/en/security_advisories.html\" rel=\"nofollow\"\u003eNginx Security Advisories\u003c/a\u003e and CVE databases like \u003ca href=\"https://www.cvedetails.com/vendor/10048/Nginx.html\" rel=\"nofollow\"\u003eCVE Details\u003c/a\u003e or \u003ca href=\"https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=NGINX\" rel=\"nofollow\"\u003eCVE - The MITRE Corporation\u003c/a\u003e - to stay Up-to-Date on NGINX vulnerabilities.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePrologue\u003c/h2\u003e\u003ca id=\"user-content-prologue\" class=\"anchor\" aria-label=\"Permalink: Prologue\" href=\"#prologue\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWhen I was studying architecture of HTTP servers I became interested in NGINX. As I was going through research, I kept notes. I found a lot of information about it, e.g. forum posts on the web about every conceivable problem was great. However, I've never found one guide that covers the most important things in a suitable form. I was a little disappointed.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eI was interested in everything: NGINX internals, functions, security best practices, performance optimisations, tips \u0026amp; tricks, hacks and rules, but for me some of the documents treated the subject lightly.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOf course, \u003ca href=\"https://nginx.org/en/docs/\" rel=\"nofollow\"\u003eNGINX Official Documentation\u003c/a\u003e is the best place but I know that we also have other great resources:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://openresty.org/download/agentzh-nginx-tutorials-en.html\" rel=\"nofollow\"\u003eagentzh's Nginx Tutorials\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.nginxguts.com/\" rel=\"nofollow\"\u003eNginx Guts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.nginx-discovery.com/\" rel=\"nofollow\"\u003eNginx discovery journey\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://calomel.org/nginx.html\" rel=\"nofollow\"\u003eNginx Secure Web Server\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.evanmiller.org/nginx-modules-guide.html\" rel=\"nofollow\"\u003eEmiller’s Guide To Nginx Module Development\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.evanmiller.org/nginx-modules-guide-advanced.html\" rel=\"nofollow\"\u003eEmiller’s Advanced Topics In Nginx Module Development\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThese are definitely the best assets for us and in the first place you should seek help there. Moreover, in order to improve your knowledge, please see \u003ca href=\"#books\"\u003eBooks\u003c/a\u003e chapter - it contains top literature on NGINX.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhy I created this handbook\u003c/h2\u003e\u003ca id=\"user-content-why-i-created-this-handbook\" class=\"anchor\" aria-label=\"Permalink: Why I created this handbook\" href=\"#why-i-created-this-handbook\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor me, however, there hasn't been a truly in-depth and reasonably simple cheatsheet which describe a variety of configurations and important cross-cutting topics for HTTP servers. Configuration of the NGINX can be tricky sometimes and you really need to get into the syntax and concepts to get an understanding tricks, loopholes, and mechanisms. The documentation isn't as pretty as other projects and should certainly include more robust examples.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eThis handbook is a set of rules and recommendations for the NGINX Open Source HTTP server. It also contains the best practices, notes, and helpers with countless examples. Many of them refer to external resources.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eThere are a lot of things you can do to improve in your NGINX instance and this guide will attempt to cover as many of them as possible. For the most part, it contains the most important things about NGINX for me. I think the configuration you provided should work without any talisman. That's why I created this repository.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWith this handbook you will explore the many features and capabilities of the NGINX. You'll find out, for example, how to testing the performance or how to resolve debugging problems. You will learn configuration guidelines, security design patterns, ways to handle common issues and how to stay out of them. I explained here a few best tips to avoid pitfalls and configuration mistakes.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eI added set of guidelines and examples has also been produced to help you administer of the NGINX. They give us insight into NGINX internals also.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMostly, I apply the rules presented here on the NGINX working as a reverse proxy. However, does not to prevent them being implemented for NGINX as a standalone server.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWho this handbook is for\u003c/h2\u003e\u003ca id=\"user-content-who-this-handbook-is-for\" class=\"anchor\" aria-label=\"Permalink: Who this handbook is for\" href=\"#who-this-handbook-is-for\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you do not have the time to read hundreds of articles (just like me) this multipurpose handbook may be useful. I created it in the hope that it will be useful especially for System Administrators and Experts of Web-based applications.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis handbook does not get into all aspects of NGINX. What's more, some of the things described in this guide may be rather basic because most of us do not configure NGINX every day and it is easy to forget about basic/trivial things. On the other hand, also discusses heavyweight topics so there is something for advanced users. I tried to put external resources in many places in this handbook in order to dispel any suspicion that may exist.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eI did my best to make this handbook a single and consistent (but now I know that is really hard). It's organized in an order that makes logical sense to me. I think it can also be a good complement to official documentation and other great documents. Many of the topics described here can certainly be done better or different. Of course, I still have a lot \u003ca href=\"#contributing--support\"\u003eto improve and to do\u003c/a\u003e. I hope you enjoy and have fun with it.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eDo not treat this handbook and notes written here as revealed knowledge. You should take a scientific approach when reading this document. If you have any doubts and disagree with me, please point out my mistakes. You should to discover cause and effect relationships by asking questions, carefully gathering and examining the evidence, and seeing if all the available information can be combined in to a logical answer.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eI create this handbook for one more reason. Rather than starting from scratch in, I putting together a plan for answering your questions to help you find the best way to do things and ensure that you don't repeat my mistakes from the past.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSo, what's most important:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eask a questions about something that you observe\u003c/li\u003e\n\u003cli\u003edo background research\u003c/li\u003e\n\u003cli\u003edo tests with an experiments\u003c/li\u003e\n\u003cli\u003eanalyze and draw conclusions\u003c/li\u003e\n\u003cli\u003ecommunicate results (for us!)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eFinally, you should know I'm not a NGINX expert but I love to know how stuff works and why work the way they do. \u003ca href=\"https://twitter.com/ErikVoorhees/status/1004313761224757248\" rel=\"nofollow\"\u003eI’m not a crypto expert... but I do know the term \"elliptic curve\"\u003c/a\u003e (I really like this quote!). Don't need to be an expert to figure out the reason just got to have used this and not this or why something works this way and not another. It feels good to understand the recommendations and nuances of a topic you’re passionate about.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBefore you start\u003c/h2\u003e\u003ca id=\"user-content-before-you-start\" class=\"anchor\" aria-label=\"Permalink: Before you start\" href=\"#before-you-start\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRemember about the following most important things:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003e\u003ccode\u003eBlindly deploying of the rules described here can damage your web application!\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003e\u003ccode\u003eDo not follow guides just to get 100% of something. Think about what you actually do at your server!\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003e\u003ccode\u003eCopy-and-paste is not the best way to learn. Think twice before adopting rules from this handbook.\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003e\u003ccode\u003eThere are no settings that are perfect for everyone.\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003e\u003ccode\u003eAlways think about what is better and more important for you: security vs usability/compatibility.\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003e\u003ccode\u003eSecurity mainly refers to minimise the risk.\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003e\u003ccode\u003eChange one thing may open a whole new set of problems.\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003e\u003ccode\u003eRead about how things work and what values are considered secure enough (and for what purposes).\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003e\u003ccode\u003eThe only correct approach is to understand your exposure, measure and tune.\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"highlight highlight-source-diff notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"+ Security is important for ethical reasons. Compliance is important for legal reasons.\n+ The key to workplace contentment is understanding they are unrelated to each other.\n+ Both are important, but one does not lead to the other (compliance != security).\nauthor: unknown\n\n+ Security is always needed, no matter what type of website it is. It can be static HTML\n+ or fully dynamic, an attacker can still inject hostile content into the page in transit\n+ to attack the user.\nauthor: Scott Helme\n\n+ Don’t enable older deprecated protocols just because Karen in Florida is still using\n+ a PC that she bought back in 2001.\nauthor: thisinterestsmeblog\"\u003e\u003cpre\u003e\u003cspan class=\"pl-mi1\"\u003e\u003cspan class=\"pl-mi1\"\u003e+\u003c/span\u003e Security is important for ethical reasons. Compliance is important for legal reasons.\u003c/span\u003e\n\u003cspan class=\"pl-mi1\"\u003e\u003cspan class=\"pl-mi1\"\u003e+\u003c/span\u003e The key to workplace contentment is understanding they are unrelated to each other.\u003c/span\u003e\n\u003cspan class=\"pl-mi1\"\u003e\u003cspan class=\"pl-mi1\"\u003e+\u003c/span\u003e Both are important, but one does not lead to the other (compliance != security).\u003c/span\u003e\nauthor: unknown\n\n\u003cspan class=\"pl-mi1\"\u003e\u003cspan class=\"pl-mi1\"\u003e+\u003c/span\u003e Security is always needed, no matter what type of website it is. It can be static HTML\u003c/span\u003e\n\u003cspan class=\"pl-mi1\"\u003e\u003cspan class=\"pl-mi1\"\u003e+\u003c/span\u003e or fully dynamic, an attacker can still inject hostile content into the page in transit\u003c/span\u003e\n\u003cspan class=\"pl-mi1\"\u003e\u003cspan class=\"pl-mi1\"\u003e+\u003c/span\u003e to attack the user.\u003c/span\u003e\nauthor: Scott Helme\n\n\u003cspan class=\"pl-mi1\"\u003e\u003cspan class=\"pl-mi1\"\u003e+\u003c/span\u003e Don’t enable older deprecated protocols just because Karen in Florida is still using\u003c/span\u003e\n\u003cspan class=\"pl-mi1\"\u003e\u003cspan class=\"pl-mi1\"\u003e+\u003c/span\u003e a PC that she bought back in 2001.\u003c/span\u003e\nauthor: thisinterestsmeblog\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eI think, in the age of phishing, cyber attacks, ransomware, etc., you should take care of security of your infrastructure as hard as possible but don't ever forget about this one...\u003c/p\u003e\n\u003cbr\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/trimstray/nginx-admins-handbook/blob/master/static/img/crypto_nerds.png\"\u003e\u003cimg src=\"https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/crypto_nerds.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eLastly, I would like to quote two very important comments found on the web about compliance with the standards and regulations, and essence of a human factor in security:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eRegulations that make sense are often not descriptive - capturing the intent and scope of a rule often requires technical expertise. More than that, it's the type of expertise most organisations do not have. And instead of improving themselves, these companies, who may form the grand majority of the industry, petition the regulators to provide a safe checklist of technical mitigations that can be implemented to remain compliant. [...] Instead of doing the right thing and meeting the planned intent, companies are instead ticking nonsensical boxes that the regulators and their auditors demand. Blindly. Mindlessly. Divorced from reality.\u003c/em\u003e - by \u003ca href=\"https://news.ycombinator.com/user?id=bostik\" rel=\"nofollow\"\u003ebostik\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eWhenever considering security, the human factor is nearly always as important or more important than just the technical aspects. Policy and procedures need to consider the human element and try to ensure that these policies and procedures are structured in such a way as to help enable staff to do the right thing, even when they may not fully understand why they need to do it.\u003c/em\u003e - by \u003ca href=\"https://security.stackexchange.com/users/13958/tim-x\" rel=\"nofollow\"\u003eTim X\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContributing \u0026amp; Support\u003c/h2\u003e\u003ca id=\"user-content-contributing--support\" class=\"anchor\" aria-label=\"Permalink: Contributing \u0026amp; Support\" href=\"#contributing--support\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eA real community, however, exists only when its members interact in a meaningful way that deepens their understanding of each other and leads to learning.\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eIf you find something which doesn't make sense, or something doesn't seem right, please make a pull request and please add valid and well-reasoned explanations about your changes or comments.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBefore adding a pull request, please see the \u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/.github/CONTRIBUTING.md\"\u003econtributing guidelines\u003c/a\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCode Contributors\u003c/h2\u003e\u003ca id=\"user-content-code-contributors\" class=\"anchor\" aria-label=\"Permalink: Code Contributors\" href=\"#code-contributors\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis project exists thanks to all the people who contribute.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/trimstray/nginx-admins-handbook/graphs/contributors\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/f1eeafa832de83b97ee0ca35bd095ddf34552bc46f4dcfa711d7100f1f99ac88/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f6e67696e782d61646d696e732d68616e64626f6f6b2f636f6e7472696275746f72732e7376673f77696474683d38393026627574746f6e3d66616c7365\" data-canonical-src=\"https://opencollective.com/nginx-admins-handbook/contributors.svg?width=890\u0026amp;button=false\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eToDo\u003c/h3\u003e\u003ca id=\"user-content-todo\" class=\"anchor\" aria-label=\"Permalink: ToDo\" href=\"#todo\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWhat needs to be done? Look at the following ToDo list:\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNew chapters:\u003c/p\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cstrong\u003eBonus Stuff\u003c/strong\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cstrong\u003eHTTP Basics\u003c/strong\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cstrong\u003eSSL/TLS Basics\u003c/strong\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cstrong\u003eReverse Proxy\u003c/strong\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cstrong\u003eCaching\u003c/strong\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cstrong\u003eCore modules\u003c/strong\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cstrong\u003e3rd party modules\u003c/strong\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cstrong\u003eWeb Application Firewall\u003c/strong\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cstrong\u003eModSecurity\u003c/strong\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cstrong\u003eDebugging\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eExisting chapters:\u003c/p\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eIntroduction\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ePrologue\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eWhy I created this handbook\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eWho this handbook is for\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eBefore you start\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eContributing \u0026amp; Support\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e _RSS Feed \u0026amp; Updates\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eChecklist to rule them all\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eBonus Stuff\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eFully automatic installation\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eStatic error pages generator\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eServer names parser\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eBooks\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eModSecurity 3.0 and NGINX: Quick Start Guide\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCisco ACE to NGINX: Migration Guide\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eExternal Resources\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cem\u003eNginx official\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNginx Forum\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNginx Mailing List\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNGINX-Demos\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003ePresentations \u0026amp; Videos\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNGINX: Basics and Best Practices\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNGINX Installation and Tuning\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNginx Internals (by Joshua Zhu)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNginx internals (by Liqiang Xu)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHow to secure your web applications with NGINX\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTuning TCP and NGINX on EC2\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eExtending functionality in nginx, with modules!\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNginx - Tips and Tricks.\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNginx Scripting - Extending Nginx Functionalities with Lua\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHow to handle over 1,200,000 HTTPS Reqs/Min\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUsing ngx_lua / lua-nginx-module in pixiv\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eCheatsheets \u0026amp; References\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNginx configurations for most popular CMS/CMF/Frameworks based on PHP\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003ePerformance \u0026amp; Hardening\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMemorable site for testing clients against bad SSL configs\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eConfig parsers\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eQuick and reliable way to convert NGINX configurations into JSON and back\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eParses nginx configuration with Pyparsing\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eConfig managers\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eAnsible role to install and manage nginx configuration\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eAnsible Role - Nginx\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eAnsible role for NGINX\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ePuppet Module to manage NGINX on various UNIXes\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eStatic analyzers\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003enginx-minify-conf\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eComparison reviews\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNGINX vs. Apache (Pro/Con Review, Uses, \u0026amp; Hosting for Each)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eWeb cache server performance benchmark: nuster vs nginx vs varnish vs squid\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eBuilder tools\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNginx-builder\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eBenchmarking tools\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ewrk2\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ehttperf\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eslowloris\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eslowhttptest\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGoldenEye\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eDebugging tools\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003estrace\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGDB\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSystemTap\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003estapxx\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ehtrace.sh\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eSecurity \u0026amp; Web testing tools\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eBurp Suite\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ew3af\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003enikto\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003essllabs-scan\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ehttp-observatory\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003etestssl.sh\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003esslyze\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ecipherscan\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eO-Saft\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNghttp2\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eh2spec\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ehttp2fuzz\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eArjun\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCorsy\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eXSStrike\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eOnline \u0026amp; Web tools\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003essltools\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eOther stuff\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eOWASP Cheat Sheet Series\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMozilla Web Security\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eApplication Security Wiki\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eOWASP ASVS 4.0\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eThe System Design Primer\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eawesome-scalability\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eWeb Architecture 101\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eHTTP Basics\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eFeatures and architecture\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHTTP/2\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHow to debug HTTP/2?\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHTTP/3\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eURI vs URL\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eConnection vs request\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHTTP Headers\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHeader compression\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHTTP Methods\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRequest\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRequest line\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMethods\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRequest URI\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHTTP version\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRequest header fields\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMessage body\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate requests\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eResponse\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eStatus line\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHTTP version\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eStatus codes and reason phrase\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eResponse header fields\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMessage body\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHTTP client\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eIP address shortcuts\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eBack-End web architecture\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUseful video resources\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eSSL/TLS Basics\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTLS versions\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTLS handshake\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eIn which layer is TLS situated within the TCP/IP stack?\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRSA and ECC keys/certificates\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCipher suites\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eAuthenticated encryption (AEAD) cipher suites\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eWhy cipher suites are important?\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNGINX and TLS 1.3 Cipher Suites\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDiffie-Hellman key exchange\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCertificates\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eChain of Trust\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eWhat is the main purpose of the Intermediate CA?\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSingle-domain\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMulti-domain\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eWildcard\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eWildcard SSL doesn't handle root domain?\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTLS Server Name Indication\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eVerify your SSL, TLS \u0026amp; Ciphers implementation\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUseful video resources\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eNGINX Basics\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cem\u003eProcesses\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCPU pinning\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eShutdown of worker processes\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eConfiguration syntax\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eComments\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eEnd of lines\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eVariables, Strings, and Quotes\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDirectives, Blocks, and Contexts\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eExternal files\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMeasurement units\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRegular expressions with PCRE\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eEnable syntax highlighting\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eConnection processing\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eEvent-Driven architecture\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMultiple processes\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSimultaneous connections\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHTTP Keep-Alive connections\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003esendfile, tcp_nodelay, and tcp_nopush\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eServer blocks logic\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMatching location\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eif in location\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eNested locations\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003erewrite vs return\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003etry_files directive\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eif, break and set\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eroot vs alias\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003einternal directive\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eExternal and internal redirects\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eallow and deny\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003euri vs request_uri\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eCompression and decompression\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eWhat is the best NGINX compression gzip level?\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eHash tables\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eServer names hash table\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eLog files\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eConditional logging\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eManually log rotation\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNGINX upstream variables returns 2 values\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eReverse proxy\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ePassing requests\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTrailing slashes\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eProcessing headers\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ePassing headers\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eImportance of the Host header\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRedirects and X-Forwarded-Proto\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eA warning about the X-Forwarded-For\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eImprove extensibility with Forwarded\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eResponse headers\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eLoad balancing algorithms\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eBackend parameters\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUpstream servers with SSL\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRound Robin\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eWeighted Round Robin\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eLeast Connections\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eWeighted Least Connections\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eIP Hash\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGeneric Hash\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eFair module\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eOther methods\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eRate Limiting\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eVariables\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDirectives, keys, and zones\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eBurst and nodelay parameters\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eNAXSI Web Application Firewall\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eOWASP ModSecurity Core Rule Set (CRS)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eOther subjects\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eSecure Distribution of SSL Private Keys with NGINX\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eCore modules\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003engx_http_geo_module\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e3rd party modules\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003engx_set_misc\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003engx_http_geoip_module\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eHelpers\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cem\u003eInstalling from source\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eAutomatic installation on RHEL/Debian/BSD\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCompiler and linker\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDebugging Symbols\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSystemTap\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003estapxx\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSeparation and improvement of installation methods\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eInstallation Nginx on CentOS 7\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eInstallation OpenResty on CentOS 7\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eInstallation Tengine on Ubuntu 18.04\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eInstallation Nginx on FreeBSD 11.3\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eInstallation Nginx on FreeBSD 11.3 (from ports)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eMonitoring\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eCollectD, Prometheus, and Grafana\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003enginx-vts-exporter\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eCollectD, InfluxDB, and Grafana\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eTelegraf, InfluxDB, and Grafana\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eTesting\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eBuild OpenSSL 1.0.2-chacha version\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSend request and show response headers\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSend request with http method, user-agent, follow redirects and show response headers\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSend multiple requests\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTesting SSL connection\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTesting SSL connection (debug mode)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTesting SSL connection with SNI support\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTesting SSL connection with specific SSL version\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTesting SSL connection with specific cipher\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eVerify 0-RTT\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTesting SCSV\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eLoad testing with ApacheBench (ab)\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eStandard test\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTest with Keep-Alive header\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eLoad testing with wrk2\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eStandard scenarios\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ePOST call (with Lua)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRandom paths (with Lua)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMultiple paths (with Lua)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRandom server address to each thread (with Lua)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMultiple json requests (with Lua)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDebug mode (with Lua)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eAnalyse data pass to and from the threads\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eParsing wrk result and generate report\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eLoad testing with locust\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMultiple paths\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eMultiple paths with different user sessions\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTCP SYN flood Denial of Service attack\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eHTTP Denial of Service attack\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eDebugging\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eShow information about processes\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCheck memory usage\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eShow open files\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCheck segmentation fault messages\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDump configuration\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGet the list of configure arguments\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCheck if the module has been compiled\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eShow the most accessed IP addresses (ip and url)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eShow the most requested urls with http methods\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eShow the most accessed response codes\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCalculating requests per second with IP addresses and urls\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCheck that the gzip_static module is working\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eWhich worker processing current request\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCapture only http packets\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eExtract User Agent from the http packets\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCapture only http GET and POST packets\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCapture requests and filter by source ip and destination port\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCapture HTTP requests/responses in real time, filter by GET, HEAD and save to a file\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eServer Side Include (SSI) debugging\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDump a process's memory\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eGNU Debugger (gdb)\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDump configuration from a running process\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eShow debug log in memory\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCore dump backtrace\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDebugging socket leaks\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eSystemTap cheatsheet\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003estapxx\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eErrors \u0026amp; Issues\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eCommon errors\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eConfiguration snippets\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNginx server header removal\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCustom log formats\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eLog only 4xx/5xx\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRestricting access with client certificate\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRestricting access by geographical location\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGeoIP 2 database\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eCustom error pages\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDynamic error pages with SSI\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eLimiting the rate of requests per IP with geo and map\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUsing trailing slashes\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eProperly redirect all HTTP requests to HTTPS\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eAdding and removing the www prefix\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eProxy/rewrite and keep the original URL\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eProxy/rewrite and keep the part of original URL\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eProxy/rewrite without changing the original URL (in browser)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eModify 301/302 response body\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRedirect POST request with payload to external endpoint\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRoute to different backends based on HTTP method\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eRedirect users with certain IP to special location\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eAllow multiple cross-domains using the CORS headers\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSet correct scheme passed in X-Forwarded-Proto\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eSecuring URLs with the Secure Link Module\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eTips and methods for high load traffic testing (cheatsheet)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eLocation matching examples\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003ePassing requests to the backend\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eThe HTTP backend server\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eThe uWSGI backend server\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eThe FastCGI backend server\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eThe memcached backend server\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eThe Redis backend server\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eHTTPS traffic to upstream servers\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eTCP and UDP load balancing\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eLua snippets\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003enginscripts snippets\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eOther snippets\u003c/em\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRecreate base directory\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCreate a temporary static backend\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCreate a temporary static backend with SSL support\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate password file with htpasswd command\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate private key without passphrase\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate private key with passphrase\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRemove passphrase from private key\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eEncrypt existing private key with a passphrase\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate CSR\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate CSR (metadata from existing certificate)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate CSR with -config param\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate private key and CSR\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eList available EC curves\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate ECDSA private key\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate private key and CSR (ECC)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate self-signed certificate\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate self-signed certificate from existing private key\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate self-signed certificate from existing private key and csr\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate multidomain certificate (Certbot)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate wildcard certificate (Certbot)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate certificate with 4096 bit private key (Certbot)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGenerate DH public parameters\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDisplay DH public parameters\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eExtract certs from p7b\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eConvert DER to PEM\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eConvert PEM to DER\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eVerification of the certificate's supported purposes\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eVerification of the private key\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCheck private key\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eGet public key from private key\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eVerification of the public key\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eVerification of the certificate\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eVerification of the CSR\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eCheck the private key and the certificate are match\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTLSv1.3 and CCM ciphers\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eBase Rules\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eFormat, prettify and indent your Nginx code\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eNever use a hostname in a listen or upstream directives\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSet the HTTP headers with add_header and proxy\u003c/em\u003e*\u003cem\u003eheader directives properly\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eMaking a rewrite absolute (with scheme)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUse return directive for URL redirection (301, 302)\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUse simple custom error pages\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eConfigure log rotation policy\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDon't duplicate index directive, use it only in the http block\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDebugging\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eImprove debugging by disable daemon, master process, and all workers except one\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUse core dumps to figure out why NGINX keep crashing\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUse mirror module to copy requests to another backend\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eDynamic debugging with echo module\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eDynamic debugging with SSI\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ePerformance\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eEnable OCSP Stapling\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eAvoid multiple index directives\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUse $request_uri to avoid using regular expressions\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUse try_files directive to ensure a file exists\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eDon't pass all requests to the backend - use try_files\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUse return directive instead of rewrite for redirects\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eEnable PCRE JIT to speed up processing of regular expressions\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eSet proxy timeouts for normal load and under heavy load\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eConfigure kernel parameters for high load traffic\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eActivate the cache for connections to upstream servers\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eHardening\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eKeep NGINX up-to-date\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eTake care about your ACL rules\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUse only the latest supported OpenSSL version\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eRemove support for legacy and risky HTTP request headers\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ePrevent Replay Attacks on Zero Round-Trip Time\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003ePrevent caching of sensitive data\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eLimit concurrent connections\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eSet properly files and directories permissions (also with acls) on a paths\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eImplement HTTPOnly and secure attributes on cookies\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eReverse Proxy\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUse pass directive compatible with backend protocol\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eBe careful with trailing slashes in proxy_pass directive\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSet and pass Host header only with $host variable\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSet properly values of the X-Forwarded-For header\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDon't use X-Forwarded-Proto with $scheme behind reverse proxy\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eAlways pass Host, X-Real-IP, and X-Forwarded headers to the backend\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUse custom headers without X- prefix\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eAlways use $request_uri instead of $uri in proxy_pass\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e \u003cem\u003eSet proxy buffers and timeouts\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eOthers\u003c/b\u003e\u003c/summary\u003e\u003cbr\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eSet the certificate chain correctly\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eDefine security policies with security.txt\u003c/em\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e \u003cem\u003eUse tcpdump to diagnose and troubleshoot the HTTP issues\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cp dir=\"auto\"\u003eIf you have any idea, send it back to me or add a pull request.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRSS Feed \u0026amp; Updates\u003c/h2\u003e\u003ca id=\"user-content-rss-feed--updates\" class=\"anchor\" aria-label=\"Permalink: RSS Feed \u0026amp; Updates\" href=\"#rss-feed--updates\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eGitHub exposes an \u003ca href=\"https://github.com/trimstray/nginx-admins-handbook/commits.atom\"\u003eRSS/Atom\u003c/a\u003e feed of the commits, which may also be useful if you want to be kept informed about all changes.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eChecklist to rule them all\u003c/h2\u003e\u003ca id=\"user-content-checklist-to-rule-them-all\" class=\"anchor\" aria-label=\"Permalink: Checklist to rule them all\" href=\"#checklist-to-rule-them-all\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis checklist was the primary aim of the \u003cem\u003enginx-admins-handbook\u003c/em\u003e. It contains a set of best practices and recommendations on how to configure and maintain the NGINX properly.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eThis checklist contains \u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md\"\u003eall rules (79)\u003c/a\u003e from this handbook.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eGenerally, I think that each of these principles is important and should be considered. I separated them into four levels of priority to help guide your decision.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"center\"\u003e\u003cb\u003ePRIORITY\u003c/b\u003e\u003c/th\u003e\n\u003cth align=\"left\"\u003e\u003cb\u003eNAME\u003c/b\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003cb\u003eAMOUNT\u003c/b\u003e\u003c/th\u003e\n\u003cth align=\"left\"\u003e\u003cb\u003eDESCRIPTION\u003c/b\u003e\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ci\u003ecritical\u003c/i\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e33\u003c/td\u003e\n\u003ctd align=\"left\"\u003edefinitely use this rule, otherwise it will introduce high risks of your NGINX security, performance, and other\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ci\u003emajor\u003c/i\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e26\u003c/td\u003e\n\u003ctd align=\"left\"\u003eit's also very important but not critical, and should still be addressed at the earliest possible opportunity\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ci\u003enormal\u003c/i\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e12\u003c/td\u003e\n\u003ctd align=\"left\"\u003ethere is no need to implement but it is worth considering because it can improve the NGINX working and functions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png\" alt=\"info\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ci\u003eminor\u003c/i\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e8\u003c/td\u003e\n\u003ctd align=\"left\"\u003eas an option to implement or use (not required)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eRemember, these are only guidelines. My point of view may be different from yours so if you feel these priority levels do not reflect your configurations commitment to security, performance or whatever else, you should adjust them as you see fit.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003e\u003cb\u003eRULE\u003c/b\u003e\u003c/th\u003e\n\u003cth align=\"left\"\u003e\u003cb\u003eCHAPTER\u003c/b\u003e\u003c/th\u003e\n\u003cth align=\"center\"\u003e\u003cb\u003ePRIORITY\u003c/b\u003e\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-define-the-listen-directives-with-addressport-pair\"\u003eDefine the listen directives with address:port pair\u003c/a\u003e\u003cbr\u003e\u003csup\u003ePrevents soft mistakes which may be difficult to debug.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-processing-requests-with-undefined-server-names\"\u003ePrevent processing requests with undefined server names\u003c/a\u003e\u003cbr\u003e\u003csup\u003eIt protects against configuration errors, e.g. traffic forwarding to incorrect backends.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-never-use-a-hostname-in-a-listen-or-upstream-directives\"\u003eNever use a hostname in a listen or upstream directives\u003c/a\u003e\u003cbr\u003e\u003csup\u003eWhile this may work, it will comes with a large number of issues.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-the-http-headers-with-add_header-and-proxy__header-directives-properly\"\u003eSet the HTTP headers with add_header and proxy_*_header directives properly\u003c/a\u003e\u003cbr\u003e\u003csup\u003eSet the right security headers for all contexts.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-configure-log-rotation-policy\"\u003eConfigure log rotation policy\u003c/a\u003e\u003cbr\u003e\u003csup\u003eSave yourself trouble with your web server: configure appropriate logging policy.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-simple-custom-error-pages\"\u003eUse simple custom error pages\u003c/a\u003e\u003cbr\u003e\u003csup\u003eDefault error pages reveals information which leads to information leakage vulnerability.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-http2\"\u003eUse HTTP/2\u003c/a\u003e\u003cbr\u003e\u003csup\u003eHTTP/2 will make our applications faster, simpler, and more robust.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-always-keep-nginx-up-to-date\"\u003eAlways keep NGINX up-to-date\u003c/a\u003e\u003cbr\u003e\u003csup\u003eUse newest NGINX package to fix vulnerabilities, bugs, and to use new features.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-run-as-an-unprivileged-user\"\u003eRun as an unprivileged user\u003c/a\u003e\u003cbr\u003e\u003csup\u003eUse the principle of least privilege. This way only master process runs as root.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-protect-sensitive-resources\"\u003eProtect sensitive resources\u003c/a\u003e\u003cbr\u003e\u003csup\u003eHidden directories and files should never be web accessible.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-take-care-about-your-acl-rules\"\u003eTake care about your ACL rules\u003c/a\u003e\u003cbr\u003e\u003csup\u003eTest your access-control lists and to stay secure.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-hide-upstream-proxy-headers\"\u003eHide upstream proxy headers\u003c/a\u003e\u003cbr\u003e\u003csup\u003eDon't expose what version of software is running on the server.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-remove-support-for-legacy-and-risky-http-request-headers\"\u003eRemove support for legacy and risky HTTP request headers\u003c/a\u003e\u003cbr\u003e\u003csup\u003eSupports for the offending headers should be removed.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-force-all-connections-over-tls\"\u003eForce all connections over TLS\u003c/a\u003e\u003cbr\u003e\u003csup\u003eProtects your website for handle sensitive communications.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-min-2048-bit-for-rsa-and-256-bit-for-ecc\"\u003eUse min. 2048-bit for RSA and 256-bit for ECC\u003c/a\u003e\u003cbr\u003e\u003csup\u003e2048 bit (RSA) or 256 bit (ECC) keys are sufficient for commercial use.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-keep-only-tls-13-and-tls-12\"\u003eKeep only TLS 1.3 and TLS 1.2\u003c/a\u003e\u003cbr\u003e\u003csup\u003eUse TLS with modern cryptographic algorithms and without protocol weaknesses.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-only-strong-ciphers\"\u003eUse only strong ciphers\u003c/a\u003e\u003cbr\u003e\u003csup\u003eUse only strong and not vulnerable cipher suites.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-more-secure-ecdh-curve\"\u003eUse more secure ECDH Curve\u003c/a\u003e\u003cbr\u003e\u003csup\u003eUse ECDH Curves with according to NIST recommendations.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-strong-key-exchange-with-perfect-forward-secrecy\"\u003eUse strong Key Exchange with Perfect Forward Secrecy\u003c/a\u003e\u003cbr\u003e\u003csup\u003eEstablishes a shared secret between two parties that can be used for secret communication.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-defend-against-the-beast-attack\"\u003eDefend against the BEAST attack\u003c/a\u003e\u003cbr\u003e\u003csup\u003eThe server ciphers should be preferred over the client ciphers.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-http-strict-transport-security\"\u003eEnable HTTP Strict Transport Security\u003c/a\u003e\u003cbr\u003e\u003csup\u003eTells browsers that it should only be accessed using HTTPS, instead of using HTTP.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-reduce-xss-risks-content-security-policy\"\u003eReduce XSS risks (Content-Security-Policy)\u003c/a\u003e\u003cbr\u003e\u003csup\u003eCSP is best used as defence-in-depth. It reduces the harm that a malicious injection can cause.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-control-the-behaviour-of-the-referer-header-referrer-policy\"\u003eControl the behaviour of the Referer header (Referrer-Policy)\u003c/a\u003e\u003cbr\u003e\u003csup\u003eThe default behaviour of referrer leaking puts websites at risk of privacy and security breaches.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-provide-clickjacking-protection-x-frame-options\"\u003eProvide clickjacking protection (X-Frame-Options)\u003c/a\u003e\u003cbr\u003e\u003csup\u003eDefends against clickjacking attack.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-some-categories-of-xss-attacks-x-xss-protection\"\u003ePrevent some categories of XSS attacks (X-XSS-Protection)\u003c/a\u003e\u003cbr\u003e\u003csup\u003ePrevents to render pages if a potential XSS reflection attack is detected.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-sniff-mimetype-middleware-x-content-type-options\"\u003ePrevent Sniff Mimetype middleware (X-Content-Type-Options)\u003c/a\u003e\u003cbr\u003e\u003csup\u003eTells browsers not to sniff MIME types.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-reject-unsafe-http-methods\"\u003eReject unsafe HTTP methods\u003c/a\u003e\u003cbr\u003e\u003csup\u003eOnly allow the HTTP methods for which you, in fact, provide services.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-caching-of-sensitive-data\"\u003ePrevent caching of sensitive data\u003c/a\u003e\u003cbr\u003e\u003csup\u003eIt helps to prevent critical data (e.g. credit card details, or username) leaked.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-limit-concurrent-connections\"\u003eLimit concurrent connections\u003c/a\u003e\u003cbr\u003e\u003csup\u003eLimit concurrent connections to prevent a rogue guys from repeatedly connecting to and monopolizing NGINX.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-pass-directive-compatible-with-backend-protocol\"\u003eUse pass directive compatible with backend protocol\u003c/a\u003e\u003cbr\u003e\u003csup\u003eSet pass directive only to working with compatible backend layer protocol.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eReverse Proxy\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-properly-values-of-the-x-forwarded-for-header\"\u003eSet properly values of the X-Forwarded-For header\u003c/a\u003e\u003cbr\u003e\u003csup\u003eIdentify clients communicating with servers located behind the proxy.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eReverse Proxy\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-dont-use-x-forwarded-proto-with-scheme-behind-reverse-proxy\"\u003eDon't use X-Forwarded-Proto with $scheme behind reverse proxy\u003c/a\u003e\u003cbr\u003e\u003csup\u003ePrevent pass incorrect value of this header.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eReverse Proxy\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-always-use-request_uri-instead-of-uri-in-proxy_pass\"\u003eAlways use $request_uri instead of $uri in proxy_pass\u003c/a\u003e\u003cbr\u003e\u003csup\u003eYou should always pass unchanged URI to the backend layer.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eReverse Proxy\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png\" alt=\"high\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-organising-nginx-configuration\"\u003eOrganising Nginx configuration\u003c/a\u003e\u003cbr\u003e\u003csup\u003eWell organised code is easier to understand and maintain.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-format-prettify-and-indent-your-nginx-code\"\u003eFormat, prettify and indent your Nginx code\u003c/a\u003e\u003cbr\u003e\u003csup\u003eFormatted code is easier to maintain, debug, and can be read and understood in a short amount of time.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-reload-option-to-change-configurations-on-the-fly\"\u003eUse reload option to change configurations on the fly\u003c/a\u003e\u003cbr\u003e\u003csup\u003eGraceful reload of the configuration without stopping the server and dropping any packets.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-return-directive-for-url-redirection-301-302\"\u003eUse return directive for URL redirection (301, 302)\u003c/a\u003e\u003cbr\u003e\u003csup\u003eThe by far simplest and fastest because there is no regexp that has to be evaluated.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-maintaining-ssl-sessions\"\u003eMaintaining SSL sessions\u003c/a\u003e\u003cbr\u003e\u003csup\u003eImproves performance from the clients’ perspective.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-ocsp-stapling\"\u003eEnable OCSP Stapling\u003c/a\u003e\u003cbr\u003e\u003csup\u003eEnable to reduce the cost of an OCSP validation.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-exact-names-in-a-server_name-directive-if-possible\"\u003eUse exact names in a server_name directive if possible\u003c/a\u003e\u003cbr\u003e\u003csup\u003eHelps speed up searching using exact names.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-avoid-checks-server_name-with-if-directive\"\u003eAvoid checks server_name with if directive\u003c/a\u003e\u003cbr\u003e\u003csup\u003eIt decreases NGINX processing requirements.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-request_uri-to-avoid-using-regular-expressions\"\u003eUse $request_uri to avoid using regular expressions\u003c/a\u003e\u003cbr\u003e\u003csup\u003eBy default, the regex is costly and will slow down the performance.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-try_files-directive-to-ensure-a-file-exists\"\u003eUse try_files directive to ensure a file exists\u003c/a\u003e\u003cbr\u003e\u003csup\u003eUse it if you need to search for a file, it saving duplication of code also.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-return-directive-instead-of-rewrite-for-redirects\"\u003eUse return directive instead of rewrite for redirects\u003c/a\u003e\u003cbr\u003e\u003csup\u003eUse return directive to more speedy response than rewrite.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-pcre-jit-to-speed-up-processing-of-regular-expressions\"\u003eEnable PCRE JIT to speed up processing of regular expressions\u003c/a\u003e\u003cbr\u003e\u003csup\u003eNGINX with PCRE JIT is much faster than without it.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-activate-the-cache-for-connections-to-upstream-servers\"\u003eActivate the cache for connections to upstream servers\u003c/a\u003e\u003cbr\u003e\u003csup\u003e Nginx can now reuse its existing connections (keepalive) per upstream.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-disable-unnecessary-modules\"\u003eDisable unnecessary modules\u003c/a\u003e\u003cbr\u003e\u003csup\u003eLimits vulnerabilities, improve performance and memory efficiency.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-hide-nginx-version-number\"\u003eHide Nginx version number\u003c/a\u003e\u003cbr\u003e\u003csup\u003eDon't disclose sensitive information about NGINX.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-hide-nginx-server-signature\"\u003eHide Nginx server signature\u003c/a\u003e\u003cbr\u003e\u003csup\u003eDon't disclose sensitive information about NGINX.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-only-the-latest-supported-openssl-version\"\u003eUse only the latest supported OpenSSL version\u003c/a\u003e\u003cbr\u003e\u003csup\u003eStay protected from SSL security threats and don't miss out of new features.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-replay-attacks-on-zero-round-trip-time\"\u003ePrevent Replay Attacks on Zero Round-Trip Time\u003c/a\u003e\u003cbr\u003e\u003csup\u003e0-RTT is disabled by default but you should know that enabling this option creates a significant security risks.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-mitigation-of-crimebreach-attacks\"\u003eMitigation of CRIME/BREACH attacks\u003c/a\u003e\u003cbr\u003e\u003csup\u003eDisable HTTP compression or compress only zero sensitive content.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-deny-the-use-of-browser-features-feature-policy\"\u003eDeny the use of browser features (Feature-Policy)\u003c/a\u003e\u003cbr\u003e\u003csup\u003eA mechanism to allow and deny the use of browser features.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-control-buffer-overflow-attacks\"\u003eControl Buffer Overflow attacks\u003c/a\u003e\u003cbr\u003e\u003csup\u003ePrevents errors are characterised by the overwriting of memory fragments of the NGINX process.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-mitigating-slow-http-dos-attack-closing-slow-connections\"\u003eMitigating Slow HTTP DoS attacks (Closing Slow Connections)\u003c/a\u003e\u003cbr\u003e\u003csup\u003ePrevents attacks in which the attacker sends HTTP requests in pieces slowly.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHardening\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-and-pass-host-header-only-with-host-variable\"\u003eSet and pass Host header only with $host variable\u003c/a\u003e\u003cbr\u003e\u003csup\u003eUse of the $host is the only one guaranteed to have something sensible.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eReverse Proxy\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-always-pass-host-x-real-ip-and-x-forwarded-headers-to-the-backend\"\u003eAlways pass Host, X-Real-IP, and X-Forwarded headers to the backend\u003c/a\u003e\u003cbr\u003e\u003csup\u003eIt gives you more control of forwarded headers.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eReverse Proxy\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-the-certificate-chain-correctly\"\u003eSet the certificate chain correctly\u003c/a\u003e\u003cbr\u003e\u003csup\u003eSend the complete chain to the client.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eOthers\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-dns-caa-policy\"\u003eEnable DNS CAA Policy\u003c/a\u003e\u003cbr\u003e\u003csup\u003eAllows domain name holders to indicate to CA whether they are authorized to issue digital certificates.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eOthers\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png\" alt=\"medium\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-separate-listen-directives-for-80-and-443-ports\"\u003eSeparate listen directives for 80 and 443 ports\u003c/a\u003e\u003cbr\u003e\u003csup\u003eHelp you maintain and modify your configuration.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-only-one-ssl-config-for-the-listen-directive\"\u003eUse only one SSL config for the listen directive\u003c/a\u003e\u003cbr\u003e\u003csup\u003ePrevents multiple configurations on the same listening address.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-geomap-modules-instead-of-allowdeny\"\u003eUse geo/map modules instead of allow/deny\u003c/a\u003e\u003cbr\u003e\u003csup\u003eProvides the perfect way to block invalid visitors.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-global-root-directory-for-unmatched-locations\"\u003eSet global root directory for unmatched locations\u003c/a\u003e\u003cbr\u003e\u003csup\u003eSpecifies the root directory for an undefined locations.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-dont-duplicate-index-directive-use-it-only-in-the-http-block\"\u003eDon't duplicate index directive, use it only in the http block\u003c/a\u003e\u003cbr\u003e\u003csup\u003eWatch out for duplicating the same rules.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-adjust-worker-processes\"\u003eAdjust worker processes\u003c/a\u003e\u003cbr\u003e\u003csup\u003eYou can adjust this value to maximum throughput under high concurrency.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-make-an-exact-location-match-to-speed-up-the-selection-process\"\u003eMake an exact location match to speed up the selection process\u003c/a\u003e\u003cbr\u003e\u003csup\u003eExact location matches are often used to speed up the selection process.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-limit_conn-to-improve-limiting-the-download-speed\"\u003eUse limit_conn to improve limiting the download speed\u003c/a\u003e\u003cbr\u003e\u003csup\u003eLimits NGINX download speed per connection.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePerformance\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-be-careful-with-trailing-slashes-in-proxy_pass-directive\"\u003eBe careful with trailing slashes in proxy_pass directive\u003c/a\u003e\u003cbr\u003e\u003csup\u003eIncorrect setting could end up with some strange url.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eReverse Proxy\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-custom-headers-without-x--prefix\"\u003eUse custom headers without X- prefix\u003c/a\u003e\u003cbr\u003e\u003csup\u003eThe use of custom headers with X- prefix is discouraged.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eReverse Proxy\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-tweak-passive-health-checks\"\u003eTweak passive health checks\u003c/a\u003e\u003cbr\u003e\u003csup\u003eImprove behaviour of the passive health checks.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eLoad Balancing\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-define-security-policies-with-securitytxt\"\u003eDefine security policies with security.txt\u003c/a\u003e\u003cbr\u003e\u003csup\u003eHelps make things easier for companies and security researchers.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eOthers\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png\" alt=\"low\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-map-all-the-things\"\u003eMap all the things...\u003c/a\u003e\u003cbr\u003e\u003csup\u003eMap module provides a more elegant solution for clearly parsing a big list of regexes.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eBase Rules\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png\" alt=\"info\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-custom-log-formats\"\u003eUse custom log formats\u003c/a\u003e\u003cbr\u003e\u003csup\u003eThis is extremely helpful for debugging specific location directives.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eDebugging\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png\" alt=\"info\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-debug-mode-to-track-down-unexpected-behaviour\"\u003eUse debug mode to track down unexpected behaviour\u003c/a\u003e\u003cbr\u003e\u003csup\u003eThere's probably more detail than you want, but that can sometimes be a lifesaver.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eDebugging\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png\" alt=\"info\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-improve-debugging-by-disable-daemon-master-process-and-all-workers-except-one\"\u003eImprove debugging by disable daemon, master process, and all workers except one\u003c/a\u003e\u003cbr\u003e\u003csup\u003eThis simplifies the debugging and lets test configurations rapidly.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eDebugging\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png\" alt=\"info\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-core-dumps-to-figure-out-why-nginx-keep-crashing\"\u003eUse core dumps to figure out why NGINX keep crashing\u003c/a\u003e\u003cbr\u003e\u003csup\u003eEnable core dumps when your NGINX instance receive an unexpected error or when it crashed.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eDebugging\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png\" alt=\"info\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-mirror-module-to-copy-requests-to-another-backend\"\u003eUse mirror module to copy requests to another backend\u003c/a\u003e\u003cbr\u003e\u003csup\u003eUse mirroring for investigation and debugging of any original request.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eDebugging\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png\" alt=\"info\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-dont-disable-backends-by-comments-use-down-parameter\"\u003eDon't disable backends by comments, use down parameter\u003c/a\u003e\u003cbr\u003e\u003csup\u003eIs a good solution to marks the server as permanently unavailable.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eLoad Balancing\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png\" alt=\"info\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-tcpdump-to-diagnose-and-troubleshoot-the-http-issues\"\u003eUse tcpdump to diagnose and troubleshoot the HTTP issues\u003c/a\u003e\u003cbr\u003e\u003csup\u003eUse tcpdump to monitor HTTP.\u003c/sup\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eOthers\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png\"\u003e\u003cimg src=\"/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png\" alt=\"info\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBonus Stuff\u003c/h1\u003e\u003ca id=\"user-content-bonus-stuff\" class=\"anchor\" aria-label=\"Permalink: Bonus Stuff\" href=\"#bonus-stuff\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can find here a few of the different things I've worked and included to this repository. I hope that these extras will be useful.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eConfiguration reports\u003c/h2\u003e\u003ca id=\"user-content-configuration-reports\" class=\"anchor\" aria-label=\"Permalink: Configuration reports\" href=\"#configuration-reports\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMany of these recipes have been applied to the configuration of my old private website.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eAn example configuration is in the \u003ca href=\"#configuration-examples\"\u003econfiguration examples\u003c/a\u003e chapter. It's also based on \u003ca href=\"https://github.com/trimstray/nginx-admins-handbook/blob/master/static/img/cheatsheets/nginx-hardening-cheatsheet-tls13.png\"\u003ethis\u003c/a\u003e version of printable high-res hardening cheatsheets.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSSL Labs\u003c/h3\u003e\u003ca id=\"user-content-ssl-labs\" class=\"anchor\" aria-label=\"Permalink: SSL Labs\" href=\"#ssl-labs\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eRead about SSL Labs grading \u003ca href=\"https://community.qualys.com/docs/DOC-6321-ssl-labs-grading-2018\" rel=\"nofollow\"\u003ehere\u003c/a\u003e (SSL Labs Grading 2018).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eShort SSL Labs grades explanation:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eA+ is clearly the desired grade, both A and B grades are acceptable and result in adequate commercial security. The B grade, in particular, may be applied to configurations designed to support very wide audiences (for old clients)\u003c/em\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eI finally got \u003cstrong\u003eA+\u003c/strong\u003e grade and following scores:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eCertificate = \u003cstrong\u003e100%\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eProtocol Support = \u003cstrong\u003e100%\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eKey Exchange = \u003cstrong\u003e90%\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eCipher Strength = \u003cstrong\u003e90%\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eLook also at the following recommendations. I believe the right configuration of NGINX should give the following SSL Labs scores and provides the best security for the most cases:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eRecommended\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eA/A+\u003c/li\u003e\n\u003cli\u003eCertificate: 100/100\u003c/li\u003e\n\u003cli\u003eProtocol Support: 95/100\u003c/li\u003e\n\u003cli\u003eKey Exchange: 90/100\u003c/li\u003e\n\u003cli\u003eCipher Strength: 90/100\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003ePerfect but restrictive\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eA+\u003c/li\u003e\n\u003cli\u003eCertificate: 100/100\u003c/li\u003e\n\u003cli\u003eProtocol Support: 100/100\u003c/li\u003e\n\u003cli\u003eKey Exchange: 100/100\u003c/li\u003e\n\u003cli\u003eCipher Strength: 100/100\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/trimstray/nginx-admins-handbook/blob/master/static/img/blkcipher_ssllabs_preview.png\"\u003e\u003cimg src=\"https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/blkcipher_ssllabs_preview.png\" alt=\"blkcipher_ssllabs_preview\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSomething about SSL Labs grading mechanism (that's an interesting point of view):\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eThe whole grading mechanism is more propaganda and public relations than actual security. If you want good security, then you must mind the details and understand how things work internally. If you want a good grade then you should do whatever it takes to have a good grade. An \"A+\" from SSL Labs is a very nifty thing to add at the end of a report, but it does not really equate with having rock solid security. Having an \"A+\" equates with being able to say \"I have an A+\".\u003c/em\u003e - from \u003ca href=\"https://security.stackexchange.com/a/112539\" rel=\"nofollow\"\u003ethis\u003c/a\u003e answer by \u003ca href=\"https://security.stackexchange.com/users/5411/tom-leek\" rel=\"nofollow\"\u003eTom Leek\u003c/a\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMozilla Observatory\u003c/h3\u003e\u003ca id=\"user-content-mozilla-observatory\" class=\"anchor\" aria-label=\"Permalink: Mozilla Observatory\" href=\"#mozilla-observatory\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eRead about Mozilla Observatory \u003ca href=\"https://observatory.mozilla.org/faq/\" rel=\"nofollow\"\u003ehere\u003c/a\u003e and about \u003ca href=\"https://github.com/mozilla/http-observatory/blob/master/httpobs/docs/scoring.md\"\u003eObservatory Scoring Methodology\u003c/a\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eI also got the highest summary note (\u003cstrong\u003eA+\u003c/strong\u003e) on the Observatory with a very high test score (120/100, max. 135/100):\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/trimstray/nginx-admins-handbook/blob/master/static/img/blkcipher_mozilla_observatory_preview.png\"\u003e\u003cimg src=\"https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/blkcipher_mozilla_observatory_preview.png\" alt=\"blkcipher_mozilla_observatory_preview\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePrintable hardening cheatsheets\u003c/h2\u003e\u003ca id=\"user-content-printable-hardening-cheatsheets\" class=\"anchor\" aria-label=\"Permalink: Printable hardening cheatsheets\" href=\"#printable-hardening-cheatsheets\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eI created two versions of printable posters with hardening cheatsheets (High-Res 5000x8800) based on recipes from this handbook:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eFor \u003ccode\u003excf\u003c/code\u003e and \u003ccode\u003epdf\u003c/code\u003e formats please see \u003ca href=\"https://github.com/trimstray/nginx-admins-handbook/tree/master/static/img\"\u003ethis\u003c/a\u003e directory.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eA+\u003c/strong\u003e with all \u003cstrong\u003e100%’s\u003c/strong\u003e on @ssllabs and \u003cstrong\u003e120/100\u003c/strong\u003e on @mozilla observatory:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eIt provides the highest scores of the SSL Labs test. Setup is very restrictive with 4096-bit private key, only TLS 1.2, and also modern strict TLS cipher suites (non 128-bits). Think carefully about its use (no TLS 1.3, restrictive cipher suites), in my opinion, it is only suitable for obtaining the highest possible rating and seems a little impractical.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/trimstray/nginx-admins-handbook/blob/master/static/img/cheatsheets/nginx-hardening-cheatsheet-tls12-100p.png\"\u003e\u003cimg src=\"https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/cheatsheets/nginx-hardening-cheatsheet-tls12-100p.png\" alt=\"nginx-hardening-cheatsheet-100p\" width=\"92%\" height=\"92%\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eA+\u003c/strong\u003e on @ssllabs and \u003cstrong\u003e120/100\u003c/strong\u003e on @mozilla observatory with TLS 1.3 support:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eIt provides less restrictive setup with 2048-bit key for \u003ccode\u003eRSA\u003c/code\u003e or 256-bit key for \u003ccode\u003eECC\u003c/code\u003e, TLS 1.3 and 1.2, modern strict TLS cipher suites (128/256-bits), and 2048-bit predefined \u003ccode\u003eDH\u003c/code\u003e groups recommended by Mozilla. The final grade is also in line with the industry standards and guidance. Recommend using this, for me, it is very reasonable configuration.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/trimstray/nginx-admins-handbook/blob/master/static/img/cheatsheets/nginx-hardening-cheatsheet-tls13.png\"\u003e\u003cimg src=\"https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/cheatsheets/nginx-hardening-cheatsheet-tls13.png\" alt=\"nginx-hardening-cheatsheet-tls13\" width=\"92%\" height=\"92%\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFully automatic installation\u003c/h2\u003e\u003ca id=\"user-content-fully-automatic-installation\" class=\"anchor\" aria-label=\"Permalink: Fully automatic installation\" href=\"#fully-automatic-installation\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eI created a set of scripts for unattended installation of NGINX from the raw, uncompiled code. It allows you to easily install, create a setup for dependencies (like \u003ccode\u003ezlib\u003c/code\u003e or \u003ccode\u003eopenssl\u003c/code\u003e), and customized with installation parameters.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor more information please see \u003ca href=\"https://github.com/trimstray/nginx-admins-handbook/tree/master/lib\"\u003eInstalling from source - Automatic installation\u003c/a\u003e chapter which describes the installation of NGINX on systems/distros such as Ubuntu, Debian, CentOS, and FreeBSD.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eStatic error pages generator\u003c/h2\u003e\u003ca id=\"user-content-static-error-pages-generator\" class=\"anchor\" aria-label=\"Permalink: Static error pages generator\" href=\"#static-error-pages-generator\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eI created a simple to use generator for static pages to replace the default error pages that comes with any web server like NGINX.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor more information please see \u003ca href=\"https://github.com/trimstray/nginx-admins-handbook/tree/master/lib/nginx/snippets/http-error-pages#http-static-error-pages-generator\"\u003eHTTP Static Error Pages Generator\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eServer names parser\u003c/h2\u003e\u003ca id=\"user-content-server-names-parser\" class=\"anchor\" aria-label=\"Permalink: Server names parser\" href=\"#server-names-parser\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eI added scripts for fast multiple domain searching in the configuration. These tools get specific \u003ccode\u003eserver_name\u003c/code\u003e matches and print them on the screen as a \u003ccode\u003eserver { ... }\u003c/code\u003e blocks. Both are very helpful if you really have tons of domains or if you want to list specific vhosts from file or the active configuration.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou must follow one important rule to be able to use it. Your server block must have the following structure:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-nginx notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"server {\n\n server_name example.com example.org;\n\n ... # other directives\n\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eserver\u003c/span\u003e {\n\n \u003cspan class=\"pl-k\"\u003eserver_name\u003c/span\u003e example.com example.org;\n\n ... \u003cspan class=\"pl-c\"\u003e# other directives\u003c/span\u003e\n\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eExample of use:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"./snippets/server-name-parser/check-server-name.sh example.com\nSearching 'example.com' in '/usr/local/etc/nginx' (from disk)\n\n/usr/local/etc/nginx/domains/example.com/servers.conf:79: return 301 https://example.com$request_uri;\n/usr/local/etc/nginx/domains/example.com/servers.conf:252: return 301 https://example.com$request_uri;\n/usr/local/etc/nginx/domains/example.com/servers.conf:3825: server_name example.com;\n\nSearching 'example.com' in server contexts (from a running process)\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; BEG \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\nserver {\n\n include listen/192.168.252.10/https.example.com.conf;\n\n server_name example.com;\n\n location / {\n\n return 204 \u0026quot;RFC 792\u0026quot;;\n\n }\n\n access_log /var/log/nginx/example.com/access.log standard;\n error_log /var/log/nginx/example.com/error.log warn;\n\n}\n\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt; END \u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e./snippets/server-name-parser/check-server-name.sh example.com\nSearching 'example.com' in '/usr/local/etc/nginx' (from disk)\n\n/usr/local/etc/nginx/domains/example.com/servers.conf:79: return 301 https://example.com$request_uri;\n/usr/local/etc/nginx/domains/example.com/servers.conf:252: return 301 https://example.com$request_uri;\n/usr/local/etc/nginx/domains/example.com/servers.conf:3825: server_name example.com;\n\nSearching 'example.com' in server contexts (from a running process)\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; BEG \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\nserver {\n\n include listen/192.168.252.10/https.example.com.conf;\n\n server_name example.com;\n\n location / {\n\n return 204 \"RFC 792\";\n\n }\n\n access_log /var/log/nginx/example.com/access.log standard;\n error_log /var/log/nginx/example.com/error.log warn;\n\n}\n\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt; END \u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor more information please see \u003ca href=\"https://github.com/trimstray/nginx-admins-handbook/tree/master/lib/nginx/snippets/server-name-parser\"\u003esnippets/server-name-parser\u003c/a\u003e directory.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBooks\u003c/h1\u003e\u003ca id=\"user-content-books\" class=\"anchor\" aria-label=\"Permalink: Books\" href=\"#books\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"https://www.amazon.com/Nginx-Essentials-Valery-Kholodkov/dp/1785289535\" rel=\"nofollow\"\u003eNginx Essentials\u003c/a\u003e\u003c/h4\u003e\u003ca id=\"user-content-nginx-essentials\" class=\"anchor\" aria-label=\"Permalink: Nginx Essentials\" href=\"#nginx-essentials\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAuthors: \u003cstrong\u003eValery Kholodkov\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eExcel in Nginx quickly by learning to use its most essential features in real-life applications.\u003c/em\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cem\u003eLearn how to set up, configure, and operate an Nginx installation for day-to-day use\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eExplore the vast features of Nginx to manage it like a pro, and use them successfully to run your website\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eExample-based guide to get the best out of Nginx to reduce resource usage footprint\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003csup\u003e\u003ci\u003eThis short review comes from this book or the store.\u003c/i\u003e\u003c/sup\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"https://www.oreilly.com/library/view/nginx-cookbook/9781492049098/\" rel=\"nofollow\"\u003eNginx Cookbook\u003c/a\u003e\u003c/h4\u003e\u003ca id=\"user-content-nginx-cookbook\" class=\"anchor\" aria-label=\"Permalink: Nginx Cookbook\" href=\"#nginx-cookbook\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAuthors: \u003cstrong\u003eDerek DeJonghe\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eYou’ll find recipes for:\u003c/em\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cem\u003eTraffic management and A/B testing\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eManaging programmability and automation with dynamic templating and the NGINX Plus API\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eSecuring access through encrypted traffic, secure links, HTTP authentication subrequests, and more\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eDeploying NGINX to AWS, Azure, and Google cloud-computing services\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eUsing Docker to deploy containers and microservices\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eDebugging and troubleshooting, performance tuning, and practical ops tips\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003csup\u003e\u003ci\u003eThis short review comes from this book or the store.\u003c/i\u003e\u003c/sup\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"https://www.amazon.com/Nginx-HTTP-Server-Harness-infrastructure/dp/178862355X\" rel=\"nofollow\"\u003eNginx HTTP Server\u003c/a\u003e\u003c/h4\u003e\u003ca id=\"user-content-nginx-http-server\" class=\"anchor\" aria-label=\"Permalink: Nginx HTTP Server\" href=\"#nginx-http-server\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAuthors: \u003cstrong\u003eMartin Fjordvald\u003c/strong\u003e, \u003cstrong\u003eClement Nedelcu\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eHarness the power of Nginx to make the most of your infrastructure and serve pages faster than ever.\u003c/em\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cem\u003eDiscover possible interactions between Nginx and Apache to get the best of both worlds\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eLearn to exploit the features offered by Nginx for your web applications\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eGet your hands on the most updated version of Nginx (1.13.2) to support all your web administration requirements\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003csup\u003e\u003ci\u003eThis short review comes from this book or the store.\u003c/i\u003e\u003c/sup\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"https://www.amazon.com/Nginx-High-Performance-Rahul-Sharma/dp/1785281836\" rel=\"nofollow\"\u003eNginx High Performance\u003c/a\u003e\u003c/h4\u003e\u003ca id=\"user-content-nginx-high-performance\" class=\"anchor\" aria-label=\"Permalink: Nginx High Performance\" href=\"#nginx-high-performance\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAuthors: \u003cstrong\u003eRahul Sharma\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eOptimize NGINX for high-performance, scalable web applications.\u003c/em\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cem\u003eConfigure Nginx for best performance, with configuration examples and explanations\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eStep-by-step tutorials for performance testing using open source software\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eTune the TCP stack to make the most of the available infrastructure\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003csup\u003e\u003ci\u003eThis short review comes from this book or the store.\u003c/i\u003e\u003c/sup\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"https://www.amazon.com/Mastering-Nginx-Dimitri-Aivaliotis/dp/1849517444\" rel=\"nofollow\"\u003eMastering Nginx\u003c/a\u003e\u003c/h4\u003e\u003ca id=\"user-content-mastering-nginx\" class=\"anchor\" aria-label=\"Permalink: Mastering Nginx\" href=\"#mastering-nginx\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAuthors: \u003cstrong\u003eDimitri Aivaliotis\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eWritten for experienced systems administrators and engineers, this book teaches you from scratch how to configure Nginx for any situation. Step-by-step instructions and real-world code snippets clarify even the most complex areas.\u003c/em\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003csup\u003e\u003ci\u003eThis short review comes from this book or the store.\u003c/i\u003e\u003c/sup\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"https://www.nginx.com/resources/library/modsecurity-3-nginx-quick-start-guide/\" rel=\"nofollow\"\u003eModSecurity 3.0 and NGINX: Quick Start Guide\u003c/a\u003e\u003c/h4\u003e\u003ca id=\"user-content-modsecurity-30-and-nginx-quick-start-guide\" class=\"anchor\" aria-label=\"Permalink: ModSecurity 3.0 and NGINX: Quick Start Guide\" href=\"#modsecurity-30-and-nginx-quick-start-guide\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAuthors: \u003cstrong\u003eFaisal Memon\u003c/strong\u003e, \u003cstrong\u003eOwen Garrett\u003c/strong\u003e, \u003cstrong\u003eMichael Pleshakov\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eLearn in this ebook how to get started with ModSecurity, the world’s most widely deployed web application firewall (WAF), now available for NGINX and NGINX Plus.\u003c/em\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003csup\u003e\u003ci\u003eThis short review comes from this book or the store.\u003c/i\u003e\u003c/sup\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"https://www.nginx.com/resources/library/cisco-ace-nginx-migration-guide/\" rel=\"nofollow\"\u003eCisco ACE to NGINX: Migration Guide\u003c/a\u003e\u003c/h4\u003e\u003ca id=\"user-content-cisco-ace-to-nginx-migration-guide\" class=\"anchor\" aria-label=\"Permalink: Cisco ACE to NGINX: Migration Guide\" href=\"#cisco-ace-to-nginx-migration-guide\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAuthors: \u003cstrong\u003eFaisal Memon\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eThis ebook provides step-by-step instructions on replacing Cisco ACE with NGINX and off-the-shelf servers. NGINX helps you cut costs and modernize.\u003c/em\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eIn this ebook you will learn:\u003c/em\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cem\u003eHow to migrate Cisco ACE configuration to NGINX, with detailed examples\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eWhy you should go with a software load balancer, and not hardware\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003csup\u003e\u003ci\u003eThis short review comes from this book or the store.\u003c/i\u003e\u003c/sup\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eExternal Resources\u003c/h1\u003e\u003ca id=\"user-content-external-resources\" class=\"anchor\" aria-label=\"Permalink: External Resources\" href=\"#external-resources\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNginx official\u003c/h5\u003e\u003ca id=\"user-content-nginx-official\" class=\"anchor\" aria-label=\"Permalink: Nginx official\" href=\"#nginx-official\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://www.nginx.com/\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Project\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://nginx.org/en/docs/\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Documentation\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.nginx.com/resources/wiki/\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Wiki\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://docs.nginx.com/nginx/admin-guide/\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Admin's Guide\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Pitfalls and Common Mistakes\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://nginx.org/en/docs/dev/development_guide.html\" rel=\"nofollow\"\u003e\u003cb\u003eDevelopment Guide\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://forum.nginx.org/\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Forum\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://nginx.org/en/security_advisories.html\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Security Advisories\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://docs.nginx.com/nginx/admin-guide/security-controls/\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Security Controls\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://mailman.nginx.org/mailman/listinfo/nginx\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Mailing List\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/nginx/nginx\"\u003e\u003cb\u003eNginx Read-only Mirror\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/nginxinc/NGINX-Demos\"\u003e\u003cb\u003eNGINX-Demos\n\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.nginx.com/blog/thread-pools-boost-performance-9x/\" rel=\"nofollow\"\u003e\u003cb\u003eThread Pools in NGINX Boost Performance 9x!\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNginx distributions\u003c/h5\u003e\u003ca id=\"user-content-nginx-distributions\" class=\"anchor\" aria-label=\"Permalink: Nginx distributions\" href=\"#nginx-distributions\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://openresty.org/\" rel=\"nofollow\"\u003e\u003cb\u003eOpenResty\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://tengine.taobao.org/\" rel=\"nofollow\"\u003e\u003cb\u003eThe Tengine Web Server\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eComparison reviews\u003c/h5\u003e\u003ca id=\"user-content-comparison-reviews\" class=\"anchor\" aria-label=\"Permalink: Comparison reviews\" href=\"#comparison-reviews\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://www.hostingadvice.com/how-to/nginx-vs-apache/\" rel=\"nofollow\"\u003e\u003cb\u003eNGINX vs. Apache (Pro/Con Review, Uses, \u0026amp; Hosting for Each)\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/jiangwenyuan/nuster/wiki/Web-cache-server-performance-benchmark:-nuster-vs-nginx-vs-varnish-vs-squid\"\u003e\u003cb\u003eWeb cache server performance benchmark: nuster vs nginx vs varnish vs squid\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCheatsheets \u0026amp; References\u003c/h5\u003e\u003ca id=\"user-content-cheatsheets--references\" class=\"anchor\" aria-label=\"Permalink: Cheatsheets \u0026amp; References\" href=\"#cheatsheets--references\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://openresty.org/download/agentzh-nginx-tutorials-en.html\" rel=\"nofollow\"\u003e\u003cb\u003eagentzh's Nginx Tutorials\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://agentzh.org/misc/slides/nginx-conf-scripting/nginx-conf-scripting.html#1\" rel=\"nofollow\"\u003e\u003cb\u003eIntroduction to nginx.conf scripting\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://www.nginx-discovery.com/\" rel=\"nofollow\"\u003e\u003cb\u003eNginx discovery journey\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://www.nginxguts.com/\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Guts\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://gist.github.com/carlessanagustin/9509d0d31414804da03b\"\u003e\u003cb\u003eNginx Cheatsheet\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://www.scalescale.com/tips/nginx/\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Tutorials, Linux Sysadmin Configuration \u0026amp; Optimizing Tips and Tricks\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/h5bp/server-configs-nginx\"\u003e\u003cb\u003eNginx boilerplate configs\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/nginx-boilerplate/nginx-boilerplate\"\u003e\u003cb\u003eAwesome Nginx configuration template\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/SimulatedGREG/nginx-cheatsheet\"\u003e\u003cb\u003eNginx Quick Reference\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/fcambus/nginx-resources\"\u003e\u003cb\u003eA collection of resources covering Nginx and more\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/lebinh/nginx-conf\"\u003e\u003cb\u003eA collection of useful Nginx configuration snippets\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/elasticweb/nginx-configs\"\u003e\u003cb\u003eNginx configurations for most popular CMS/CMF/Frameworks based on PHP\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/wmnnd/nginx-certbot\"\u003e\u003cb\u003eBoilerplate configuration for nginx and certbot with docker-compose\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePerformance \u0026amp; Hardening\u003c/h5\u003e\u003ca id=\"user-content-performance--hardening\" class=\"anchor\" aria-label=\"Permalink: Performance \u0026amp; Hardening\" href=\"#performance--hardening\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://github.com/denji/nginx-tuning\"\u003e\u003cb\u003eNginx Tuning For Best Performance by Denji\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://thoughts.t37.net/nginx-optimization-understanding-sendfile-tcp-nodelay-and-tcp-nopush-c55cdd276765\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Optimization: understanding sendfile, tcp_nodelay and tcp_nopush\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://blog.cloudflare.com/how-we-scaled-nginx-and-saved-the-world-54-years-every-day/\" rel=\"nofollow\"\u003e\u003cb\u003eHow we scaled nginx and saved the world 54 years every day\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://istlsfastyet.com/\" rel=\"nofollow\"\u003e\u003cb\u003eTLS has exactly one performance problem: it is not used widely enough\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.ssllabs.com/projects/best-practices/\" rel=\"nofollow\"\u003e\u003cb\u003eSSL/TLS Deployment Best Practices\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.ssllabs.com/projects/rating-guide/index.html\" rel=\"nofollow\"\u003e\u003cb\u003eSSL Server Rating Guide\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.ssllabs.com/ssl-pulse/\" rel=\"nofollow\"\u003e\u003cb\u003eSSL Pulse\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.upguard.com/blog/how-to-build-a-tough-nginx-server-in-15-steps\" rel=\"nofollow\"\u003e\u003cb\u003eHow to Build a Tough NGINX Server in 15 Steps\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.cyberciti.biz/tips/linux-unix-bsd-nginx-webserver-security.html\" rel=\"nofollow\"\u003e\u003cb\u003eTop 25 Nginx Web Server Best Security Practices\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://calomel.org/nginx.html\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Secure Web Server\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html\" rel=\"nofollow\"\u003e\u003cb\u003eStrong SSL Security on Nginx\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://enable-cors.org/index.html\" rel=\"nofollow\"\u003e\u003cb\u003eEnable cross-origin resource sharing (CORS)\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/nbs-system/naxsi\"\u003e\u003cb\u003eNAXSI - WAF for Nginx\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://geekflare.com/install-modsecurity-on-nginx/\" rel=\"nofollow\"\u003e\u003cb\u003eModSecurity for Nginx\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePresentations \u0026amp; Videos\u003c/h5\u003e\u003ca id=\"user-content-presentations--videos\" class=\"anchor\" aria-label=\"Permalink: Presentations \u0026amp; Videos\" href=\"#presentations--videos\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://www.slideshare.net/Nginx/nginx-basics-and-best-practices\" rel=\"nofollow\"\u003e\u003cb\u003eNGINX: Basics and Best Practices\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.slideshare.net/Nginx/nginx-installation-and-tuning\" rel=\"nofollow\"\u003e\u003cb\u003eNGINX Installation and Tuning\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.slideshare.net/joshzhu/nginx-internals\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Internals (by Joshua Zhu)\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.slideshare.net/feifengxlq/nginx-internals-10514355\" rel=\"nofollow\"\u003e\u003cb\u003eNginx internals (by Liqiang Xu)\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.slideshare.net/wallarm/how-to-secure-your-web-applications-with-nginx\" rel=\"nofollow\"\u003e\u003cb\u003eHow to secure your web applications with NGINX\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.slideshare.net/chartbeat/tuning-tcp-and-nginx-on-ec2\" rel=\"nofollow\"\u003e\u003cb\u003eTuning TCP and NGINX on EC2\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.slideshare.net/trygvevea/extending-functionality-in-nginx-with-modules\" rel=\"nofollow\"\u003e\u003cb\u003eExtending functionality in nginx, with modules!\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.slideshare.net/tuxtoti/nginx-tips-and-tricks-13087831\" rel=\"nofollow\"\u003e\u003cb\u003eNginx - Tips and Tricks.\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.slideshare.net/TonyFabeen/nginx-scripting-extending-nginx-functionalities-with-lua\" rel=\"nofollow\"\u003e\u003cb\u003eNginx Scripting - Extending Nginx Functionalities with Lua\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.slideshare.net/kazeburo/advanced-nginx-in-mercari-how-to-handle-over-1200000-https-reqsmin\" rel=\"nofollow\"\u003e\u003cb\u003eHow to handle over 1,200,000 HTTPS Reqs/Min\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.slideshare.net/harukayon/ngx-lua-public\" rel=\"nofollow\"\u003e\u003cb\u003eUsing ngx_lua / lua-nginx-module in pixiv\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://mdounin.ru/files/mdounin-nginx-whatsnew-nginxconf2018.pdf\" rel=\"nofollow\"\u003e\u003cb\u003eReading nginx CHANGES together\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://mdounin.ru/files/mdounin-dynamic-modules-nginxconf2016.pdf\" rel=\"nofollow\"\u003e\u003cb\u003eDynamic modules:how it works\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.youtube.com/playlist?list=PLGz_X9w9raXewvc6tjIGGFZ6DBKHEld3k\" rel=\"nofollow\"\u003e\u003cb\u003eNGINX Conf 2014\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.youtube.com/playlist?list=PLGz_X9w9raXdED9BR6GQ61A6d3fBzjpbn\" rel=\"nofollow\"\u003e\u003cb\u003eNGINX Conf 2015\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.youtube.com/playlist?list=PLGz_X9w9raXcOsB_dT26iu0BvbSxWYG1g\" rel=\"nofollow\"\u003e\u003cb\u003eNGINX Conf 2016\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.youtube.com/playlist?list=PLGz_X9w9raXeT-z_rcZ9yF0kV5SENZ-yt\" rel=\"nofollow\"\u003e\u003cb\u003eNGINX Conf 2017\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.youtube.com/playlist?list=PLGz_X9w9raXeHhKRX6ZS7vmFKN12iYOw9\" rel=\"nofollow\"\u003e\u003cb\u003eNGINX Conf 2018 | Deep Dive Track\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.youtube.com/playlist?list=PLGz_X9w9raXe_Vc708VKvr5KJ4gnf1WxS\" rel=\"nofollow\"\u003e\u003cb\u003eNGINX Conf 2018 | Keynotes and Sessions\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.youtube.com/watch?v=iHxD-G0YjiU\" rel=\"nofollow\"\u003e\u003cb\u003eMaking HTTPS Fast(er): Ilya Grigorik @ nginx.conf 2014\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePlaygrounds\u003c/h5\u003e\u003ca id=\"user-content-playgrounds\" class=\"anchor\" aria-label=\"Permalink: Playgrounds\" href=\"#playgrounds\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://github.com/sportebois/nginx-rate-limit-sandbox\"\u003e\u003cb\u003eNGINX Rate Limit, Burst and nodelay sandbox\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eConfig generators\u003c/h5\u003e\u003ca id=\"user-content-config-generators\" class=\"anchor\" aria-label=\"Permalink: Config generators\" href=\"#config-generators\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://nginxconfig.io/\" rel=\"nofollow\"\u003e\u003cb\u003enginxconfig\u003c/b\u003e\u003c/a\u003e - Nginx config generator on steroids.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/mozilla/ssl-config-generator\"\u003e\u003cb\u003essl-config-generator\u003c/b\u003e\u003c/a\u003e - Mozilla SSL Configuration Generator.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/linkedin/nginx-config-builder\"\u003e\u003cb\u003enginx-config-builder\u003c/b\u003e\u003c/a\u003e - is a python library for building nginx configuration files programatically.\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eConfig parsers\u003c/h5\u003e\u003ca id=\"user-content-config-parsers\" class=\"anchor\" aria-label=\"Permalink: Config parsers\" href=\"#config-parsers\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://github.com/nginxinc/crossplane\"\u003e\u003cb\u003ecrossplane\u003c/b\u003e\u003c/a\u003e - quick and reliable way to convert NGINX configurations into JSON and back.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/fatiherikli/nginxparser\"\u003e\u003cb\u003enginxparser\u003c/b\u003e\u003c/a\u003e - parses nginx configuration with Pyparsing.\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eConfig managers\u003c/h5\u003e\u003ca id=\"user-content-config-managers\" class=\"anchor\" aria-label=\"Permalink: Config managers\" href=\"#config-managers\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://github.com/jdauphant/ansible-role-nginx\"\u003e\u003cb\u003eansible-role-nginx\u003c/b\u003e\u003c/a\u003e - asible role to install and manage nginx configuration.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/geerlingguy/ansible-role-nginx\"\u003e\u003cb\u003eansible-role-nginx\u003c/b\u003e\u003c/a\u003e - installs and configures the latest version of Nginx.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/nginxinc/ansible-role-nginx\"\u003e\u003cb\u003eansible-role-nginx\u003c/b\u003e\u003c/a\u003e - installs NGINX, NGINX Plus, the NGINX Amplify agent, and more.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/voxpupuli/puppet-nginx\"\u003e\u003cb\u003epuppet-nginx\u003c/b\u003e\u003c/a\u003e - puppet module to manage NGINX on various UNIXes.\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eStatic analyzers\u003c/h5\u003e\u003ca id=\"user-content-static-analyzers\" class=\"anchor\" aria-label=\"Permalink: Static analyzers\" href=\"#static-analyzers\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://github.com/yandex/gixy\"\u003e\u003cb\u003egixy\u003c/b\u003e\u003c/a\u003e - is a tool to analyze Nginx configuration to prevent security misconfiguration and automate flaw detection.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/1connect/nginx-config-formatter\"\u003e\u003cb\u003enginx-config-formatter\u003c/b\u003e\u003c/a\u003e - Nginx config file formatter/beautifier written in Python.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/vasilevich/nginxbeautifier\"\u003e\u003cb\u003enginxbeautifier\u003c/b\u003e\u003c/a\u003e - format and beautify Nginx config files.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/lovette/nginx-tools/tree/master/nginx-minify-conf\"\u003e\u003cb\u003enginx-minify-conf\u003c/b\u003e\u003c/a\u003e - creates a minified version of a Nginx configuration.\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLog analyzers\u003c/h5\u003e\u003ca id=\"user-content-log-analyzers\" class=\"anchor\" aria-label=\"Permalink: Log analyzers\" href=\"#log-analyzers\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://goaccess.io/\" rel=\"nofollow\"\u003e\u003cb\u003eGoAccess\u003c/b\u003e\u003c/a\u003e - is a fast, terminal-based log analyzer (quickly analyze and view web server statistics in real time).\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.graylog.org/\" rel=\"nofollow\"\u003e\u003cb\u003eGraylog\u003c/b\u003e\u003c/a\u003e - is a leading centralized log management for capturing, storing, and enabling real-time analysis.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.elastic.co/products/logstash\" rel=\"nofollow\"\u003e\u003cb\u003eLogstash\u003c/b\u003e\u003c/a\u003e - is an open source, server-side data processing pipeline.\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePerformance analyzers\u003c/h5\u003e\u003ca id=\"user-content-performance-analyzers\" class=\"anchor\" aria-label=\"Permalink: Performance analyzers\" href=\"#performance-analyzers\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://github.com/lebinh/ngxtop\"\u003e\u003cb\u003engxtop\u003c/b\u003e\u003c/a\u003e - parses your Nginx access log and outputs useful, top-like, metrics of your Nginx server.\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBuilder tools\u003c/h5\u003e\u003ca id=\"user-content-builder-tools\" class=\"anchor\" aria-label=\"Permalink: Builder tools\" href=\"#builder-tools\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://github.com/TinkoffCreditSystems/Nginx-builder\"\u003e\u003cb\u003eNginx-builder\u003c/b\u003e\u003c/a\u003e - is a tool for building deb or rpm package NGINX from the source code.\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBenchmarking tools\u003c/h5\u003e\u003ca id=\"user-content-benchmarking-tools\" class=\"anchor\" aria-label=\"Permalink: Benchmarking tools\" href=\"#benchmarking-tools\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://httpd.apache.org/docs/2.4/programs/ab.html\" rel=\"nofollow\"\u003e\u003cb\u003eab\u003c/b\u003e\u003c/a\u003e - is a single-threaded command line tool for measuring the performance of HTTP web servers.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.joedog.org/siege-home/\" rel=\"nofollow\"\u003e\u003cb\u003esiege\u003c/b\u003e\u003c/a\u003e - is an http load testing and benchmarking utility.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/wg/wrk\"\u003e\u003cb\u003ewrk\u003c/b\u003e\u003c/a\u003e - is a modern HTTP benchmarking tool capable of generating significant load.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/giltene/wrk2\"\u003e\u003cb\u003ewrk2\u003c/b\u003e\u003c/a\u003e - is a constant throughput, correct latency recording variant of wrk.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/tsenart/vegeta\"\u003e\u003cb\u003evegeta\u003c/b\u003e\u003c/a\u003e - HTTP load testing tool and library.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/codesenberg/bombardier\"\u003e\u003cb\u003ebombardier\u003c/b\u003e\u003c/a\u003e - is a HTTP(S) benchmarking tool.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/cmpxchg16/gobench\"\u003e\u003cb\u003egobench\u003c/b\u003e\u003c/a\u003e - is a HTTP/HTTPS load testing and benchmarking tool.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/rakyll/hey\"\u003e\u003cb\u003ehey\u003c/b\u003e\u003c/a\u003e - is a HTTP load generator, ApacheBench (ab) replacement, formerly known as rakyll/boom.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/tarekziade/boom\"\u003e\u003cb\u003eboom\u003c/b\u003e\u003c/a\u003e - is a script you can use to quickly smoke-test your web app deployment.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/tarekziade/httperf\"\u003e\u003cb\u003ehttperf\u003c/b\u003e\u003c/a\u003e - the httperf HTTP load generator.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://jmeter.apache.org/\" rel=\"nofollow\"\u003e\u003cb\u003eJMeter™\u003c/b\u003e\u003c/a\u003e - is designed to load test functional behavior and measure performance.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://gatling.io/\" rel=\"nofollow\"\u003e\u003cb\u003eGatling\u003c/b\u003e\u003c/a\u003e - is a powerful open-source load and performance testing tool for web applications.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/locustio/locust\"\u003e\u003cb\u003elocust\u003c/b\u003e\u003c/a\u003e - is an easy-to-use, distributed, user load testing tool.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/gkbrk/slowloris\"\u003e\u003cb\u003eslowloris\u003c/b\u003e\u003c/a\u003e - low bandwidth DoS tool. Slowloris rewrite in Python.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/shekyan/slowhttptest\"\u003e\u003cb\u003eslowhttptest\u003c/b\u003e\u003c/a\u003e - application layer DoS attack simulator.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/jseidl/GoldenEye\"\u003e\u003cb\u003eGoldenEye\u003c/b\u003e\u003c/a\u003e - GoldenEye Layer 7 (KeepAlive+NoCache) DoS test tool.\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDebugging tools\u003c/h5\u003e\u003ca id=\"user-content-debugging-tools\" class=\"anchor\" aria-label=\"Permalink: Debugging tools\" href=\"#debugging-tools\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://strace.io/\" rel=\"nofollow\"\u003e\u003cb\u003estrace\u003c/b\u003e\u003c/a\u003e - is a diagnostic, debugging and instructional userspace utility (linux syscall tracer) for Linux.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.gnu.org/software/gdb/\" rel=\"nofollow\"\u003e\u003cb\u003eGDB\u003c/b\u003e\u003c/a\u003e - allows you to see what is going on `inside' another program while it executes.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://sourceware.org/systemtap/\" rel=\"nofollow\"\u003e\u003cb\u003eSystemTap\u003c/b\u003e\u003c/a\u003e - provides infrastructure to simplify the gathering of information about the running Linux system.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/openresty/stapxx\"\u003e\u003cb\u003estapxx\u003c/b\u003e\u003c/a\u003e - simple macro language extensions to SystemTap.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/trimstray/htrace.sh\"\u003e\u003cb\u003ehtrace.sh\u003c/b\u003e\u003c/a\u003e - is a simple Swiss Army knife for http/https troubleshooting and profiling.\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSecurity \u0026amp; Web testing tools\u003c/h5\u003e\u003ca id=\"user-content-security--web-testing-tools\" class=\"anchor\" aria-label=\"Permalink: Security \u0026amp; Web testing tools\" href=\"#security--web-testing-tools\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://portswigger.net/burp\" rel=\"nofollow\"\u003e\u003cb\u003eBurp Suite\u003c/b\u003e\u003c/a\u003e - is a graphical tool for testing Web application security.\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://w3af.org/\" rel=\"nofollow\"\u003e\u003cb\u003ew3af\u003c/b\u003e\u003c/a\u003e - is a Web Application Attack and Audit Framework.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/sullo/nikto\"\u003e\u003cb\u003enikto\u003c/b\u003e\u003c/a\u003e - web server scanner which performs comprehensive tests.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/ssllabs/ssllabs-scan\"\u003e\u003cb\u003essllabs-scan\u003c/b\u003e\u003c/a\u003e - client for SSL Labs APIs, designed for automated and/or bulk testing.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/mozilla/http-observatory\"\u003e\u003cb\u003ehttp-observatory\u003c/b\u003e\u003c/a\u003e - Mozilla HTTP Observatory.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://testssl.sh/\" rel=\"nofollow\"\u003e\u003cb\u003etestssl.sh\u003c/b\u003e\u003c/a\u003e - checks a server's service on any port for the support of TLS/SSL ciphers.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/nabla-c0d3/sslyze\"\u003e\u003cb\u003esslyze\u003c/b\u003e\u003c/a\u003e - is a fast and powerful SSL/TLS server scanning library.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/mozilla/cipherscan\"\u003e\u003cb\u003ecipherscan\u003c/b\u003e\u003c/a\u003e - is a very simple way to find out which SSL ciphersuites are supported by a target.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/OWASP/O-Saft\"\u003e\u003cb\u003eO-Saft\u003c/b\u003e\u003c/a\u003e - OWASP SSL advanced forensic tool.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://nghttp2.org/\" rel=\"nofollow\"\u003e\u003cb\u003eNghttp2\u003c/b\u003e\u003c/a\u003e - is an implementation of HTTP/2 and its header compression algorithm HPACK in C.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/summerwind/h2spec\"\u003e\u003cb\u003eh2spec\u003c/b\u003e\u003c/a\u003e - is a conformance testing tool for HTTP/2 implementation.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/gildasio/h2t\"\u003e\u003cb\u003eh2t\u003c/b\u003e\u003c/a\u003e - is a simple tool to help sysadmins to hardening their websites.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/c0nrad/http2fuzz\"\u003e\u003cb\u003ehttp2fuzz\u003c/b\u003e\u003c/a\u003e - HTTP/2 fuzzer written in Golang.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/s0md3v/Arjun\"\u003e\u003cb\u003eArjun\u003c/b\u003e\u003c/a\u003e - HTTP parameter discovery suite.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/s0md3v/Corsy\"\u003e\u003cb\u003eCorsy\u003c/b\u003e\u003c/a\u003e - CORS misconfiguration scanner.\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/s0md3v/XSStrike\"\u003e\u003cb\u003eXSStrike\u003c/b\u003e\u003c/a\u003e - most advanced XSS scanner.\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDevelopment\u003c/h5\u003e\u003ca id=\"user-content-development\" class=\"anchor\" aria-label=\"Permalink: Development\" href=\"#development\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"http://agentzh.org/misc/code/nginx/\" rel=\"nofollow\"\u003e\u003cb\u003eSample ebook generated from NGINX source code.\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.lua.org/pil/contents.html\" rel=\"nofollow\"\u003e\u003cb\u003eProgramming in Lua (first edition)\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://www.londonlua.org/scripting_nginx_with_lua/\" rel=\"nofollow\"\u003e\u003cb\u003eScripting Nginx with Lua\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.evanmiller.org/nginx-modules-guide.html\" rel=\"nofollow\"\u003e\u003cb\u003eEmiller’s Guide To Nginx Module Development\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://www.evanmiller.org/nginx-modules-guide-advanced.html\" rel=\"nofollow\"\u003e\u003cb\u003eEmiller’s Advanced Topics In Nginx Module Development\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.airpair.com/nginx/extending-nginx-tutorial\" rel=\"nofollow\"\u003e\u003cb\u003eNGINX Tutorial: Developing Modules\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.openmymind.net/An-Introduction-To-OpenResty-Nginx-Lua/\" rel=\"nofollow\"\u003e\u003cb\u003eAn Introduction To OpenResty (nginx + lua) - Part 1\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.openmymind.net/An-Introduction-To-OpenResty-Part-2/\" rel=\"nofollow\"\u003e\u003cb\u003eAn Introduction To OpenResty - Part 2 - Concepts\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.openmymind.net/An-Introduction-To-OpenResty-Part-3/\" rel=\"nofollow\"\u003e\u003cb\u003eAn Introduction To OpenResty - Part 3\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://blog.dutchcoders.io/openresty-with-dynamic-generated-certificates/\" rel=\"nofollow\"\u003e\u003cb\u003eOpenResty (Nginx) with dynamically generated certificates\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/openresty/programming-openresty\"\u003e\u003cb\u003eProgramming OpenResty\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOnline \u0026amp; Web tools\u003c/h5\u003e\u003ca id=\"user-content-online--web-tools\" class=\"anchor\" aria-label=\"Permalink: Online \u0026amp; Web tools\" href=\"#online--web-tools\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://www.ssllabs.com/ssltest/\" rel=\"nofollow\"\u003e\u003cb\u003eSSL Server Test by SSL Labs\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.htbridge.com/ssl/\" rel=\"nofollow\"\u003e\u003cb\u003eTest SSL/TLS (PCI DSS, HIPAA and NIST)\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://sslanalyzer.comodoca.com/\" rel=\"nofollow\"\u003e\u003cb\u003eSSL analyzer and certificate checker\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://decoder.link\" rel=\"nofollow\"\u003e\u003cb\u003eTools for testing SSL configuration\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://tls.imirhil.fr/\" rel=\"nofollow\"\u003e\u003cb\u003eTest your TLS server configuration (e.g. ciphers)\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.jitbit.com/sslcheck/\" rel=\"nofollow\"\u003e\u003cb\u003eScan your website for non-secure content\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://www.ssltools.com\" rel=\"nofollow\"\u003e\u003cb\u003eAnalyze website security\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://ciphersuite.info/\" rel=\"nofollow\"\u003e\u003cb\u003eTLS Cipher Suite Search\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.ssllabs.com/ssltest/viewMyClient.html\" rel=\"nofollow\"\u003e\u003cb\u003eSSL/TLS Capabilities of Your Browser\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://suche.org/sslClientInfo\" rel=\"nofollow\"\u003e\u003cb\u003eSSL-Client Info's\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://2ton.com.au/dhtool/\" rel=\"nofollow\"\u003e\u003cb\u003ePublic Diffie-Hellman Parameter Service/Tool\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://securityheaders.com/\" rel=\"nofollow\"\u003e\u003cb\u003eAnalyse the HTTP response headers by Security Headers\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://observatory.mozilla.org/\" rel=\"nofollow\"\u003e\u003cb\u003eAnalyze your website by Mozilla Observatory\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://sslmate.com/caa/\" rel=\"nofollow\"\u003e\u003cb\u003eCAA Record Helper\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://webhint.io/\" rel=\"nofollow\"\u003e\u003cb\u003eLinting tool that will help you with your site's accessibility, speed, security and more\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://urlscan.io/\" rel=\"nofollow\"\u003e\u003cb\u003eService to scan and analyse websites\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.url-encode-decode.com/\" rel=\"nofollow\"\u003e\u003cb\u003eTool from above to either encode or decode a string of text\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://uncoder.io/\" rel=\"nofollow\"\u003e\u003cb\u003eOnline translator for search queries on log data\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://regex101.com/\" rel=\"nofollow\"\u003e\u003cb\u003eOnline regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://regexr.com/\" rel=\"nofollow\"\u003e\u003cb\u003eOnline tool to learn, build, \u0026amp; test Regular Expressions\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.regextester.com/\" rel=\"nofollow\"\u003e\u003cb\u003eOnline Regex Tester \u0026amp; Debugger\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/nginxinc/NGINX-Demos/tree/master/nginx-regex-tester\"\u003e\u003cb\u003eTool for testing regular expressions directly within an NGINX configuration\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://gchq.github.io/CyberChef/\" rel=\"nofollow\"\u003e\u003cb\u003eA web app for encryption, encoding, compression and data analysis\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://nginx.viraptor.info/\" rel=\"nofollow\"\u003e\u003cb\u003eNginx location match tester\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://detailyang.github.io/nginx-location-match-visible/\" rel=\"nofollow\"\u003e\u003cb\u003eNginx location match visible\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOther stuff\u003c/h5\u003e\u003ca id=\"user-content-other-stuff\" class=\"anchor\" aria-label=\"Permalink: Other stuff\" href=\"#other-stuff\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\n :black_small_square: \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web\" rel=\"nofollow\"\u003e\u003cb\u003eWeb technology for developers\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://infosec.mozilla.org/guidelines/web_security.html\" rel=\"nofollow\"\u003e\u003cb\u003eMozilla Web Security\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://appsecwiki.com/#/\" rel=\"nofollow\"\u003e\u003cb\u003eApplication Security Wiki\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.owasp.org/index.php/Category:OWASP_Application_Security_Verification_Standard_Project\" rel=\"nofollow\"\u003e\u003cb\u003eOWASP ASVS 3.0.1\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/Santandersecurityresearch/asvs\"\u003e\u003cb\u003eOWASP ASVS 3.0.1 Web App\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/OWASP/ASVS/tree/master/4.0\"\u003e\u003cb\u003eOWASP ASVS 4.0\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.owasp.org/index.php/OWASP_Proactive_Controls\" rel=\"nofollow\"\u003e\u003cb\u003eOWASP Top 10 Proactive Controls 2018.\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.owasp.org/index.php/OWASP_Testing_Project\" rel=\"nofollow\"\u003e\u003cb\u003eOWASP Testing Guide v4\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/OWASP/DevGuide\"\u003e\u003cb\u003eOWASP Dev Guide\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html\" rel=\"nofollow\"\u003e\u003cb\u003eTransport Layer Protection Cheat Sheet by OWASP\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/OWASP/wstg\"\u003e\u003cb\u003eOWASP WSTG\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://wiki.mozilla.org/Security/Server_Side_TLS\" rel=\"nofollow\"\u003e\u003cb\u003eSecurity/Server Side TLS by Mozilla\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://bettercrypto.org/\" rel=\"nofollow\"\u003e\u003cb\u003eApplied Crypto Hardening\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://caniuse.com/#home\" rel=\"nofollow\"\u003e\u003cb\u003eBrowser support tables for modern web technologies\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://badssl.com/\" rel=\"nofollow\"\u003e\u003cb\u003eMemorable site for testing clients against bad SSL configs\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://https.cio.gov/\" rel=\"nofollow\"\u003e\u003cb\u003eThe HTTPS-Only Standard\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://portswigger.net/web-security\" rel=\"nofollow\"\u003e\u003cb\u003eThe Web Security Academy\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://portswigger.net/kb/issues\" rel=\"nofollow\"\u003e\u003cb\u003eBurp Scanner - Issue Definitions\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://odino.org/wasec-web-application-security-what-to-do-when-dot-dot-dot/\" rel=\"nofollow\"\u003e\u003cb\u003eWeb application security: what to do when...\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml\" rel=\"nofollow\"\u003e\u003cb\u003eTransport Layer Security (TLS) Parameters\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/GrrrDog/TLS-Redirection#technical-details\"\u003e\u003cb\u003eTLS Redirection (and Virtual Host Confusion)\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/\" rel=\"nofollow\"\u003e\u003cb\u003eTLS Security 6: Examples of TLS Vulnerabilities and Attacks\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.veracode.com/blog/2014/03/guidelines-for-setting-security-headers\" rel=\"nofollow\"\u003e\u003cb\u003eGuidelines for Setting Security Headers\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://infosec.mozilla.org/guidelines/web_security.html\" rel=\"nofollow\"\u003e\u003cb\u003eMozilla Guidelines - Web Security\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://medium.freecodecamp.org/secure-your-web-application-with-these-http-headers-fd66e0367628\" rel=\"nofollow\"\u003e\u003cb\u003eSecure your web application with these HTTP headers\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://zinoui.com/blog/security-http-headers\" rel=\"nofollow\"\u003e\u003cb\u003eSecurity HTTP Headers\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/GrrrDog/weird_proxies/wiki\"\u003e\u003cb\u003eAnalysis of various reverse proxies, cache proxies, load balancers, etc.\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://howhttps.works/\" rel=\"nofollow\"\u003e\u003cb\u003eHow HTTPS works ...in a comic!\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.regular-expressions.info/\" rel=\"nofollow\"\u003e\u003cb\u003eRegular-Expressions\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/attackercan/REGEXP-SECURITY-CHEATSHEET\"\u003e\u003cb\u003eRegexp Security Cheatsheet\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://nickcraver.com/blog/2017/05/22/https-on-stack-overflow/#the-beginning\" rel=\"nofollow\"\u003e\u003cb\u003eHTTPS on Stack Overflow: The End of a Long Road\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://www.aosabook.org/en/nginx.html\" rel=\"nofollow\"\u003e\u003cb\u003eThe Architecture of Open Source Applications - Nginx\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://www.bbc.co.uk/blogs/internet/entries/17d22fb8-cea2-49d5-be14-86e7a1dcde04\" rel=\"nofollow\"\u003e\u003cb\u003eBBC Digital Media Distribution: How we improved throughput by 4x\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://www.kegel.com/c10k.html\" rel=\"nofollow\"\u003e\u003cb\u003eThe C10K problem by Dan Kegel\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html\" rel=\"nofollow\"\u003e\u003cb\u003eThe Secret To 10 Million Concurrent Connections\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://hpbn.co/\" rel=\"nofollow\"\u003e\u003cb\u003eHigh Performance Browser Networking\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/donnemartin/system-design-primer\"\u003e\u003cb\u003eThe System Design Primer\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/binhnguyennus/awesome-scalability\"\u003e\u003cb\u003eawesome-scalability\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://engineering.videoblocks.com/web-architecture-101-a3224e126947\" rel=\"nofollow\"\u003e\u003cb\u003eWeb Architecture 101\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.com/leandromoreira/linux-network-performance-parameters\"\u003e\u003cb\u003eLearn where some of the network sysctl variables fit into the Linux/Kernel network flow\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://suniphrase.wordpress.com/2015/10/27/jemalloc-vs-tcmalloc-vs-dlmalloc/\" rel=\"nofollow\"\u003e\u003cb\u003ejemalloc vs tcmalloc vs dlmalloc\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://arxiv.org/pdf/1905.01135.pdf\" rel=\"nofollow\"\u003e\u003cb\u003eOn the Impact of Memory Allocation on High-Performance Query Processing\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n :black_small_square: \u003ca href=\"https://github.blog/2018-08-08-glb-director-open-source-load-balancer/\" rel=\"nofollow\"\u003e\u003cb\u003eGLB: GitHub’s open source load balancer\u003c/b\u003e\u003c/a\u003e\u003cbr\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat's next?\u003c/h1\u003e\u003ca id=\"user-content-whats-next\" class=\"anchor\" aria-label=\"Permalink: What's next?\" href=\"#whats-next\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eGo back to the \u003ca href=\"#table-of-contents\"\u003eTable of Contents\u003c/a\u003e or read the next chapters:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-basics\"\u003eHTTP Basics\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-http-basics-2\"\u003e\u003c/a\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eIntroduction to HTTP.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#ssltls-basics\"\u003eSSL/TLS Basics\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-ssltls-basics-2\"\u003e\u003c/a\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eIntroduction to SSL/TLS.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#nginx-basics\"\u003eNGINX Basics\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-nginx-basics-2\"\u003e\u003c/a\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eIntroduction and explanation of the NGINX mechanisms.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#helpers\"\u003eHelpers\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-helpers-2\"\u003e\u003c/a\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eOne-liners, commands, utilities for building NGINX, and more.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#base-rules\"\u003eBase Rules (16)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-base-rules-2\"\u003e\u003c/a\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eThe basic set of rules to keep NGINX in a good condition.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#debugging\"\u003eDebugging (5)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-debugging-2\"\u003e\u003c/a\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eA few things for troubleshooting configuration problems.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#performance\"\u003ePerformance (13)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-performance-2\"\u003e\u003c/a\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eMany methods to make sure the NGINX as fast as possible.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#hardening\"\u003eHardening (31)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-hardening-2\"\u003e\u003c/a\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eSecurity and hardening methods in line with best practices.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#reverse-proxy\"\u003eReverse Proxy (8)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-reverse-proxy-2\"\u003e\u003c/a\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eA few rules about the NGINX proxy server.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#load-balancing\"\u003eLoad Balancing (2)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-load-balancing-2\"\u003e\u003c/a\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eSome rules to improve NGINX as a load balancer.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#others\"\u003eOthers (4)\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-others-2\"\u003e\u003c/a\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eOther interesting rules, not necessarily linked to NGINX.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#configuration-examples\"\u003eConfiguration Examples\u003c/a\u003e\u003c/strong\u003e\u003ca id=\"user-content-toc-configuration-examples-2\"\u003e\u003c/a\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eHere are some configuration examples.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cbr\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca href=\"https://nystudio107.com/blog/stop-using-htaccess-files-no-really\" rel=\"nofollow\"\u003e\n \u003cimg src=\"https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/nginx_meme_2.png\" alt=\"Meme\" width=\"50%\" height=\"50%\" style=\"max-width: 100%;\"\u003e\n \u003c/a\u003e\n\u003c/p\u003e\n\u003c/article\u003e","loaded":true,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":[{"level":1,"text":"Nginx Admin's Handbook","anchor":"nginx-admins-handbook","htmlText":"Nginx Admin's Handbook"},{"level":1,"text":"Table of Contents","anchor":"table-of-contents","htmlText":"Table of Contents"},{"level":1,"text":"Introduction","anchor":"introduction","htmlText":"Introduction"},{"level":2,"text":"Prologue","anchor":"prologue","htmlText":"Prologue"},{"level":2,"text":"Why I created this handbook","anchor":"why-i-created-this-handbook","htmlText":"Why I created this handbook"},{"level":2,"text":"Who this handbook is for","anchor":"who-this-handbook-is-for","htmlText":"Who this handbook is for"},{"level":2,"text":"Before you start","anchor":"before-you-start","htmlText":"Before you start"},{"level":2,"text":"Contributing \u0026 Support","anchor":"contributing--support","htmlText":"Contributing \u0026amp; Support"},{"level":2,"text":"Code Contributors","anchor":"code-contributors","htmlText":"Code Contributors"},{"level":3,"text":"ToDo","anchor":"todo","htmlText":"ToDo"},{"level":2,"text":"RSS Feed \u0026 Updates","anchor":"rss-feed--updates","htmlText":"RSS Feed \u0026amp; Updates"},{"level":2,"text":"Checklist to rule them all","anchor":"checklist-to-rule-them-all","htmlText":"Checklist to rule them all"},{"level":1,"text":"Bonus Stuff","anchor":"bonus-stuff","htmlText":"Bonus Stuff"},{"level":2,"text":"Configuration reports","anchor":"configuration-reports","htmlText":"Configuration reports"},{"level":3,"text":"SSL Labs","anchor":"ssl-labs","htmlText":"SSL Labs"},{"level":3,"text":"Mozilla Observatory","anchor":"mozilla-observatory","htmlText":"Mozilla Observatory"},{"level":2,"text":"Printable hardening cheatsheets","anchor":"printable-hardening-cheatsheets","htmlText":"Printable hardening cheatsheets"},{"level":2,"text":"Fully automatic installation","anchor":"fully-automatic-installation","htmlText":"Fully automatic installation"},{"level":2,"text":"Static error pages generator","anchor":"static-error-pages-generator","htmlText":"Static error pages generator"},{"level":2,"text":"Server names parser","anchor":"server-names-parser","htmlText":"Server names parser"},{"level":1,"text":"Books","anchor":"books","htmlText":"Books"},{"level":4,"text":"Nginx Essentials","anchor":"nginx-essentials","htmlText":"Nginx Essentials"},{"level":4,"text":"Nginx Cookbook","anchor":"nginx-cookbook","htmlText":"Nginx Cookbook"},{"level":4,"text":"Nginx HTTP Server","anchor":"nginx-http-server","htmlText":"Nginx HTTP Server"},{"level":4,"text":"Nginx High Performance","anchor":"nginx-high-performance","htmlText":"Nginx High Performance"},{"level":4,"text":"Mastering Nginx","anchor":"mastering-nginx","htmlText":"Mastering Nginx"},{"level":4,"text":"ModSecurity 3.0 and NGINX: Quick Start Guide","anchor":"modsecurity-30-and-nginx-quick-start-guide","htmlText":"ModSecurity 3.0 and NGINX: Quick Start Guide"},{"level":4,"text":"Cisco ACE to NGINX: Migration Guide","anchor":"cisco-ace-to-nginx-migration-guide","htmlText":"Cisco ACE to NGINX: Migration Guide"},{"level":1,"text":"External Resources","anchor":"external-resources","htmlText":"External Resources"},{"level":5,"text":"Nginx official","anchor":"nginx-official","htmlText":"Nginx official"},{"level":5,"text":"Nginx distributions","anchor":"nginx-distributions","htmlText":"Nginx distributions"},{"level":5,"text":"Comparison reviews","anchor":"comparison-reviews","htmlText":"Comparison reviews"},{"level":5,"text":"Cheatsheets \u0026 References","anchor":"cheatsheets--references","htmlText":"Cheatsheets \u0026amp; References"},{"level":5,"text":"Performance \u0026 Hardening","anchor":"performance--hardening","htmlText":"Performance \u0026amp; Hardening"},{"level":5,"text":"Presentations \u0026 Videos","anchor":"presentations--videos","htmlText":"Presentations \u0026amp; Videos"},{"level":5,"text":"Playgrounds","anchor":"playgrounds","htmlText":"Playgrounds"},{"level":5,"text":"Config generators","anchor":"config-generators","htmlText":"Config generators"},{"level":5,"text":"Config parsers","anchor":"config-parsers","htmlText":"Config parsers"},{"level":5,"text":"Config managers","anchor":"config-managers","htmlText":"Config managers"},{"level":5,"text":"Static analyzers","anchor":"static-analyzers","htmlText":"Static analyzers"},{"level":5,"text":"Log analyzers","anchor":"log-analyzers","htmlText":"Log analyzers"},{"level":5,"text":"Performance analyzers","anchor":"performance-analyzers","htmlText":"Performance analyzers"},{"level":5,"text":"Builder tools","anchor":"builder-tools","htmlText":"Builder tools"},{"level":5,"text":"Benchmarking tools","anchor":"benchmarking-tools","htmlText":"Benchmarking tools"},{"level":5,"text":"Debugging tools","anchor":"debugging-tools","htmlText":"Debugging tools"},{"level":5,"text":"Security \u0026 Web testing tools","anchor":"security--web-testing-tools","htmlText":"Security \u0026amp; Web testing tools"},{"level":5,"text":"Development","anchor":"development","htmlText":"Development"},{"level":5,"text":"Online \u0026 Web tools","anchor":"online--web-tools","htmlText":"Online \u0026amp; Web tools"},{"level":5,"text":"Other stuff","anchor":"other-stuff","htmlText":"Other stuff"},{"level":1,"text":"What's next?","anchor":"whats-next","htmlText":"What's next?"}],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Ftrimstray%2Fnginx-admins-handbook"}},{"displayName":"CODE_OF_CONDUCT.md","repoName":"nginx-admins-handbook","refName":"master","path":".github/CODE_OF_CONDUCT.md","preferredFileType":"code_of_conduct","tabName":"Code of conduct","richText":null,"loaded":false,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":null,"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Ftrimstray%2Fnginx-admins-handbook"}},{"displayName":"LICENSE.md","repoName":"nginx-admins-handbook","refName":"master","path":"LICENSE.md","preferredFileType":"license","tabName":"MIT","richText":null,"loaded":false,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":null,"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Ftrimstray%2Fnginx-admins-handbook"}}],"overviewFilesProcessingTime":0}},"appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-7d7eb7c71814.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-96e76d5fdb2c.js","githubDevUrl":null,"enabled_features":{"copilot_workspace":null,"code_nav_ui_events":false,"overview_shared_code_dropdown_button":false,"react_blob_overlay":false,"accessible_code_button":true,"github_models_repo_integration":false}}}}</script> <div data-target="react-partial.reactRoot"><style data-styled="true" data-styled-version="5.3.11">.iVEunk{margin-top:16px;margin-bottom:16px;}/*!sc*/ .jzuOtQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/ .bGojzy{margin-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;row-gap:16px;}/*!sc*/ .iNSVHo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-bottom:16px;padding-top:8px;}/*!sc*/ .bVgnfw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:8px;}/*!sc*/ @media screen and (max-width:320px){.bVgnfw{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .CEgMp{position:relative;}/*!sc*/ @media screen and (max-width:380px){.CEgMp .ref-selector-button-text-container{max-width:80px;}}/*!sc*/ @media screen and (max-width:320px){.CEgMp{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.CEgMp .overview-ref-selector{width:100%;}.CEgMp .overview-ref-selector > span{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;}.CEgMp .overview-ref-selector > span > span[data-component="text"]{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .gMOVLe[data-size="medium"]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;}/*!sc*/ .gMOVLe[data-size="medium"] svg{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gMOVLe[data-size="medium"] > span{width:inherit;}/*!sc*/ .gUkoLg{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .bZBlpz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;}/*!sc*/ .lhTYNA{margin-right:4px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ffLUq{font-size:14px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}/*!sc*/ .bmcJak{min-width:0;}/*!sc*/ .fLXEGX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1079px){.fLXEGX{display:none;}}/*!sc*/ .lmSMZJ[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));padding-left:4px;padding-right:4px;}/*!sc*/ .lmSMZJ[data-size="medium"] span[data-component="leadingVisual"]{margin-right:4px !important;}/*!sc*/ .dqfxud{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1080px){.dqfxud{display:none;}}/*!sc*/ @media screen and (max-width:543px){.dqfxud{display:none;}}/*!sc*/ .fGwBZA[data-size="medium"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .jxTzTd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:8px;gap:8px;}/*!sc*/ .gqqBXN{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:8px;}/*!sc*/ @media screen and (max-width:543px){.gqqBXN{display:none;}}/*!sc*/ .dzXgxt{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1011px){.dzXgxt{display:none;}}/*!sc*/ .iWFGlI{margin-left:8px;margin-right:8px;margin:0;}/*!sc*/ .vcvyP{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .YUPas{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1012px){.YUPas{display:none;}}/*!sc*/ .izFOf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:544px){.izFOf{display:none;}}/*!sc*/ .vIPPs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:16px;}/*!sc*/ .fdROMU{width:100%;border-collapse:separate;border-spacing:0;border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;table-layout:fixed;overflow:unset;}/*!sc*/ .jGKpsv{height:0px;line-height:0px;}/*!sc*/ .jGKpsv tr{height:0px;font-size:0px;}/*!sc*/ .jdgHnn{padding:16px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;text-align:left;height:40px;}/*!sc*/ .jdgHnn th{padding-left:16px;background-color:var(--bgColor-muted,var(--color-canvas-subtle,#f6f8fa));}/*!sc*/ .bQivRW{width:100%;border-top-left-radius:6px;}/*!sc*/ @media screen and (min-width:544px){.bQivRW{display:none;}}/*!sc*/ .ldkMIO{width:40%;border-top-left-radius:6px;}/*!sc*/ @media screen and (max-width:543px){.ldkMIO{display:none;}}/*!sc*/ .jMbWeI{text-align:right;padding-right:16px;width:136px;border-top-right-radius:6px;}/*!sc*/ .gpqjiB{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;height:40px;}/*!sc*/ .dzCJzi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;min-width:273px;padding:8px;}/*!sc*/ @media screen and (min-width:544px){.dzCJzi{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}/*!sc*/ .eNCcrz{text-align:center;vertical-align:center;height:40px;border-top:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));}/*!sc*/ .bHTcCe{border-top:1px solid var(--borderColor-default,var(--color-border-default));cursor:pointer;}/*!sc*/ .csrIcr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;gap:16px;}/*!sc*/ .bUQNHB{border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/ @media screen and (max-width:543px){.bUQNHB{margin-left:-16px;margin-right:-16px;max-width:calc(100% + 32px);}}/*!sc*/ @media screen and (min-width:544px){.bUQNHB{max-width:100%;}}/*!sc*/ .jPdcfu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-bottom:1px solid;border-bottom-color:var(--borderColor-default,var(--color-border-default,#d0d7de));-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:8px;position:-webkit-sticky;position:sticky;top:0;background-color:var(--bgColor-default,var(--color-canvas-default,#ffffff));z-index:1;border-top-left-radius:6px;border-top-right-radius:6px;}/*!sc*/ .iphEWz{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;border-bottom:none;max-width:100%;padding-left:8px;padding-right:8px;}/*!sc*/ .hUCRAk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .cwoBXV[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-subtle,#6e7781));padding-left:8px;padding-right:8px;}/*!sc*/ .QkQOb{padding:32px;overflow:auto;}/*!sc*/ data-styled.g1[id="Box-sc-g0xbh4-0"]{content:"iVEunk,jzuOtQ,bGojzy,iNSVHo,bVgnfw,CEgMp,gMOVLe,gUkoLg,bZBlpz,lhTYNA,ffLUq,bmcJak,fLXEGX,lmSMZJ,dqfxud,fGwBZA,jxTzTd,gqqBXN,dzXgxt,iWFGlI,vcvyP,YUPas,izFOf,vIPPs,fdROMU,jGKpsv,jdgHnn,bQivRW,ldkMIO,jMbWeI,gpqjiB,dzCJzi,eNCcrz,bHTcCe,csrIcr,bUQNHB,jPdcfu,iphEWz,hUCRAk,cwoBXV,QkQOb,"}/*!sc*/ .brGdpi{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;-webkit-clip:rect(0,0,0,0);clip:rect(0,0,0,0);white-space:nowrap;border-width:0;}/*!sc*/ data-styled.g5[id="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0"]{content:"brGdpi,"}/*!sc*/ .hWlpPn{position:relative;display:inline-block;}/*!sc*/ .hWlpPn::after{position:absolute;z-index:1000000;display:none;padding:0.5em 0.75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-font-smoothing:subpixel-antialiased;color:var(--tooltip-fgColor,var(--fgColor-onEmphasis,var(--color-fg-on-emphasis,#ffffff)));text-align:center;-webkit-text-decoration:none;text-decoration:none;text-shadow:none;text-transform:none;-webkit-letter-spacing:normal;-moz-letter-spacing:normal;-ms-letter-spacing:normal;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:var(--tooltip-bgColor,var(--bgColor-emphasis,var(--color-neutral-emphasis-plus,#24292f)));border-radius:6px;opacity:0;}/*!sc*/ @-webkit-keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ @keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ .hWlpPn:hover::after,.hWlpPn:active::after,.hWlpPn:focus::after,.hWlpPn:focus-within::after{display:inline-block;-webkit-text-decoration:none;text-decoration:none;-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-no-delay:hover::after,.hWlpPn.tooltipped-no-delay:active::after,.hWlpPn.tooltipped-no-delay:focus::after,.hWlpPn.tooltipped-no-delay:focus-within::after{-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-multiline:hover::after,.hWlpPn.tooltipped-multiline:active::after,.hWlpPn.tooltipped-multiline:focus::after,.hWlpPn.tooltipped-multiline:focus-within::after{display:table-cell;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-se::after,.hWlpPn.tooltipped-sw::after{top:100%;right:50%;margin-top:6px;}/*!sc*/ .hWlpPn.tooltipped-se::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-sw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-n::after,.hWlpPn.tooltipped-ne::after,.hWlpPn.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:6px;}/*!sc*/ .hWlpPn.tooltipped-ne::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-nw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-n::after{-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);}/*!sc*/ .hWlpPn.tooltipped-w::after{right:100%;bottom:50%;margin-right:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-e::after{bottom:50%;left:100%;margin-left:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate;}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-s::after,.hWlpPn.tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-w::after,.hWlpPn.tooltipped-multiline.tooltipped-e::after{right:100%;}/*!sc*/ .hWlpPn.tooltipped-align-right-2::after{right:0;margin-right:0;}/*!sc*/ .hWlpPn.tooltipped-align-left-2::after{left:0;margin-left:0;}/*!sc*/ data-styled.g16[id="Tooltip__TooltipBase-sc-17tf59c-0"]{content:"hWlpPn,"}/*!sc*/ .liVpTx{display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:top;white-space:nowrap;max-width:125px;}/*!sc*/ data-styled.g18[id="Truncate__StyledTruncate-sc-23o1d2-0"]{content:"liVpTx,"}/*!sc*/ </style> <!-- --> <!-- --> <div class="Box-sc-g0xbh4-0 iVEunk"><div class="Box-sc-g0xbh4-0 jzuOtQ"><div class="Box-sc-g0xbh4-0 bGojzy"></div></div><div class="Box-sc-g0xbh4-0 iNSVHo"><div class="Box-sc-g0xbh4-0 bVgnfw"><div class="Box-sc-g0xbh4-0 CEgMp"><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" class="Box-sc-g0xbh4-0 gMOVLe prc-Button-ButtonBase-c50BI overview-ref-selector width-full" data-loading="false" data-size="medium" data-variant="default" aria-describedby="branch-picker-repos-header-ref-selector-loading-announcement" id="branch-picker-repos-header-ref-selector"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="text" class="prc-Button-Label-pTQ3x"><div class="Box-sc-g0xbh4-0 bZBlpz"><div class="Box-sc-g0xbh4-0 lhTYNA"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"><span class="Box-sc-g0xbh4-0 bmcJak prc-Text-Text-0ima0"> <!-- -->master</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><button hidden="" data-hotkey-scope="read-only-cursor-text-area"></button></div><div class="Box-sc-g0xbh4-0 fLXEGX"><a style="--button-color:fg.muted" type="button" href="/trimstray/nginx-admins-handbook/branches" class="Box-sc-g0xbh4-0 lmSMZJ prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rclab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Branches</span></span></a><a style="--button-color:fg.muted" type="button" href="/trimstray/nginx-admins-handbook/tags" class="Box-sc-g0xbh4-0 lmSMZJ prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rklab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Tags</span></span></a></div><div class="Box-sc-g0xbh4-0 dqfxud"><a style="--button-color:fg.muted" type="button" aria-label="Go to Branches page" href="/trimstray/nginx-admins-handbook/branches" class="Box-sc-g0xbh4-0 fGwBZA prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":Relab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></a><a style="--button-color:fg.muted" type="button" aria-label="Go to Tags page" href="/trimstray/nginx-admins-handbook/tags" class="Box-sc-g0xbh4-0 fGwBZA prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":Rmlab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></a></div></div><div class="Box-sc-g0xbh4-0 jxTzTd"><div class="Box-sc-g0xbh4-0 gqqBXN"><div class="Box-sc-g0xbh4-0 dzXgxt"><!--$--><div class="Box-sc-g0xbh4-0 iWFGlI"><span class="Box-sc-g0xbh4-0 vcvyP TextInput-wrapper prc-components-TextInputWrapper-i1ofR prc-components-TextInputBaseWrapper-ueK9q" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id=":R2j5ab:" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellcheck="false" placeholder="Go to file" aria-describedby=":R2j5ab: :R2j5abH1:" data-component="input" class="prc-components-Input-Ic-y8" value=""/><span class="TextInput-icon" id=":R2j5abH1:" aria-hidden="true"></span></span></div><!--/$--></div><div class="Box-sc-g0xbh4-0 YUPas"><button type="button" class="prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-describedby=":Rr5ab:-loading-announcement"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="text" class="prc-Button-Label-pTQ3x">Go to file</span></span></button></div><div class="react-directory-add-file-icon"></div><div class="react-directory-remove-file-icon"></div></div><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="primary" aria-describedby=":R55ab:-loading-announcement" id=":R55ab:"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-code hide-sm" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Code</span><span data-component="trailingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="Box-sc-g0xbh4-0 izFOf"><button data-component="IconButton" type="button" aria-label="Open more actions menu" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-c50BI prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-describedby=":R75ab:-loading-announcement" id=":R75ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button></div></div></div><div class="Box-sc-g0xbh4-0 vIPPs"><div data-hpc="true"><button hidden="" data-testid="focus-next-element-button" data-hotkey="j"></button><button hidden="" data-testid="focus-previous-element-button" data-hotkey="k"></button><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading" id="folders-and-files">Folders and files</h2><table aria-labelledby="folders-and-files" class="Box-sc-g0xbh4-0 fdROMU"><thead class="Box-sc-g0xbh4-0 jGKpsv"><tr class="Box-sc-g0xbh4-0 jdgHnn"><th colSpan="2" class="Box-sc-g0xbh4-0 bQivRW"><span class="text-bold">Name</span></th><th colSpan="1" class="Box-sc-g0xbh4-0 ldkMIO"><span class="text-bold">Name</span></th><th class="hide-sm"><div title="Last commit message" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit message</span></div></th><th colSpan="1" class="Box-sc-g0xbh4-0 jMbWeI"><div title="Last commit date" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit date</span></div></th></tr></thead><tbody><tr class="Box-sc-g0xbh4-0 gpqjiB"><td colSpan="3" class="bgColor-muted p-1 rounded-top-2"><div class="Box-sc-g0xbh4-0 dzCJzi"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">History</h2><a href="/trimstray/nginx-admins-handbook/commits/master/" class="prc-Button-ButtonBase-c50BI d-none d-lg-flex LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby=":Raqj8pab:-loading-announcement"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x"><span class="fgColor-default">1,338 Commits</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><span role="tooltip" aria-label="1,338 Commits" id="history-icon-button-tooltip" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-n"><a href="/trimstray/nginx-admins-handbook/commits/master/" class="prc-Button-ButtonBase-c50BI LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby=":R1iqj8pab:-loading-announcement history-icon-button-tooltip"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a></span></div></div></div></div></td></tr><tr class="react-directory-row undefined" id="folder-row-0"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".github" aria-label=".github, (Directory)" class="Link--primary" href="/trimstray/nginx-admins-handbook/tree/master/.github">.github</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".github" aria-label=".github, (Directory)" class="Link--primary" href="/trimstray/nginx-admins-handbook/tree/master/.github">.github</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-1"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="doc" aria-label="doc, (Directory)" class="Link--primary" href="/trimstray/nginx-admins-handbook/tree/master/doc">doc</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="doc" aria-label="doc, (Directory)" class="Link--primary" href="/trimstray/nginx-admins-handbook/tree/master/doc">doc</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-2"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="lib" aria-label="lib, (Directory)" class="Link--primary" href="/trimstray/nginx-admins-handbook/tree/master/lib">lib</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="lib" aria-label="lib, (Directory)" class="Link--primary" href="/trimstray/nginx-admins-handbook/tree/master/lib">lib</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-3"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="This path skips through empty directories" aria-label="static/img, (Directory)" class="Link--primary" href="/trimstray/nginx-admins-handbook/tree/master/static/img"><span class="react-directory-default-color" data-testid="path-name-segment">static/</span><span class="" data-testid="path-name-segment">img</span></a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="This path skips through empty directories" aria-label="static/img, (Directory)" class="Link--primary" href="/trimstray/nginx-admins-handbook/tree/master/static/img"><span class="react-directory-default-color" data-testid="path-name-segment">static/</span><span class="" data-testid="path-name-segment">img</span></a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-4"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="LICENSE.md" aria-label="LICENSE.md, (File)" class="Link--primary" href="/trimstray/nginx-admins-handbook/blob/master/LICENSE.md">LICENSE.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="LICENSE.md" aria-label="LICENSE.md, (File)" class="Link--primary" href="/trimstray/nginx-admins-handbook/blob/master/LICENSE.md">LICENSE.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-5"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="README.md" aria-label="README.md, (File)" class="Link--primary" href="/trimstray/nginx-admins-handbook/blob/master/README.md">README.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="README.md" aria-label="README.md, (File)" class="Link--primary" href="/trimstray/nginx-admins-handbook/blob/master/README.md">README.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="Box-sc-g0xbh4-0 eNCcrz d-none" data-testid="view-all-files-row"><td colSpan="3" class="Box-sc-g0xbh4-0 bHTcCe"><div><button class="prc-Link-Link-85e08">View all files</button></div></td></tr></tbody></table></div><div class="Box-sc-g0xbh4-0 csrIcr"><div class="Box-sc-g0xbh4-0 bUQNHB"><div itemscope="" itemType="https://schema.org/abstract" class="Box-sc-g0xbh4-0 jPdcfu"><h2 class="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0 brGdpi">Repository files navigation</h2><nav class="Box-sc-g0xbh4-0 iphEWz prc-components-UnderlineWrapper-oOh5J" aria-label="Repository files"><ul class="prc-components-UnderlineItemList-b23Hf" role="list"><li class="Box-sc-g0xbh4-0 hUCRAk"><a class="prc-components-UnderlineItem-lJsg-" href="#" aria-current="page"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-book" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path></svg></span><span data-component="text" data-content="README">README</span></a></li><li class="Box-sc-g0xbh4-0 hUCRAk"><a class="prc-components-UnderlineItem-lJsg-" href="#"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-code-of-conduct" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8.048 2.241c.964-.709 2.079-1.238 3.325-1.241a4.616 4.616 0 0 1 3.282 1.355c.41.408.757.86.996 1.428.238.568.348 1.206.347 1.968 0 2.193-1.505 4.254-3.081 5.862-1.496 1.526-3.213 2.796-4.249 3.563l-.22.163a.749.749 0 0 1-.895 0l-.221-.163c-1.036-.767-2.753-2.037-4.249-3.563C1.51 10.008.007 7.952.002 5.762a4.614 4.614 0 0 1 1.353-3.407C3.123.585 6.223.537 8.048 2.24Zm-1.153.983c-1.25-1.033-3.321-.967-4.48.191a3.115 3.115 0 0 0-.913 2.335c0 1.556 1.109 3.24 2.652 4.813C5.463 11.898 6.96 13.032 8 13.805c.353-.262.758-.565 1.191-.905l-1.326-1.223a.75.75 0 0 1 1.018-1.102l1.48 1.366c.328-.281.659-.577.984-.887L9.99 9.802a.75.75 0 1 1 1.019-1.103l1.384 1.28c.295-.329.566-.661.81-.995L12.92 8.7l-1.167-1.168c-.674-.671-1.78-.664-2.474.03-.268.269-.538.537-.802.797-.893.882-2.319.843-3.185-.032-.346-.35-.693-.697-1.043-1.047a.75.75 0 0 1-.04-1.016c.162-.191.336-.401.52-.623.62-.748 1.356-1.637 2.166-2.417Zm7.112 4.442c.313-.65.491-1.293.491-1.916v-.001c0-.614-.088-1.045-.23-1.385-.143-.339-.357-.633-.673-.949a3.111 3.111 0 0 0-2.218-.915c-1.092.003-2.165.627-3.226 1.602-.823.755-1.554 1.637-2.228 2.45l-.127.154.562.566a.755.755 0 0 0 1.066.02l.794-.79c1.258-1.258 3.312-1.31 4.594-.032.396.394.792.791 1.173 1.173Z"></path></svg></span><span data-component="text" data-content="Code of conduct">Code of conduct</span></a></li><li class="Box-sc-g0xbh4-0 hUCRAk"><a class="prc-components-UnderlineItem-lJsg-" href="#"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-law" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path></svg></span><span data-component="text" data-content="MIT license">MIT license</span></a></li></ul></nav><button style="--button-color:fg.subtle" type="button" aria-label="Outline" aria-haspopup="true" aria-expanded="false" tabindex="0" class="Box-sc-g0xbh4-0 cwoBXV prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rr9ab:-loading-announcement" id=":Rr9ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button></div><div class="Box-sc-g0xbh4-0 QkQOb js-snippet-clipboard-copy-unpositioned undefined" data-hpc="true"><article class="markdown-body entry-content container-lg" itemprop="text"><div align="center" dir="auto"> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Nginx Admin's Handbook</h1><a id="user-content-nginx-admins-handbook" class="anchor" aria-label="Permalink: Nginx Admin's Handbook" href="#nginx-admins-handbook"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </div> <div align="center" dir="auto"> <b><code>My notes on NGINX administration basics, tips & tricks, caveats, and gotchas.</code></b> </div> <br> <p align="center" dir="auto"> <a href="https://www.hostingadvice.com/how-to/nginx-vs-apache/" rel="nofollow"> <img src="https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/nginx_meme.png" alt="Meme" style="max-width: 100%;"> </a> </p> <br> <p align="center" dir="auto"> <sup> <i> Hi-diddle-diddle, he played on his<br> fiddle and danced with lady pigs.<br> Number three said, "Nicks on tricks!<br> I'll build my house with <b>EN-jin-EKS</b>!".<br> <a href="https://g.co/kgs/HCcQVz" rel="nofollow">The Three Little Pigs: Who's Afraid of the Big Bad Wolf?</a> </i> </sup> </p> <br> <p align="center" dir="auto"> <a href="https://github.com/trimstray/nginx-admins-handbook/pulls"> <img src="https://camo.githubusercontent.com/fbf99ae78847941f3b58690e70c3068e9954eb6997437fdd37f38988e102927d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d627269676874677265656e2e7376673f6c6f6e6743616368653d74727565" alt="Pull Requests" data-canonical-src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?longCache=true" style="max-width: 100%;"> </a> <a href="/trimstray/nginx-admins-handbook/blob/master/LICENSE.md"> <img src="https://camo.githubusercontent.com/996d6bf9a5ed2958d53e90aad9e4d2425848f511a0efb51fef7efa68d93e4dc9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d6c69676874677265792e7376673f6c6f6e6743616368653d74727565" alt="MIT License" data-canonical-src="https://img.shields.io/badge/License-MIT-lightgrey.svg?longCache=true" style="max-width: 100%;"> </a> </p> <br> <hr> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Table of Contents</h1><a id="user-content-table-of-contents" class="anchor" aria-label="Permalink: Table of Contents" href="#table-of-contents"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><strong><a href="#introduction">Introduction</a></strong><a id="user-content-toc-introduction"></a> <ul dir="auto"> <li><a href="#prologue">Prologue</a></li> <li><a href="#why-i-created-this-handbook">Why I created this handbook</a></li> <li><a href="#who-this-handbook-is-for">Who this handbook is for</a></li> <li><a href="#before-you-start">Before you start</a></li> <li><a href="#contributing--support">Contributing & Support</a></li> <li><a href="#rss-feed--updates">RSS Feed & Updates</a></li> <li><a href="#checklist-to-rule-them-all">Checklist to rule them all</a></li> </ul> </li> <li><strong><a href="#bonus-stuff">Bonus Stuff</a></strong><a id="user-content-toc-bonus-stuff"></a> <ul dir="auto"> <li><a href="#configuration-reports">Configuration reports</a> <ul dir="auto"> <li><a href="#ssl-labs">SSL Labs</a></li> <li><a href="#mozilla-observatory">Mozilla Observatory</a></li> </ul> </li> <li><a href="#printable-hardening-cheatsheets">Printable hardening cheatsheets</a></li> <li><a href="#fully-automatic-installation">Fully automatic installation</a></li> <li><a href="#static-error-pages-generator">Static error pages generator</a></li> <li><a href="#server-names-parser">Server names parser</a></li> </ul> </li> <li><strong><a href="#books">Books</a></strong><a id="user-content-toc-books"></a> <ul dir="auto"> <li><a href="#nginx-essentials">Nginx Essentials</a></li> <li><a href="#nginx-cookbook">Nginx Cookbook</a></li> <li><a href="#nginx-http-server">Nginx HTTP Server</a></li> <li><a href="#nginx-high-performance">Nginx High Performance</a></li> <li><a href="#mastering-nginx">Mastering Nginx</a></li> <li><a href="#modsecurity-30-and-nginx-quick-start-guide">ModSecurity 3.0 and NGINX: Quick Start Guide</a></li> <li><a href="#cisco-ace-to-nginx-migration-guide">Cisco ACE to NGINX: Migration Guide</a></li> </ul> </li> <li><strong><a href="#external-resources">External Resources</a></strong><a id="user-content-toc-external-resources"></a> <ul dir="auto"> <li><a href="#nginx-official">Nginx official</a></li> <li><a href="#nginx-distributions">Nginx distributions</a></li> <li><a href="#comparison-reviews">Comparison reviews</a></li> <li><a href="#cheatsheets--references">Cheatsheets & References</a></li> <li><a href="#performance--hardening">Performance & Hardening</a></li> <li><a href="#presentations--videos">Presentations & Videos</a></li> <li><a href="#playgrounds">Playgrounds</a></li> <li><a href="#config-generators">Config generators</a></li> <li><a href="#config-parsers">Config parsers</a></li> <li><a href="#config-managers">Config managers</a></li> <li><a href="#static-analyzers">Static analyzers</a></li> <li><a href="#log-analyzers">Log analyzers</a></li> <li><a href="#performance-analyzers">Performance analyzers</a></li> <li><a href="#builder-tools">Builder tools</a></li> <li><a href="#benchmarking-tools">Benchmarking tools</a></li> <li><a href="#debugging-tools">Debugging tools</a></li> <li><a href="#security--web-testing-tools">Security & Web testing tools</a></li> <li><a href="#development">Development</a></li> <li><a href="#online--web-tools">Online & Web tools</a></li> <li><a href="#other-stuff">Other stuff</a></li> </ul> </li> <li><strong><a href="#whats-next">What's next?</a></strong></li> </ul> <details> <summary><b>Other chapters</b></summary><br> <ul dir="auto"> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-basics">HTTP Basics</a></strong><a id="user-content-toc-http-basics"></a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#introduction-1">Introduction</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#features-and-architecture">Features and architecture</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http2">HTTP/2</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#how-to-debug-http2">How to debug HTTP/2?</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http3">HTTP/3</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#uri-vs-url">URI vs URL</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#connection-vs-request">Connection vs request</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-headers">HTTP Headers</a> <ul dir="auto"> <li><a href="#header-compression">Header compression</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-methods">HTTP Methods</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#request">Request</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#request-line">Request line</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#methods">Methods</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#request-uri">Request URI</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-version">HTTP version</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#request-header-fields">Request header fields</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#message-body">Message body</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#generate-requests">Generate requests</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#response">Response</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#status-line">Status line</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-version-1">HTTP version</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#status-codes-and-reason-phrase">Status codes and reason phrase</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#response-header-fields">Response header fields</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#message-body-1">Message body</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-client">HTTP client</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#ip-address-shortcuts">IP address shortcuts</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#back-end-web-architecture">Back-End web architecture</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#useful-video-resources">Useful video resources</a></li> </ul> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#ssltls-basics">SSL/TLS Basics</a></strong><a id="user-content-toc-ssltls-basics"></a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#introduction-2">Introduction</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#tls-versions">TLS versions</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#tls-handshake">TLS handshake</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#in-which-layer-is-tls-situated-within-the-tcpip-stack">In which layer is TLS situated within the TCP/IP stack?</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#rsa-and-ecc-keyscertificates">RSA and ECC keys/certificates</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#cipher-suites">Cipher suites</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#authenticated-encryption-aead-cipher-suites">Authenticated encryption (AEAD) cipher suites</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#why-cipher-suites-are-important">Why cipher suites are important?</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#what-does-insecure-weak-secure-and-recommended-mean">What does insecure, weak, secure and recommended mean?</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#nginx-and-tls-13-cipher-suites">NGINX and TLS 1.3 Cipher Suites</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#diffie-hellman-key-exchange">Diffie-Hellman key exchange</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#what-exactly-is-the-purpose-of-these-dh-parameters">What exactly is the purpose of these DH Parameters?</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#certificates">Certificates</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#chain-of-trust">Chain of Trust</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#what-is-the-main-purpose-of-the-intermediate-ca">What is the main purpose of the Intermediate CA?</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#single-domain">Single-domain</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#multi-domain">Multi-domain</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#wildcard">Wildcard</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#wildcard-ssl-doesnt-handle-root-domain">Wildcard SSL doesn't handle root domain?</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#https-with-self-signed-certificate-vs-http">HTTPS with self-signed certificate vs HTTP</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#tls-server-name-indication">TLS Server Name Indication</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#verify-your-ssl-tls--ciphers-implementation">Verify your SSL, TLS & Ciphers implementation</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#useful-video-resources">Useful video resources</a></li> </ul> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#nginx-basics">NGINX Basics</a></strong><a id="user-content-toc-nginx-basics"></a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#directories-and-files">Directories and files</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#commands">Commands</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#processes">Processes</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#cpu-pinning">CPU pinning</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#shutdown-of-worker-processes">Shutdown of worker processes</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#configuration-syntax">Configuration syntax</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#comments">Comments</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#end-of-lines">End of lines</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#variables-strings-and-quotes">Variables, Strings, and Quotes</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#directives-blocks-and-contexts">Directives, Blocks, and Contexts</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#external-files">External files</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#measurement-units">Measurement units</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#regular-expressions-with-pcre">Regular expressions with PCRE</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#enable-syntax-highlighting">Enable syntax highlighting</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#connection-processing">Connection processing</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#event-driven-architecture">Event-Driven architecture</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#multiple-processes">Multiple processes</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#simultaneous-connections">Simultaneous connections</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#http-keep-alive-connections">HTTP Keep-Alive connections</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#sendfile-tcp_nodelay-and-tcp_nopush">sendfile, tcp_nodelay, and tcp_nopush</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#request-processing-stages">Request processing stages</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#server-blocks-logic">Server blocks logic</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#handle-incoming-connections">Handle incoming connections</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#matching-location">Matching location</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#rewrite-vs-return">rewrite vs return</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#url-redirections">URL redirections</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#try_files-directive">try_files directive</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#if-break-and-set">if, break, and set</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#root-vs-alias">root vs alias</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#internal-directive">internal directive</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#external-and-internal-redirects">External and internal redirects</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#allow-and-deny">allow and deny</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#uri-vs-request_uri">uri vs request_uri</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#compression-and-decompression">Compression and decompression</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#what-is-the-best-nginx-compression-gzip-level">What is the best NGINX compression gzip level?</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#hash-tables">Hash tables</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#server-names-hash-table">Server names hash table</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#log-files">Log files</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#conditional-logging">Conditional logging</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#manually-log-rotation">Manually log rotation</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#error-log-severity-levels">Error log severity levels</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#how-to-log-the-start-time-of-a-request">How to log the start time of a request?</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#how-to-log-the-http-request-body">How to log the HTTP request body?</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#nginx-upstream-variables-returns-2-values">NGINX upstream variables returns 2 values</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#reverse-proxy">Reverse proxy</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#passing-requests">Passing requests</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#trailing-slashes">Trailing slashes</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#passing-headers-to-the-backend">Passing headers to the backend</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#importance-of-the-host-header">Importance of the Host header</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#redirects-and-x-forwarded-proto">Redirects and X-Forwarded-Proto</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#a-warning-about-the-x-forwarded-for">A warning about the X-Forwarded-For</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#improve-extensibility-with-forwarded">Improve extensibility with Forwarded</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#response-headers">Response headers</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#load-balancing-algorithms">Load balancing algorithms</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#backend-parameters">Backend parameters</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#upstream-servers-with-ssl">Upstream servers with SSL</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#round-robin">Round Robin</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#weighted-round-robin">Weighted Round Robin</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#least-connections">Least Connections</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#weighted-least-connections">Weighted Least Connections</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#ip-hash">IP Hash</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#generic-hash">Generic Hash</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#other-methods">Other methods</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#rate-limiting">Rate limiting</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#variables">Variables</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#directives-keys-and-zones">Directives, keys, and zones</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#burst-and-nodelay-parameters">Burst and nodelay parameters</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#naxsi-web-application-firewall">NAXSI Web Application Firewall</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#owasp-modsecurity-core-rule-set-crs">OWASP ModSecurity Core Rule Set (CRS)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#core-modules">Core modules</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#ngx_http_geo_module">ngx_http_geo_module</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#3rd-party-modules">3rd party modules</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#ngx_set_misc">ngx_set_misc</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#ngx_http_geoip_module">ngx_http_geoip_module</a></li> </ul> </li> </ul> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#helpers">Helpers</a></strong><a id="user-content-toc-helpers"></a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installing-from-prebuilt-packages">Installing from prebuilt packages</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#rhel7-or-centos-7">RHEL7 or CentOS 7</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#debian-or-ubuntu">Debian or Ubuntu</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#freebsd">FreeBSD</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installing-from-source">Installing from source</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#automatic-installation-on-rheldebianbsd">Automatic installation on RHEL/Debian/BSD</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#nginx-package">Nginx package</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#dependencies">Dependencies</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#patches">Patches</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#3rd-party-modules">3rd party modules</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#cconfigure-options">Configure options</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#compiler-and-linker">Compiler and linker</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#debugging-symbols">Debugging Symbols</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#systemtap">SystemTap</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#stapxx">stapxx</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installation-nginx-on-centos-7">Installation Nginx on CentOS 7</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#pre-installation-tasks">Pre installation tasks</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#dependencies">Dependencies</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#get-nginx-sources">Get Nginx sources</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#download-3rd-party-modules">Download 3rd party modules</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#build-nginx">Build Nginx</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#post-installation-tasks">Post installation tasks</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installation-openresty-on-centos-7">Installation OpenResty on CentOS 7</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installation-tengine-on-ubuntu-1804">Installation Tengine on Ubuntu 18.04</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installation-nginx-on-freebsd-113">Installation Nginx on FreeBSD 11.3</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#installation-nginx-on-freebsd-113-from-ports">Installation Nginx on FreeBSD 11.3 (from ports)</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-configuration">Analyse configuration</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#monitoring">Monitoring</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#goaccess">GoAccess</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#build-and-install">Build and install</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-log-file-and-enable-all-recorded-statistics">Analyse log file and enable all recorded statistics</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-compressed-log-file">Analyse compressed log file</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-log-file-remotely">Analyse log file remotely</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-log-file-and-generate-html-report">Analyse log file and generate html report</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#ngxtop">Ngxtop</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-log-file">Analyse log file</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-log-file-and-print-requests-with-4xx-and-5xx">Analyse log file and print requests with 4xx and 5xx</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-log-file-remotely-1">Analyse log file remotely</a></li> </ul> </li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing">Testing</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#build-openssl-102-chacha-version">Build OpenSSL 1.0.2-chacha version</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#send-request-and-show-response-headers">Send request and show response headers</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#send-request-with-http-method-user-agent-follow-redirects-and-show-response-headers">Send request with http method, user-agent, follow redirects and show response headers</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#send-multiple-requests">Send multiple requests</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-ssl-connection">Testing SSL connection</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-ssl-connection-debug-mode">Testing SSL connection (debug mode)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-ssl-connection-with-sni-support">Testing SSL connection with SNI support</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-ssl-connection-with-specific-ssl-version">Testing SSL connection with specific SSL version</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-ssl-connection-with-specific-cipher">Testing SSL connection with specific cipher</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-ocsp-stapling">Testing OCSP Stapling</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#verify-0-rtt">Verify 0-RTT</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#testing-scsv">Testing SCSV</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#load-testing-with-apachebench-ab">Load testing with ApacheBench (ab)</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#standard-test">Standard test</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#test-with-keep-alive-header">Test with Keep-Alive header</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#load-testing-with-wrk2">Load testing with wrk2</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#standard-scenarios">Standard scenarios</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#post-call-with-lua">POST call (with Lua)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#random-paths-with-lua">Random paths (with Lua)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#multiple-paths-with-lua">Multiple paths (with Lua)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#random-server-address-to-each-thread-with-lua">Random server address to each thread (with Lua)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#multiple-json-requests-with-lua">Multiple json requests (with Lua)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#debug-mode-with-lua">Debug mode (with Lua)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-data-pass-to-and-from-the-threads">Analyse data pass to and from the threads</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#parsing-wrk-result-and-generate-report">Parsing wrk result and generate report</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#load-testing-with-locust">Load testing with locust</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#multiple-paths">Multiple paths</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#multiple-paths-with-different-user-sessions">Multiple paths with different user sessions</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#tcp-syn-flood-denial-of-service-attack">TCP SYN flood Denial of Service attack</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#tcp-syn-flood-denial-of-service-attack">HTTP Denial of Service attack</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#debugging">Debugging</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-information-about-nginx-processes">Show information about processes</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-memoryusage">Check memory usage</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-open-files">Show open files</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-segmentation-fault-messages">Check segmentation fault messages</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#dump-configuration">Dump configuration</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#get-the-list-of-configure-arguments">Get the list of configure arguments</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-if-the-module-has-been-compiled">Check if the module has been compiled</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-accessed-ip-addresses">Show the most accessed IP addresses</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-accessed-ip-addresses-ip-and-url">Show the most accessed IP addresses (ip and url)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-accessed-ip-addresses-method-code-ip-and-url">Show the most accessed IP addresses (method, code, ip, and url)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-top-5-visitors-ip-addresses">Show the top 5 visitors (IP addresses)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-requested-urls">Show the most requested urls</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-requested-urls-containing-string">Show the most requested urls containing 'string'</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-requested-urls-with-http-methods">Show the most requested urls with http methods</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-the-most-accessed-response-codes">Show the most accessed response codes</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-web-server-log-and-show-only-2xx-http-codes">Analyse web server log and show only 2xx http codes</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#analyse-web-server-log-and-show-only-5xx-http-codes">Analyse web server log and show only 5xx http codes</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-requests-which-result-502-and-sort-them-by-number-per-requests-by-url">Show requests which result 502 and sort them by number per requests by url</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-requests-which-result-404-for-php-files-and-sort-them-by-number-per-requests-by-url">Show requests which result 404 for php files and sort them by number per requests by url</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#calculating-amount-of-http-response-codes">Calculating amount of http response codes</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#calculating-requests-per-second">Calculating requests per second</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#calculating-requests-per-second-with-ip-addresses">Calculating requests per second with IP addresses</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#calculating-requests-per-second-with-ip-addresses-and-urls">Calculating requests per second with IP addresses and urls</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#get-entries-within-last-n-hours">Get entries within last n hours</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#get-entries-between-two-timestamps-range-of-dates">Get entries between two timestamps (range of dates)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#get-line-rates-from-web-server-log">Get line rates from web server log</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#trace-network-traffic-for-all-nginx-processes">Trace network traffic for all processes</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#list-all-files-accessed-by-a-nginx">List all files accessed by a NGINX</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-that-the-gzip_static-module-is-working">Check that the gzip_static module is working</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#which-worker-processing-current-request">Which worker processing current request</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#capture-only-http-packets">Capture only http packets</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#extract-user-agent-from-the-http-packets">Extract User Agent from the http packets</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#capture-only-http-get-and-post-packets">Capture only http GET and POST packets</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#capture-requests-and-filter-by-source-ip-and-destination-port">Capture requests and filter by source ip and destination port</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#capture-http-requests--responses-in-real-time-filter-by-get-head-and-save-to-a-file">Capture HTTP requests/responses in real time, filter by GET, HEAD and save to a file</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#dump-a-processs-memory">Dump a process's memory</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#gnu-debugger-gdb">GNU Debugger (gdb)</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#dump-configuration-from-a-running-process">Dump configuration from a running process</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#show-debug-log-in-memory">Show debug log in memory</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#core-dump-backtrace">Core dump backtrace</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#debugging-socket-leaks">Debugging socket leaks</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#shell-aliases">Shell aliases</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#configuration-snippets">Configuration snippets</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#nginx-server-header-removal">Nginx server header removal</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#custom-log-formats">Custom log formats</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#log-only-4xx5xx">Log only 4xx/5xx</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#restricting-access-with-basic-authentication">Restricting access with basic authentication</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#restricting-access-with-client-certificate">Restricting access with client certificate</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#restricting-access-by-geographical-location">Restricting access by geographical location</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#geoip-2-database">GeoIP 2 database</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#dynamic-error-pages-with-ssi">Dynamic error pages with SSI</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#blockingallowing-ip-addresses">Blocking/allowing IP addresses</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#blocking-referrer-spam">Blocking referrer spam</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#limiting-referrer-spam">Limiting referrer spam</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#blocking-user-agent">Blocking User-Agent</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#limiting-user-agent">Limiting User-Agent</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#limiting-the-rate-of-requests-with-burst-mode">Limiting the rate of requests with burst mode</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#limiting-the-rate-of-requests-with-burst-mode-and-nodelay">Limiting the rate of requests with burst mode and nodelay</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#limiting-the-rate-of-requests-per-ip-with-geo-and-map">Limiting the rate of requests per IP with geo and map</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#limiting-the-number-of-connections">Limiting the number of connections</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#using-trailing-slashes">Using trailing slashes</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#properly-redirect-all-http-requests-to-https">Properly redirect all HTTP requests to HTTPS</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#adding-and-removing-the-www-prefix">Adding and removing the www prefix</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#proxyrewrite-and-keep-the-original-url">Proxy/rewrite and keep the original URL</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#proxyrewrite-and-keep-the-part-of-original-url">Proxy/rewrite and keep the part of original URL</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#proxyrewrite-without-changing-the-original-url-in-browser">Proxy/rewrite without changing the original URL (in browser)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#modify-301302-response-body">Modify 301/302 response body</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#redirect-post-request-with-payload-to-external-endpoint">Redirect POST request with payload to external endpoint</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#route-to-different-backends-based-on-HTTP-method">Route to different backends based on HTTP method</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#allow-multiple-cross-domains-using-the-cors-headers">Allow multiple cross-domains using the CORS headers</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#set-correct-scheme-passed-in-x-forwarded-proto">Set correct scheme passed in X-Forwarded-Proto</a></li> </ul> </li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#other-snippets">Other snippets</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#recreate-base-directory">Recreate base directory</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#create-a-temporary-static-backend">Create a temporary static backend</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#create-a-temporary-static-backend-with-ssl-support">Create a temporary static backend with SSL support</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-password-file-with-htpasswd-command">Generate password file with htpasswd command</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-private-key-without-passphrase">Generate private key without passphrase</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-private-key-with-passphrase">Generate private key with passphrase</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#remove-passphrase-from-private-key">Remove passphrase from private key</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#encrypt-existing-private-key-with-a-passphrase">Encrypt existing private key with a passphrase</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-csr">Generate CSR</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-csr-metadata-from-existing-certificate">Generate CSR (metadata from existing certificate)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-csr-with--config-param">Generate CSR with -config param</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-private-key-and-csr">Generate private key and CSR</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#list-available-ec-curves">List available EC curves</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#print-ecdsa-private-and-public-keys">Print ECDSA private and public keys</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-ecdsa-private-key">Generate ECDSA private key</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-private-key-and-csr-ecc">Generate private key and CSR (ECC)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-self-signed-certificate">Generate self-signed certificate</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-self-signed-certificate-from-existing-private-key">Generate self-signed certificate from existing private key</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-self-signed-certificate-from-existing-private-key-and-csr">Generate self-signed certificate from existing private key and csr</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-multidomain-certificate-certbot">Generate multidomain certificate (Certbot)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-wildcard-certificate-certbot">Generate wildcard certificate (Certbot)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-certificate-with-4096-bit-private-key-certbot">Generate certificate with 4096 bit private key (Certbot)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#generate-dh-public-parameters">Generate DH public parameters</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#display-dh-public-parameters">Display DH public parameters</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#extract-private-key-from-pfx">Extract private key from pfx</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#extract-private-key-and-certs-from-pfx">Extract private key and certs from pfx</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#extract-certs-from-p7b">Extract certs from p7b</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#convert-der-to-pem">Convert DER to PEM</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#convert-pem-to-der">Convert PEM to DER</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#verification-of-the-certificates-supported-purposes">Verification of the certificate's supported purposes</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-private-key">Check private key</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#verification-of-the-private-key">Verification of the private key</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#get-public-key-from-private-key">Get public key from private key</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#verification-of-the-public-key">Verification of the public key</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#verification-of-the-certificate">Verification of the certificate</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#verification-of-the-csr">Verification of the CSR</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-the-private-key-and-the-certificate-are-match">Check the private key and the certificate are match</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#check-the-private-key-and-the-csr-are-match">Check the private key and the CSR are match</a> <a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#tlsv13-and-ccm-ciphers">TLSv1.3 and CCM ciphers</a></li> </ul> </li> </ul> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#base-rules">Base Rules (16)</a></strong><a id="user-content-toc-base-rules"></a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-organising-nginx-configuration">Organising Nginx configuration</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-format-prettify-and-indent-your-nginx-code">Format, prettify and indent your Nginx code</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-reload-option-to-change-configurations-on-the-fly">Use reload option to change configurations on the fly</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-separate-listen-directives-for-80-and-443-ports">Separate listen directives for 80 and 443 ports</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-define-the-listen-directives-with-addressport-pair">Define the listen directives with address:port pair</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-processing-requests-with-undefined-server-names">Prevent processing requests with undefined server names</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-never-use-a-hostname-in-a-listen-or-upstream-directives">Never use a hostname in a listen or upstream directives</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-the-http-headers-with-add_header-and-proxy__header-directives-properly">Set the HTTP headers with add_header and proxy_*_header directives properly</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-only-one-ssl-config-for-the-listen-directive">Use only one SSL config for the listen directive</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-geomap-modules-instead-of-allowdeny">Use geo/map modules instead of allow/deny</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-map-all-the-things">Map all the things...</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-global-root-directory-for-unmatched-locations">Set global root directory for unmatched locations</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-return-directive-for-url-redirection-301-302">Use return directive for URL redirection (301, 302)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-configure-log-rotation-policy">Configure log rotation policy</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-simple-custom-error-pages">Use simple custom error pages</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-dont-duplicate-index-directive-use-it-only-in-the-http-block">Don't duplicate index directive, use it only in the http block</a></li> </ul> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#debugging">Debugging (5)</a></strong><a id="user-content-toc-debugging"></a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-custom-log-formats">Use custom log formats</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-debug-mode-to-track-down-unexpected-behaviour">Use debug mode to track down unexpected behaviour</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-improve-debugging-by-disable-daemon-master-process-and-all-workers-except-one">Improve debugging by disable daemon, master process, and all workers except one</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-core-dumps-to-figure-out-why-nginx-keep-crashing">Use core dumps to figure out why NGINX keep crashing</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-mirror-module-to-copy-requests-to-another-backend">Use mirror module to copy requests to another backend</a></li> </ul> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#performance">Performance (13)</a></strong><a id="user-content-toc-performance"></a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-adjust-worker-processes">Adjust worker processes</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-http2">Use HTTP/2</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-maintaining-ssl-sessions">Maintaining SSL sessions</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-ocsp-stapling">Enable OCSP Stapling</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-exact-names-in-a-server_name-directive-if-possible">Use exact names in a server_name directive if possible</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-avoid-checks-server_name-with-if-directive">Avoid checks server_name with if directive</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-request_uri-to-avoid-using-regular-expressions">Use $request_uri to avoid using regular expressions</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-try_files-directive-to-ensure-a-file-exists">Use try_files directive to ensure a file exists</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-return-directive-instead-of-rewrite-for-redirects">Use return directive instead of rewrite for redirects</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-pcre-jit-to-speed-up-processing-of-regular-expressions">Enable PCRE JIT to speed up processing of regular expressions</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-activate-the-cache-for-connections-to-upstream-servers">Activate the cache for connections to upstream servers</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-make-an-exact-location-match-to-speed-up-the-selection-process">Make an exact location match to speed up the selection process</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-limit_conn-to-improve-limiting-the-download-speed">Use limit_conn to improve limiting the download speed</a></li> </ul> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#hardening">Hardening (31)</a></strong><a id="user-content-toc-hardening"></a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-always-keep-nginx-up-to-date">Always keep NGINX up-to-date</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-run-as-an-unprivileged-user">Run as an unprivileged user</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-disable-unnecessary-modules">Disable unnecessary modules</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-protect-sensitive-resources">Protect sensitive resources</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-take-care-about-your-acl-rules">Take care about your ACL rules</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-hide-nginx-version-number">Hide Nginx version number</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-hide-nginx-server-signature">Hide Nginx server signature</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-hide-upstream-proxy-headers">Hide upstream proxy headers</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-remove-support-for-legacy-and-risky-http-request-headers">Remove support for legacy and risky HTTP request headers</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-only-the-latest-supported-openssl-version">Use only the latest supported OpenSSL version</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-force-all-connections-over-tls">Force all connections over TLS</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-min-2048-bit-for-rsa-and-256-bit-for-ecc">Use min. 2048-bit for RSA and 256-bit for ECC</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-keep-only-tls-13-and-tls-12">Keep only TLS 1.3 and TLS 1.2</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-only-strong-ciphers">Use only strong ciphers</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-more-secure-ecdh-curve">Use more secure ECDH Curve</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-strong-key-exchange-with-perfect-forward-secrecy">Use strong Key Exchange with Perfect Forward Secrecy</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-replay-attacks-on-zero-round-trip-time">Prevent Replay Attacks on Zero Round-Trip Time</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-defend-against-the-beast-attack">Defend against the BEAST attack</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-mitigation-of-crimebreach-attacks">Mitigation of CRIME/BREACH attacks</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-http-strict-transport-security">Enable HTTP Strict Transport Security</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-reduce-xss-risks-content-security-policy">Reduce XSS risks (Content-Security-Policy)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-control-the-behaviour-of-the-referer-header-referrer-policy">Control the behaviour of the Referer header (Referrer-Policy)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-provide-clickjacking-protection-x-frame-options">Provide clickjacking protection (X-Frame-Options)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-some-categories-of-xss-attacks-x-xss-protection">Prevent some categories of XSS attacks (X-XSS-Protection)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-sniff-mimetype-middleware-x-content-type-options">Prevent Sniff Mimetype middleware (X-Content-Type-Options)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-deny-the-use-of-browser-features-feature-policy">Deny the use of browser features (Feature-Policy)</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-reject-unsafe-http-methods">Reject unsafe HTTP methods</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-caching-of-sensitive-data">Prevent caching of sensitive data</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-limit-concurrent-connections">Limit concurrent connections</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-control-buffer-overflow-attacks">Control Buffer Overflow attacks</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-mitigating-slow-http-dos-attacks-closing-slow-connections">Mitigating Slow HTTP DoS attacks (Closing Slow Connections)</a></li> </ul> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#reverse-proxy">Reverse Proxy (8)</a></strong><a id="user-content-toc-reverse-proxy"></a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-pass-directive-compatible-with-backend-protocol">Use pass directive compatible with backend protocol</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-be-careful-with-trailing-slashes-in-proxy_pass-directive">Be careful with trailing slashes in proxy_pass directive</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-and-pass-host-header-only-with-host-variable">Set and pass Host header only with $host variable</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-properly-values-of-the-x-forwarded-for-header">Set properly values of the X-Forwarded-For header</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-dont-use-x-forwarded-proto-with-scheme-behind-reverse-proxy">Don't use X-Forwarded-Proto with $scheme behind reverse proxy</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-always-pass-host-x-real-ip-and-x-forwarded-headers-to-the-backend">Always pass Host, X-Real-IP, and X-Forwarded headers to the backend</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-custom-headers-without-x--prefix">Use custom headers without X- prefix</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-always-use-request_uri-instead-of-uri-in-proxy_pass">Always use $request_uri instead of $uri in proxy_pass</a></li> </ul> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#load-balancing">Load Balancing (2)</a></strong><a id="user-content-toc-load-balancing"></a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-tweak-passive-health-checks">Tweak passive health checks</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-dont-disable-backends-by-comments-use-down-parameter">Don't disable backends by comments, use down parameter</a></li> </ul> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#others">Others (4)</a></strong><a id="user-content-toc-others"></a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-the-certificate-chain-correctly">Set the certificate chain correctly</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-dns-caa-policy">Enable DNS CAA Policy</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-define-security-policies-with-securitytxt">Define security policies with security.txt</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-tcpdump-to-monitor-http-traffic">Use tcpdump to diagnose and troubleshoot the HTTP issues</a></li> </ul> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#configuration-examples">Configuration Examples</a></strong><a id="user-content-toc-configuration-examples"></a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#reverse-proxy">Reverse Proxy</a> <ul dir="auto"> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#installation">Installation</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#configuration">Configuration</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#import-configuration">Import configuration</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#set-bind-ip-address">Set bind IP address</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#set-your-domain-name">Set your domain name</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#regenerate-private-keys-and-certs">Regenerate private keys and certs</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#update-modules-list">Update modules list</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#generating-the-necessary-error-pages">Generating the necessary error pages</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#add-new-domain">Add new domain</a></li> <li><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#test-your-configuration">Test your configuration</a></li> </ul> </li> </ul> </li> </ul> </details> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Introduction</h1><a id="user-content-introduction" class="anchor" aria-label="Permalink: Introduction" href="#introduction"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <br> <p align="center" dir="auto"> <a href="https://www.nginx.com/" rel="nofollow"> <img src="https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/nginx_admins_handbook_logo.png" style="max-width: 100%;"> </a> </p> <br> <blockquote> <p dir="auto">Before you start playing with NGINX please read an official <strong><a href="http://nginx.org/en/docs/beginners_guide.html" rel="nofollow">Beginner’s Guide</a></strong>. It's a great introduction for everyone.</p> </blockquote> <p dir="auto"><strong>Nginx</strong> (<em>/ˌɛndʒɪnˈɛks/ EN-jin-EKS</em>, stylized as NGINX or nginx) is an open source HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server with a strong focus on high concurrency, performance and low memory usage. It is originally written by <a href="http://sysoev.ru/en/" rel="nofollow">Igor Sysoev</a>.</p> <p dir="auto">For a long time, it has been running on many heavily loaded Russian sites including Yandex, Mail.Ru, VK, and Rambler. At this moment some high-profile companies using NGINX include Cisco, DuckDuckGo, Facebook, GitLab, Google, Twitter, Apple, Intel, and many more. In the September 2019 it was the most commonly used HTTP server (see <a href="https://news.netcraft.com/archives/category/web-server-survey/" rel="nofollow">Netcraft survey</a>).</p> <p dir="auto">NGINX is a fast, light-weight and powerful web server that can also be used as a:</p> <ul dir="auto"> <li>fast HTTP reverse proxy</li> <li>reliable load balancer</li> <li>high performance caching server</li> <li>full-fledged web platform</li> </ul> <p dir="auto">So, to be brief, it provides the core of complete web stacks and is designed to help build scalable web applications. When it comes to performance, NGINX can easily handle a huge amount of traffic. The other main advantage of the NGINX is that allows you to do the same thing in different ways.</p> <p dir="auto">Unlike traditional HTTP servers, NGINX doesn't rely on threads to handle requests and it was written with a different architecture in mind - one which is much more suitable for nonlinear scalability in both the number of simultaneous connections and requests per second.</p> <p dir="auto">NGINX is also known as a <em>Apache Killer</em> (mainly because of its lightness and much less RAM consumption). It is event-based, so it does not follow Apache's style of spawning new processes or threads for each web page request. Generally, it was created to solve the <a href="http://www.kegel.com/c10k.html" rel="nofollow">C10K problem</a>.</p> <p dir="auto">For me, it is a one of the best and most important service that I used in my SysAdmin career.</p> <hr> <p dir="auto">These essential documents should be the main source of knowledge for you:</p> <ul dir="auto"> <li><strong><a href="https://www.nginx.com/resources/wiki/start/" rel="nofollow">Getting Started</a></strong></li> <li><strong><a href="https://nginx.org/en/docs/" rel="nofollow">NGINX Documentation</a></strong></li> <li><strong><a href="http://nginx.org/en/docs/dev/development_guide.html" rel="nofollow">Development guide</a></strong></li> <li><strong><a href="https://docs.nginx.com/nginx/admin-guide/security-controls/" rel="nofollow">Security Controls</a></strong></li> </ul> <p dir="auto">In addition, I would like to recommend three great docs focuses on the concept of the HTTP protocol:</p> <ul dir="auto"> <li><strong><a href="https://www.jmarshall.com/easy/http/" rel="nofollow">HTTP Made Really Easy</a></strong></li> <li><strong><a href="https://www.w3.org/Protocols/" rel="nofollow">Hypertext Transfer Protocol Specification</a></strong></li> <li><strong><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP" rel="nofollow">Web technology for developers - HTTP</a></strong></li> </ul> <p dir="auto">If you love security keep your eye on this one: <a href="https://eprint.iacr.org/" rel="nofollow">Cryptology ePrint Archive</a>. It provides access to recent research in cryptology and explores many subjects of security (e.g. Ciphers, Algorithms, SSL/TLS protocols). A great introduction that covers core concepts of cryptography is <a href="https://cryptobook.nakov.com/" rel="nofollow">Practical Cryptography for Developers</a>. I also recommend to read the <a href="https://www.feistyduck.com/books/bulletproof-ssl-and-tls/" rel="nofollow">Bulletproof SSL and TLS</a>. Yep, it's definitely the most comprehensive book about deploying TLS for me.</p> <p dir="auto">An obligatory source of knowledge is also the <a href="https://cheatsheetseries.owasp.org/" rel="nofollow">OWASP Cheat Sheet Series</a>. You should ought treat it as an excellent security guidance. <a href="https://portswigger.net/kb/issues" rel="nofollow">Burp Scanner - Issue Definitions</a> introduces you to the web apps and security vulnerabilities. Finally, <a href="https://portswigger.net/web-security" rel="nofollow">The Web Security Academy</a> is a free online training center for web application security with high-quality reading materials and interactive labs of varying levels of difficulty. All are really good source to start learning about web application security.</p> <p dir="auto">And, of course, always browse official <a href="http://nginx.org/en/security_advisories.html" rel="nofollow">Nginx Security Advisories</a> and CVE databases like <a href="https://www.cvedetails.com/vendor/10048/Nginx.html" rel="nofollow">CVE Details</a> or <a href="https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=NGINX" rel="nofollow">CVE - The MITRE Corporation</a> - to stay Up-to-Date on NGINX vulnerabilities.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Prologue</h2><a id="user-content-prologue" class="anchor" aria-label="Permalink: Prologue" href="#prologue"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">When I was studying architecture of HTTP servers I became interested in NGINX. As I was going through research, I kept notes. I found a lot of information about it, e.g. forum posts on the web about every conceivable problem was great. However, I've never found one guide that covers the most important things in a suitable form. I was a little disappointed.</p> <p dir="auto">I was interested in everything: NGINX internals, functions, security best practices, performance optimisations, tips & tricks, hacks and rules, but for me some of the documents treated the subject lightly.</p> <p dir="auto">Of course, <a href="https://nginx.org/en/docs/" rel="nofollow">NGINX Official Documentation</a> is the best place but I know that we also have other great resources:</p> <ul dir="auto"> <li><a href="https://openresty.org/download/agentzh-nginx-tutorials-en.html" rel="nofollow">agentzh's Nginx Tutorials</a></li> <li><a href="http://www.nginxguts.com/" rel="nofollow">Nginx Guts</a></li> <li><a href="http://www.nginx-discovery.com/" rel="nofollow">Nginx discovery journey</a></li> <li><a href="https://calomel.org/nginx.html" rel="nofollow">Nginx Secure Web Server</a></li> <li><a href="https://www.evanmiller.org/nginx-modules-guide.html" rel="nofollow">Emiller’s Guide To Nginx Module Development</a></li> <li><a href="https://www.evanmiller.org/nginx-modules-guide-advanced.html" rel="nofollow">Emiller’s Advanced Topics In Nginx Module Development</a></li> </ul> <p dir="auto">These are definitely the best assets for us and in the first place you should seek help there. Moreover, in order to improve your knowledge, please see <a href="#books">Books</a> chapter - it contains top literature on NGINX.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Why I created this handbook</h2><a id="user-content-why-i-created-this-handbook" class="anchor" aria-label="Permalink: Why I created this handbook" href="#why-i-created-this-handbook"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">For me, however, there hasn't been a truly in-depth and reasonably simple cheatsheet which describe a variety of configurations and important cross-cutting topics for HTTP servers. Configuration of the NGINX can be tricky sometimes and you really need to get into the syntax and concepts to get an understanding tricks, loopholes, and mechanisms. The documentation isn't as pretty as other projects and should certainly include more robust examples.</p> <blockquote> <p dir="auto">This handbook is a set of rules and recommendations for the NGINX Open Source HTTP server. It also contains the best practices, notes, and helpers with countless examples. Many of them refer to external resources.</p> </blockquote> <p dir="auto">There are a lot of things you can do to improve in your NGINX instance and this guide will attempt to cover as many of them as possible. For the most part, it contains the most important things about NGINX for me. I think the configuration you provided should work without any talisman. That's why I created this repository.</p> <p dir="auto">With this handbook you will explore the many features and capabilities of the NGINX. You'll find out, for example, how to testing the performance or how to resolve debugging problems. You will learn configuration guidelines, security design patterns, ways to handle common issues and how to stay out of them. I explained here a few best tips to avoid pitfalls and configuration mistakes.</p> <p dir="auto">I added set of guidelines and examples has also been produced to help you administer of the NGINX. They give us insight into NGINX internals also.</p> <p dir="auto">Mostly, I apply the rules presented here on the NGINX working as a reverse proxy. However, does not to prevent them being implemented for NGINX as a standalone server.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Who this handbook is for</h2><a id="user-content-who-this-handbook-is-for" class="anchor" aria-label="Permalink: Who this handbook is for" href="#who-this-handbook-is-for"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">If you do not have the time to read hundreds of articles (just like me) this multipurpose handbook may be useful. I created it in the hope that it will be useful especially for System Administrators and Experts of Web-based applications.</p> <p dir="auto">This handbook does not get into all aspects of NGINX. What's more, some of the things described in this guide may be rather basic because most of us do not configure NGINX every day and it is easy to forget about basic/trivial things. On the other hand, also discusses heavyweight topics so there is something for advanced users. I tried to put external resources in many places in this handbook in order to dispel any suspicion that may exist.</p> <p dir="auto">I did my best to make this handbook a single and consistent (but now I know that is really hard). It's organized in an order that makes logical sense to me. I think it can also be a good complement to official documentation and other great documents. Many of the topics described here can certainly be done better or different. Of course, I still have a lot <a href="#contributing--support">to improve and to do</a>. I hope you enjoy and have fun with it.</p> <p dir="auto">Do not treat this handbook and notes written here as revealed knowledge. You should take a scientific approach when reading this document. If you have any doubts and disagree with me, please point out my mistakes. You should to discover cause and effect relationships by asking questions, carefully gathering and examining the evidence, and seeing if all the available information can be combined in to a logical answer.</p> <p dir="auto">I create this handbook for one more reason. Rather than starting from scratch in, I putting together a plan for answering your questions to help you find the best way to do things and ensure that you don't repeat my mistakes from the past.</p> <p dir="auto">So, what's most important:</p> <ul dir="auto"> <li>ask a questions about something that you observe</li> <li>do background research</li> <li>do tests with an experiments</li> <li>analyze and draw conclusions</li> <li>communicate results (for us!)</li> </ul> <p dir="auto">Finally, you should know I'm not a NGINX expert but I love to know how stuff works and why work the way they do. <a href="https://twitter.com/ErikVoorhees/status/1004313761224757248" rel="nofollow">I’m not a crypto expert... but I do know the term "elliptic curve"</a> (I really like this quote!). Don't need to be an expert to figure out the reason just got to have used this and not this or why something works this way and not another. It feels good to understand the recommendations and nuances of a topic you’re passionate about.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Before you start</h2><a id="user-content-before-you-start" class="anchor" aria-label="Permalink: Before you start" href="#before-you-start"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Remember about the following most important things:</p> <blockquote> <p dir="auto"><strong><code>Blindly deploying of the rules described here can damage your web application!</code></strong></p> </blockquote> <blockquote> <p dir="auto"><strong><code>Do not follow guides just to get 100% of something. Think about what you actually do at your server!</code></strong></p> </blockquote> <blockquote> <p dir="auto"><strong><code>Copy-and-paste is not the best way to learn. Think twice before adopting rules from this handbook.</code></strong></p> </blockquote> <blockquote> <p dir="auto"><strong><code>There are no settings that are perfect for everyone.</code></strong></p> </blockquote> <blockquote> <p dir="auto"><strong><code>Always think about what is better and more important for you: security vs usability/compatibility.</code></strong></p> </blockquote> <blockquote> <p dir="auto"><strong><code>Security mainly refers to minimise the risk.</code></strong></p> </blockquote> <blockquote> <p dir="auto"><strong><code>Change one thing may open a whole new set of problems.</code></strong></p> </blockquote> <blockquote> <p dir="auto"><strong><code>Read about how things work and what values are considered secure enough (and for what purposes).</code></strong></p> </blockquote> <blockquote> <p dir="auto"><strong><code>The only correct approach is to understand your exposure, measure and tune.</code></strong></p> </blockquote> <div class="highlight highlight-source-diff notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="+ Security is important for ethical reasons. Compliance is important for legal reasons. + The key to workplace contentment is understanding they are unrelated to each other. + Both are important, but one does not lead to the other (compliance != security). author: unknown + Security is always needed, no matter what type of website it is. It can be static HTML + or fully dynamic, an attacker can still inject hostile content into the page in transit + to attack the user. author: Scott Helme + Don’t enable older deprecated protocols just because Karen in Florida is still using + a PC that she bought back in 2001. author: thisinterestsmeblog"><pre><span class="pl-mi1"><span class="pl-mi1">+</span> Security is important for ethical reasons. Compliance is important for legal reasons.</span> <span class="pl-mi1"><span class="pl-mi1">+</span> The key to workplace contentment is understanding they are unrelated to each other.</span> <span class="pl-mi1"><span class="pl-mi1">+</span> Both are important, but one does not lead to the other (compliance != security).</span> author: unknown <span class="pl-mi1"><span class="pl-mi1">+</span> Security is always needed, no matter what type of website it is. It can be static HTML</span> <span class="pl-mi1"><span class="pl-mi1">+</span> or fully dynamic, an attacker can still inject hostile content into the page in transit</span> <span class="pl-mi1"><span class="pl-mi1">+</span> to attack the user.</span> author: Scott Helme <span class="pl-mi1"><span class="pl-mi1">+</span> Don’t enable older deprecated protocols just because Karen in Florida is still using</span> <span class="pl-mi1"><span class="pl-mi1">+</span> a PC that she bought back in 2001.</span> author: thisinterestsmeblog</pre></div> <p dir="auto">I think, in the age of phishing, cyber attacks, ransomware, etc., you should take care of security of your infrastructure as hard as possible but don't ever forget about this one...</p> <br> <p align="center" dir="auto"> <a target="_blank" rel="noopener noreferrer" href="https://github.com/trimstray/nginx-admins-handbook/blob/master/static/img/crypto_nerds.png"><img src="https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/crypto_nerds.png" style="max-width: 100%;"></a> </p> <p dir="auto">Lastly, I would like to quote two very important comments found on the web about compliance with the standards and regulations, and essence of a human factor in security:</p> <blockquote> <p dir="auto"><em>Regulations that make sense are often not descriptive - capturing the intent and scope of a rule often requires technical expertise. More than that, it's the type of expertise most organisations do not have. And instead of improving themselves, these companies, who may form the grand majority of the industry, petition the regulators to provide a safe checklist of technical mitigations that can be implemented to remain compliant. [...] Instead of doing the right thing and meeting the planned intent, companies are instead ticking nonsensical boxes that the regulators and their auditors demand. Blindly. Mindlessly. Divorced from reality.</em> - by <a href="https://news.ycombinator.com/user?id=bostik" rel="nofollow">bostik</a></p> </blockquote> <blockquote> <p dir="auto"><em>Whenever considering security, the human factor is nearly always as important or more important than just the technical aspects. Policy and procedures need to consider the human element and try to ensure that these policies and procedures are structured in such a way as to help enable staff to do the right thing, even when they may not fully understand why they need to do it.</em> - by <a href="https://security.stackexchange.com/users/13958/tim-x" rel="nofollow">Tim X</a></p> </blockquote> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Contributing & Support</h2><a id="user-content-contributing--support" class="anchor" aria-label="Permalink: Contributing & Support" href="#contributing--support"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <blockquote> <p dir="auto"><em>A real community, however, exists only when its members interact in a meaningful way that deepens their understanding of each other and leads to learning.</em></p> </blockquote> <p dir="auto">If you find something which doesn't make sense, or something doesn't seem right, please make a pull request and please add valid and well-reasoned explanations about your changes or comments.</p> <p dir="auto">Before adding a pull request, please see the <strong><a href="/trimstray/nginx-admins-handbook/blob/master/.github/CONTRIBUTING.md">contributing guidelines</a></strong>.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Code Contributors</h2><a id="user-content-code-contributors" class="anchor" aria-label="Permalink: Code Contributors" href="#code-contributors"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">This project exists thanks to all the people who contribute.</p> <p dir="auto"><a href="https://github.com/trimstray/nginx-admins-handbook/graphs/contributors"><img src="https://camo.githubusercontent.com/f1eeafa832de83b97ee0ca35bd095ddf34552bc46f4dcfa711d7100f1f99ac88/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f6e67696e782d61646d696e732d68616e64626f6f6b2f636f6e7472696275746f72732e7376673f77696474683d38393026627574746f6e3d66616c7365" data-canonical-src="https://opencollective.com/nginx-admins-handbook/contributors.svg?width=890&button=false" style="max-width: 100%;"></a></p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">ToDo</h3><a id="user-content-todo" class="anchor" aria-label="Permalink: ToDo" href="#todo"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">What needs to be done? Look at the following ToDo list:</p> <p dir="auto">New chapters:</p> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <strong>Bonus Stuff</strong></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <strong>HTTP Basics</strong></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <strong>SSL/TLS Basics</strong></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <strong>Reverse Proxy</strong></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <strong>Caching</strong></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <strong>Core modules</strong></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <strong>3rd party modules</strong></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <strong>Web Application Firewall</strong></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <strong>ModSecurity</strong></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <strong>Debugging</strong></li> </ul> <p dir="auto">Existing chapters:</p> <details> <summary><b>Introduction</b></summary><br> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Prologue</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Why I created this handbook</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Who this handbook is for</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Before you start</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Contributing & Support</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> _RSS Feed & Updates</li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Checklist to rule them all</em></li> </ul> </details> <details> <summary><b>Bonus Stuff</b></summary><br> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Fully automatic installation</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Static error pages generator</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Server names parser</em></li> </ul> </details> <details> <summary><b>Books</b></summary><br> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>ModSecurity 3.0 and NGINX: Quick Start Guide</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Cisco ACE to NGINX: Migration Guide</em></li> </ul> </details> <details> <summary><b>External Resources</b></summary><br> <ul dir="auto"> <li><em>Nginx official</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Nginx Forum</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Nginx Mailing List</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>NGINX-Demos</em></li> </ul> </li> <li><em>Presentations & Videos</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>NGINX: Basics and Best Practices</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>NGINX Installation and Tuning</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Nginx Internals (by Joshua Zhu)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Nginx internals (by Liqiang Xu)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>How to secure your web applications with NGINX</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Tuning TCP and NGINX on EC2</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Extending functionality in nginx, with modules!</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Nginx - Tips and Tricks.</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Nginx Scripting - Extending Nginx Functionalities with Lua</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>How to handle over 1,200,000 HTTPS Reqs/Min</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Using ngx_lua / lua-nginx-module in pixiv</em></li> </ul> </li> <li><em>Cheatsheets & References</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Nginx configurations for most popular CMS/CMF/Frameworks based on PHP</em></li> </ul> </li> <li><em>Performance & Hardening</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Memorable site for testing clients against bad SSL configs</em></li> </ul> </li> <li><em>Config parsers</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Quick and reliable way to convert NGINX configurations into JSON and back</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Parses nginx configuration with Pyparsing</em></li> </ul> </li> <li><em>Config managers</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Ansible role to install and manage nginx configuration</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Ansible Role - Nginx</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Ansible role for NGINX</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Puppet Module to manage NGINX on various UNIXes</em></li> </ul> </li> <li><em>Static analyzers</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>nginx-minify-conf</em></li> </ul> </li> <li><em>Comparison reviews</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>NGINX vs. Apache (Pro/Con Review, Uses, & Hosting for Each)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Web cache server performance benchmark: nuster vs nginx vs varnish vs squid</em></li> </ul> </li> <li><em>Builder tools</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Nginx-builder</em></li> </ul> </li> <li><em>Benchmarking tools</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>wrk2</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>httperf</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>slowloris</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>slowhttptest</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>GoldenEye</em></li> </ul> </li> <li><em>Debugging tools</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>strace</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>GDB</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>SystemTap</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>stapxx</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>htrace.sh</em></li> </ul> </li> <li><em>Security & Web testing tools</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Burp Suite</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>w3af</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>nikto</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>ssllabs-scan</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>http-observatory</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>testssl.sh</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>sslyze</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>cipherscan</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>O-Saft</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Nghttp2</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>h2spec</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>http2fuzz</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Arjun</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Corsy</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>XSStrike</em></li> </ul> </li> <li><em>Online & Web tools</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>ssltools</em></li> </ul> </li> <li><em>Other stuff</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>OWASP Cheat Sheet Series</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Mozilla Web Security</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Application Security Wiki</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>OWASP ASVS 4.0</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>The System Design Primer</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>awesome-scalability</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Web Architecture 101</em></li> </ul> </li> </ul> </details> <details> <summary><b>HTTP Basics</b></summary><br> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Features and architecture</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>HTTP/2</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>How to debug HTTP/2?</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>HTTP/3</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>URI vs URL</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Connection vs request</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>HTTP Headers</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Header compression</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>HTTP Methods</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Request</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Request line</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Methods</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Request URI</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>HTTP version</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Request header fields</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Message body</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate requests</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Response</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Status line</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>HTTP version</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Status codes and reason phrase</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Response header fields</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Message body</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>HTTP client</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>IP address shortcuts</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Back-End web architecture</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Useful video resources</em></li> </ul> </details> <details> <summary><b>SSL/TLS Basics</b></summary><br> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>TLS versions</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>TLS handshake</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>In which layer is TLS situated within the TCP/IP stack?</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>RSA and ECC keys/certificates</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Cipher suites</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Authenticated encryption (AEAD) cipher suites</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Why cipher suites are important?</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>NGINX and TLS 1.3 Cipher Suites</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Diffie-Hellman key exchange</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Certificates</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Chain of Trust</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>What is the main purpose of the Intermediate CA?</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Single-domain</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Multi-domain</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Wildcard</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Wildcard SSL doesn't handle root domain?</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>TLS Server Name Indication</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Verify your SSL, TLS & Ciphers implementation</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Useful video resources</em></li> </ul> </details> <details> <summary><b>NGINX Basics</b></summary><br> <ul dir="auto"> <li><em>Processes</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>CPU pinning</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Shutdown of worker processes</em></li> </ul> </li> <li><em>Configuration syntax</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Comments</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>End of lines</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Variables, Strings, and Quotes</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Directives, Blocks, and Contexts</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>External files</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Measurement units</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Regular expressions with PCRE</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Enable syntax highlighting</em></li> </ul> </li> <li><em>Connection processing</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Event-Driven architecture</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Multiple processes</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Simultaneous connections</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>HTTP Keep-Alive connections</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>sendfile, tcp_nodelay, and tcp_nopush</em></li> </ul> </li> <li><em>Server blocks logic</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Matching location</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>if in location</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Nested locations</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>rewrite vs return</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>try_files directive</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>if, break and set</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>root vs alias</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>internal directive</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>External and internal redirects</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>allow and deny</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>uri vs request_uri</em></li> </ul> </li> <li><em>Compression and decompression</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>What is the best NGINX compression gzip level?</em></li> </ul> </li> <li><em>Hash tables</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Server names hash table</em></li> </ul> </li> <li><em>Log files</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Conditional logging</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Manually log rotation</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>NGINX upstream variables returns 2 values</em></li> </ul> </li> <li><em>Reverse proxy</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Passing requests</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Trailing slashes</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Processing headers</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Passing headers</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Importance of the Host header</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Redirects and X-Forwarded-Proto</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>A warning about the X-Forwarded-For</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Improve extensibility with Forwarded</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Response headers</em></li> </ul> </li> <li><em>Load balancing algorithms</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Backend parameters</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Upstream servers with SSL</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Round Robin</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Weighted Round Robin</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Least Connections</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Weighted Least Connections</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>IP Hash</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generic Hash</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Fair module</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Other methods</em></li> </ul> </li> <li><em>Rate Limiting</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Variables</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Directives, keys, and zones</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Burst and nodelay parameters</em></li> </ul> </li> <li><em>NAXSI Web Application Firewall</em></li> <li><em>OWASP ModSecurity Core Rule Set (CRS)</em></li> <li><em>Other subjects</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Secure Distribution of SSL Private Keys with NGINX</em></li> </ul> </li> <li><em>Core modules</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>ngx_http_geo_module</em></li> </ul> </li> <li><em>3rd party modules</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>ngx_set_misc</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>ngx_http_geoip_module</em></li> </ul> </li> </ul> </details> <details> <summary><b>Helpers</b></summary><br> <ul dir="auto"> <li><em>Installing from source</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Automatic installation on RHEL/Debian/BSD</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Compiler and linker</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Debugging Symbols</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>SystemTap</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>stapxx</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Separation and improvement of installation methods</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Installation Nginx on CentOS 7</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Installation OpenResty on CentOS 7</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Installation Tengine on Ubuntu 18.04</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Installation Nginx on FreeBSD 11.3</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Installation Nginx on FreeBSD 11.3 (from ports)</em></li> </ul> </li> <li><em>Monitoring</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>CollectD, Prometheus, and Grafana</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>nginx-vts-exporter</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>CollectD, InfluxDB, and Grafana</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Telegraf, InfluxDB, and Grafana</em></li> </ul> </li> <li><em>Testing</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Build OpenSSL 1.0.2-chacha version</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Send request and show response headers</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Send request with http method, user-agent, follow redirects and show response headers</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Send multiple requests</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Testing SSL connection</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Testing SSL connection (debug mode)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Testing SSL connection with SNI support</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Testing SSL connection with specific SSL version</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Testing SSL connection with specific cipher</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Verify 0-RTT</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Testing SCSV</em></li> <li><em>Load testing with ApacheBench (ab)</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Standard test</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Test with Keep-Alive header</em></li> </ul> </li> <li><em>Load testing with wrk2</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Standard scenarios</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>POST call (with Lua)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Random paths (with Lua)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Multiple paths (with Lua)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Random server address to each thread (with Lua)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Multiple json requests (with Lua)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Debug mode (with Lua)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Analyse data pass to and from the threads</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Parsing wrk result and generate report</em></li> </ul> </li> <li><em>Load testing with locust</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Multiple paths</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Multiple paths with different user sessions</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>TCP SYN flood Denial of Service attack</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>HTTP Denial of Service attack</em></li> </ul> </li> <li><em>Debugging</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Show information about processes</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Check memory usage</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Show open files</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Check segmentation fault messages</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Dump configuration</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Get the list of configure arguments</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Check if the module has been compiled</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Show the most accessed IP addresses (ip and url)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Show the most requested urls with http methods</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Show the most accessed response codes</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Calculating requests per second with IP addresses and urls</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Check that the gzip_static module is working</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Which worker processing current request</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Capture only http packets</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Extract User Agent from the http packets</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Capture only http GET and POST packets</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Capture requests and filter by source ip and destination port</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Capture HTTP requests/responses in real time, filter by GET, HEAD and save to a file</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Server Side Include (SSI) debugging</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Dump a process's memory</em></li> <li><em>GNU Debugger (gdb)</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Dump configuration from a running process</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Show debug log in memory</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Core dump backtrace</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Debugging socket leaks</em></li> <li><em>SystemTap cheatsheet</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>stapxx</em></li> </ul> </li> </ul> </li> <li><em>Errors & Issues</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Common errors</em></li> </ul> </li> <li><em>Configuration snippets</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Nginx server header removal</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Custom log formats</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Log only 4xx/5xx</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Restricting access with client certificate</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Restricting access by geographical location</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>GeoIP 2 database</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Custom error pages</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Dynamic error pages with SSI</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Limiting the rate of requests per IP with geo and map</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Using trailing slashes</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Properly redirect all HTTP requests to HTTPS</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Adding and removing the www prefix</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Proxy/rewrite and keep the original URL</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Proxy/rewrite and keep the part of original URL</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Proxy/rewrite without changing the original URL (in browser)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Modify 301/302 response body</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Redirect POST request with payload to external endpoint</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Route to different backends based on HTTP method</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Redirect users with certain IP to special location</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Allow multiple cross-domains using the CORS headers</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Set correct scheme passed in X-Forwarded-Proto</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Securing URLs with the Secure Link Module</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Tips and methods for high load traffic testing (cheatsheet)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Location matching examples</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Passing requests to the backend</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>The HTTP backend server</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>The uWSGI backend server</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>The FastCGI backend server</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>The memcached backend server</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>The Redis backend server</em></li> </ul> </li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>HTTPS traffic to upstream servers</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>TCP and UDP load balancing</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Lua snippets</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>nginscripts snippets</em></li> </ul> </li> <li><em>Other snippets</em> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Recreate base directory</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Create a temporary static backend</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Create a temporary static backend with SSL support</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate password file with htpasswd command</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate private key without passphrase</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate private key with passphrase</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Remove passphrase from private key</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Encrypt existing private key with a passphrase</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate CSR</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate CSR (metadata from existing certificate)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate CSR with -config param</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate private key and CSR</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>List available EC curves</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate ECDSA private key</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate private key and CSR (ECC)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate self-signed certificate</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate self-signed certificate from existing private key</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate self-signed certificate from existing private key and csr</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate multidomain certificate (Certbot)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate wildcard certificate (Certbot)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate certificate with 4096 bit private key (Certbot)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Generate DH public parameters</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Display DH public parameters</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Extract certs from p7b</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Convert DER to PEM</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Convert PEM to DER</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Verification of the certificate's supported purposes</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Verification of the private key</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Check private key</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Get public key from private key</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Verification of the public key</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Verification of the certificate</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Verification of the CSR</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Check the private key and the certificate are match</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>TLSv1.3 and CCM ciphers</em></li> </ul> </li> </ul> </details> <details> <summary><b>Base Rules</b></summary><br> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Format, prettify and indent your Nginx code</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Never use a hostname in a listen or upstream directives</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Set the HTTP headers with add_header and proxy</em>*<em>header directives properly</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Making a rewrite absolute (with scheme)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Use return directive for URL redirection (301, 302)</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Use simple custom error pages</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Configure log rotation policy</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Don't duplicate index directive, use it only in the http block</em></li> </ul> </details> <details> <summary><b>Debugging</b></summary><br> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Improve debugging by disable daemon, master process, and all workers except one</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Use core dumps to figure out why NGINX keep crashing</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Use mirror module to copy requests to another backend</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Dynamic debugging with echo module</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Dynamic debugging with SSI</em></li> </ul> </details> <details> <summary><b>Performance</b></summary><br> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Enable OCSP Stapling</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Avoid multiple index directives</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Use $request_uri to avoid using regular expressions</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Use try_files directive to ensure a file exists</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Don't pass all requests to the backend - use try_files</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Use return directive instead of rewrite for redirects</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Enable PCRE JIT to speed up processing of regular expressions</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Set proxy timeouts for normal load and under heavy load</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Configure kernel parameters for high load traffic</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Activate the cache for connections to upstream servers</em></li> </ul> </details> <details> <summary><b>Hardening</b></summary><br> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Keep NGINX up-to-date</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Take care about your ACL rules</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Use only the latest supported OpenSSL version</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Remove support for legacy and risky HTTP request headers</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Prevent Replay Attacks on Zero Round-Trip Time</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Prevent caching of sensitive data</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Limit concurrent connections</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Set properly files and directories permissions (also with acls) on a paths</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Implement HTTPOnly and secure attributes on cookies</em></li> </ul> </details> <details> <summary><b>Reverse Proxy</b></summary><br> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Use pass directive compatible with backend protocol</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Be careful with trailing slashes in proxy_pass directive</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Set and pass Host header only with $host variable</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Set properly values of the X-Forwarded-For header</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Don't use X-Forwarded-Proto with $scheme behind reverse proxy</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Always pass Host, X-Real-IP, and X-Forwarded headers to the backend</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Use custom headers without X- prefix</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Always use $request_uri instead of $uri in proxy_pass</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> <em>Set proxy buffers and timeouts</em></li> </ul> </details> <details> <summary><b>Others</b></summary><br> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Set the certificate chain correctly</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Define security policies with security.txt</em></li> <li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> <em>Use tcpdump to diagnose and troubleshoot the HTTP issues</em></li> </ul> </details> <p dir="auto">If you have any idea, send it back to me or add a pull request.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">RSS Feed & Updates</h2><a id="user-content-rss-feed--updates" class="anchor" aria-label="Permalink: RSS Feed & Updates" href="#rss-feed--updates"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">GitHub exposes an <a href="https://github.com/trimstray/nginx-admins-handbook/commits.atom">RSS/Atom</a> feed of the commits, which may also be useful if you want to be kept informed about all changes.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Checklist to rule them all</h2><a id="user-content-checklist-to-rule-them-all" class="anchor" aria-label="Permalink: Checklist to rule them all" href="#checklist-to-rule-them-all"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">This checklist was the primary aim of the <em>nginx-admins-handbook</em>. It contains a set of best practices and recommendations on how to configure and maintain the NGINX properly.</p> <blockquote> <p dir="auto">This checklist contains <a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md">all rules (79)</a> from this handbook.</p> </blockquote> <p dir="auto">Generally, I think that each of these principles is important and should be considered. I separated them into four levels of priority to help guide your decision.</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="center"><b>PRIORITY</b></th> <th align="left"><b>NAME</b></th> <th align="center"><b>AMOUNT</b></th> <th align="left"><b>DESCRIPTION</b></th> </tr> </thead> <tbody> <tr> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> <td align="left"><i>critical</i></td> <td align="center">33</td> <td align="left">definitely use this rule, otherwise it will introduce high risks of your NGINX security, performance, and other</td> </tr> <tr> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> <td align="left"><i>major</i></td> <td align="center">26</td> <td align="left">it's also very important but not critical, and should still be addressed at the earliest possible opportunity</td> </tr> <tr> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> <td align="left"><i>normal</i></td> <td align="center">12</td> <td align="left">there is no need to implement but it is worth considering because it can improve the NGINX working and functions</td> </tr> <tr> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png" alt="info" style="max-width: 100%;"></a></td> <td align="left"><i>minor</i></td> <td align="center">8</td> <td align="left">as an option to implement or use (not required)</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Remember, these are only guidelines. My point of view may be different from yours so if you feel these priority levels do not reflect your configurations commitment to security, performance or whatever else, you should adjust them as you see fit.</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left"><b>RULE</b></th> <th align="left"><b>CHAPTER</b></th> <th align="center"><b>PRIORITY</b></th> </tr> </thead> <tbody> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-define-the-listen-directives-with-addressport-pair">Define the listen directives with address:port pair</a><br><sup>Prevents soft mistakes which may be difficult to debug.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-processing-requests-with-undefined-server-names">Prevent processing requests with undefined server names</a><br><sup>It protects against configuration errors, e.g. traffic forwarding to incorrect backends.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-never-use-a-hostname-in-a-listen-or-upstream-directives">Never use a hostname in a listen or upstream directives</a><br><sup>While this may work, it will comes with a large number of issues.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-the-http-headers-with-add_header-and-proxy__header-directives-properly">Set the HTTP headers with add_header and proxy_*_header directives properly</a><br><sup>Set the right security headers for all contexts.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-configure-log-rotation-policy">Configure log rotation policy</a><br><sup>Save yourself trouble with your web server: configure appropriate logging policy.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-simple-custom-error-pages">Use simple custom error pages</a><br><sup>Default error pages reveals information which leads to information leakage vulnerability.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-http2">Use HTTP/2</a><br><sup>HTTP/2 will make our applications faster, simpler, and more robust.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-always-keep-nginx-up-to-date">Always keep NGINX up-to-date</a><br><sup>Use newest NGINX package to fix vulnerabilities, bugs, and to use new features.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-run-as-an-unprivileged-user">Run as an unprivileged user</a><br><sup>Use the principle of least privilege. This way only master process runs as root.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-protect-sensitive-resources">Protect sensitive resources</a><br><sup>Hidden directories and files should never be web accessible.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-take-care-about-your-acl-rules">Take care about your ACL rules</a><br><sup>Test your access-control lists and to stay secure.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-hide-upstream-proxy-headers">Hide upstream proxy headers</a><br><sup>Don't expose what version of software is running on the server.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-remove-support-for-legacy-and-risky-http-request-headers">Remove support for legacy and risky HTTP request headers</a><br><sup>Supports for the offending headers should be removed.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-force-all-connections-over-tls">Force all connections over TLS</a><br><sup>Protects your website for handle sensitive communications.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-min-2048-bit-for-rsa-and-256-bit-for-ecc">Use min. 2048-bit for RSA and 256-bit for ECC</a><br><sup>2048 bit (RSA) or 256 bit (ECC) keys are sufficient for commercial use.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-keep-only-tls-13-and-tls-12">Keep only TLS 1.3 and TLS 1.2</a><br><sup>Use TLS with modern cryptographic algorithms and without protocol weaknesses.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-only-strong-ciphers">Use only strong ciphers</a><br><sup>Use only strong and not vulnerable cipher suites.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-more-secure-ecdh-curve">Use more secure ECDH Curve</a><br><sup>Use ECDH Curves with according to NIST recommendations.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-strong-key-exchange-with-perfect-forward-secrecy">Use strong Key Exchange with Perfect Forward Secrecy</a><br><sup>Establishes a shared secret between two parties that can be used for secret communication.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-defend-against-the-beast-attack">Defend against the BEAST attack</a><br><sup>The server ciphers should be preferred over the client ciphers.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-http-strict-transport-security">Enable HTTP Strict Transport Security</a><br><sup>Tells browsers that it should only be accessed using HTTPS, instead of using HTTP.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-reduce-xss-risks-content-security-policy">Reduce XSS risks (Content-Security-Policy)</a><br><sup>CSP is best used as defence-in-depth. It reduces the harm that a malicious injection can cause.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-control-the-behaviour-of-the-referer-header-referrer-policy">Control the behaviour of the Referer header (Referrer-Policy)</a><br><sup>The default behaviour of referrer leaking puts websites at risk of privacy and security breaches.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-provide-clickjacking-protection-x-frame-options">Provide clickjacking protection (X-Frame-Options)</a><br><sup>Defends against clickjacking attack.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-some-categories-of-xss-attacks-x-xss-protection">Prevent some categories of XSS attacks (X-XSS-Protection)</a><br><sup>Prevents to render pages if a potential XSS reflection attack is detected.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-sniff-mimetype-middleware-x-content-type-options">Prevent Sniff Mimetype middleware (X-Content-Type-Options)</a><br><sup>Tells browsers not to sniff MIME types.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-reject-unsafe-http-methods">Reject unsafe HTTP methods</a><br><sup>Only allow the HTTP methods for which you, in fact, provide services.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-caching-of-sensitive-data">Prevent caching of sensitive data</a><br><sup>It helps to prevent critical data (e.g. credit card details, or username) leaked.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-limit-concurrent-connections">Limit concurrent connections</a><br><sup>Limit concurrent connections to prevent a rogue guys from repeatedly connecting to and monopolizing NGINX.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-pass-directive-compatible-with-backend-protocol">Use pass directive compatible with backend protocol</a><br><sup>Set pass directive only to working with compatible backend layer protocol.</sup></td> <td align="left">Reverse Proxy</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-properly-values-of-the-x-forwarded-for-header">Set properly values of the X-Forwarded-For header</a><br><sup>Identify clients communicating with servers located behind the proxy.</sup></td> <td align="left">Reverse Proxy</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-dont-use-x-forwarded-proto-with-scheme-behind-reverse-proxy">Don't use X-Forwarded-Proto with $scheme behind reverse proxy</a><br><sup>Prevent pass incorrect value of this header.</sup></td> <td align="left">Reverse Proxy</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-always-use-request_uri-instead-of-uri-in-proxy_pass">Always use $request_uri instead of $uri in proxy_pass</a><br><sup>You should always pass unchanged URI to the backend layer.</sup></td> <td align="left">Reverse Proxy</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/high.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/high.png" alt="high" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-organising-nginx-configuration">Organising Nginx configuration</a><br><sup>Well organised code is easier to understand and maintain.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-format-prettify-and-indent-your-nginx-code">Format, prettify and indent your Nginx code</a><br><sup>Formatted code is easier to maintain, debug, and can be read and understood in a short amount of time.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-reload-option-to-change-configurations-on-the-fly">Use reload option to change configurations on the fly</a><br><sup>Graceful reload of the configuration without stopping the server and dropping any packets.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-return-directive-for-url-redirection-301-302">Use return directive for URL redirection (301, 302)</a><br><sup>The by far simplest and fastest because there is no regexp that has to be evaluated.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-maintaining-ssl-sessions">Maintaining SSL sessions</a><br><sup>Improves performance from the clients’ perspective.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-ocsp-stapling">Enable OCSP Stapling</a><br><sup>Enable to reduce the cost of an OCSP validation.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-exact-names-in-a-server_name-directive-if-possible">Use exact names in a server_name directive if possible</a><br><sup>Helps speed up searching using exact names.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-avoid-checks-server_name-with-if-directive">Avoid checks server_name with if directive</a><br><sup>It decreases NGINX processing requirements.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-request_uri-to-avoid-using-regular-expressions">Use $request_uri to avoid using regular expressions</a><br><sup>By default, the regex is costly and will slow down the performance.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-try_files-directive-to-ensure-a-file-exists">Use try_files directive to ensure a file exists</a><br><sup>Use it if you need to search for a file, it saving duplication of code also.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-return-directive-instead-of-rewrite-for-redirects">Use return directive instead of rewrite for redirects</a><br><sup>Use return directive to more speedy response than rewrite.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-pcre-jit-to-speed-up-processing-of-regular-expressions">Enable PCRE JIT to speed up processing of regular expressions</a><br><sup>NGINX with PCRE JIT is much faster than without it.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-activate-the-cache-for-connections-to-upstream-servers">Activate the cache for connections to upstream servers</a><br><sup> Nginx can now reuse its existing connections (keepalive) per upstream.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-disable-unnecessary-modules">Disable unnecessary modules</a><br><sup>Limits vulnerabilities, improve performance and memory efficiency.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-hide-nginx-version-number">Hide Nginx version number</a><br><sup>Don't disclose sensitive information about NGINX.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-hide-nginx-server-signature">Hide Nginx server signature</a><br><sup>Don't disclose sensitive information about NGINX.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-only-the-latest-supported-openssl-version">Use only the latest supported OpenSSL version</a><br><sup>Stay protected from SSL security threats and don't miss out of new features.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-prevent-replay-attacks-on-zero-round-trip-time">Prevent Replay Attacks on Zero Round-Trip Time</a><br><sup>0-RTT is disabled by default but you should know that enabling this option creates a significant security risks.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-mitigation-of-crimebreach-attacks">Mitigation of CRIME/BREACH attacks</a><br><sup>Disable HTTP compression or compress only zero sensitive content.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-deny-the-use-of-browser-features-feature-policy">Deny the use of browser features (Feature-Policy)</a><br><sup>A mechanism to allow and deny the use of browser features.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-control-buffer-overflow-attacks">Control Buffer Overflow attacks</a><br><sup>Prevents errors are characterised by the overwriting of memory fragments of the NGINX process.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-mitigating-slow-http-dos-attack-closing-slow-connections">Mitigating Slow HTTP DoS attacks (Closing Slow Connections)</a><br><sup>Prevents attacks in which the attacker sends HTTP requests in pieces slowly.</sup></td> <td align="left">Hardening</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-and-pass-host-header-only-with-host-variable">Set and pass Host header only with $host variable</a><br><sup>Use of the $host is the only one guaranteed to have something sensible.</sup></td> <td align="left">Reverse Proxy</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-always-pass-host-x-real-ip-and-x-forwarded-headers-to-the-backend">Always pass Host, X-Real-IP, and X-Forwarded headers to the backend</a><br><sup>It gives you more control of forwarded headers.</sup></td> <td align="left">Reverse Proxy</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-the-certificate-chain-correctly">Set the certificate chain correctly</a><br><sup>Send the complete chain to the client.</sup></td> <td align="left">Others</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-enable-dns-caa-policy">Enable DNS CAA Policy</a><br><sup>Allows domain name holders to indicate to CA whether they are authorized to issue digital certificates.</sup></td> <td align="left">Others</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/medium.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/medium.png" alt="medium" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-separate-listen-directives-for-80-and-443-ports">Separate listen directives for 80 and 443 ports</a><br><sup>Help you maintain and modify your configuration.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-only-one-ssl-config-for-the-listen-directive">Use only one SSL config for the listen directive</a><br><sup>Prevents multiple configurations on the same listening address.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-geomap-modules-instead-of-allowdeny">Use geo/map modules instead of allow/deny</a><br><sup>Provides the perfect way to block invalid visitors.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-set-global-root-directory-for-unmatched-locations">Set global root directory for unmatched locations</a><br><sup>Specifies the root directory for an undefined locations.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-dont-duplicate-index-directive-use-it-only-in-the-http-block">Don't duplicate index directive, use it only in the http block</a><br><sup>Watch out for duplicating the same rules.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-adjust-worker-processes">Adjust worker processes</a><br><sup>You can adjust this value to maximum throughput under high concurrency.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-make-an-exact-location-match-to-speed-up-the-selection-process">Make an exact location match to speed up the selection process</a><br><sup>Exact location matches are often used to speed up the selection process.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-limit_conn-to-improve-limiting-the-download-speed">Use limit_conn to improve limiting the download speed</a><br><sup>Limits NGINX download speed per connection.</sup></td> <td align="left">Performance</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-be-careful-with-trailing-slashes-in-proxy_pass-directive">Be careful with trailing slashes in proxy_pass directive</a><br><sup>Incorrect setting could end up with some strange url.</sup></td> <td align="left">Reverse Proxy</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-custom-headers-without-x--prefix">Use custom headers without X- prefix</a><br><sup>The use of custom headers with X- prefix is discouraged.</sup></td> <td align="left">Reverse Proxy</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-tweak-passive-health-checks">Tweak passive health checks</a><br><sup>Improve behaviour of the passive health checks.</sup></td> <td align="left">Load Balancing</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-define-security-policies-with-securitytxt">Define security policies with security.txt</a><br><sup>Helps make things easier for companies and security researchers.</sup></td> <td align="left">Others</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/low.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/low.png" alt="low" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-map-all-the-things">Map all the things...</a><br><sup>Map module provides a more elegant solution for clearly parsing a big list of regexes.</sup></td> <td align="left">Base Rules</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png" alt="info" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-custom-log-formats">Use custom log formats</a><br><sup>This is extremely helpful for debugging specific location directives.</sup></td> <td align="left">Debugging</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png" alt="info" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-debug-mode-to-track-down-unexpected-behaviour">Use debug mode to track down unexpected behaviour</a><br><sup>There's probably more detail than you want, but that can sometimes be a lifesaver.</sup></td> <td align="left">Debugging</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png" alt="info" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-improve-debugging-by-disable-daemon-master-process-and-all-workers-except-one">Improve debugging by disable daemon, master process, and all workers except one</a><br><sup>This simplifies the debugging and lets test configurations rapidly.</sup></td> <td align="left">Debugging</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png" alt="info" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-core-dumps-to-figure-out-why-nginx-keep-crashing">Use core dumps to figure out why NGINX keep crashing</a><br><sup>Enable core dumps when your NGINX instance receive an unexpected error or when it crashed.</sup></td> <td align="left">Debugging</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png" alt="info" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-mirror-module-to-copy-requests-to-another-backend">Use mirror module to copy requests to another backend</a><br><sup>Use mirroring for investigation and debugging of any original request.</sup></td> <td align="left">Debugging</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png" alt="info" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-dont-disable-backends-by-comments-use-down-parameter">Don't disable backends by comments, use down parameter</a><br><sup>Is a good solution to marks the server as permanently unavailable.</sup></td> <td align="left">Load Balancing</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png" alt="info" style="max-width: 100%;"></a></td> </tr> <tr> <td align="left"><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#beginner-use-tcpdump-to-diagnose-and-troubleshoot-the-http-issues">Use tcpdump to diagnose and troubleshoot the HTTP issues</a><br><sup>Use tcpdump to monitor HTTP.</sup></td> <td align="left">Others</td> <td align="center"><a target="_blank" rel="noopener noreferrer" href="/trimstray/nginx-admins-handbook/blob/master/static/img/priorities/info.png"><img src="/trimstray/nginx-admins-handbook/raw/master/static/img/priorities/info.png" alt="info" style="max-width: 100%;"></a></td> </tr> </tbody> </table></markdown-accessiblity-table> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Bonus Stuff</h1><a id="user-content-bonus-stuff" class="anchor" aria-label="Permalink: Bonus Stuff" href="#bonus-stuff"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">You can find here a few of the different things I've worked and included to this repository. I hope that these extras will be useful.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Configuration reports</h2><a id="user-content-configuration-reports" class="anchor" aria-label="Permalink: Configuration reports" href="#configuration-reports"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Many of these recipes have been applied to the configuration of my old private website.</p> <blockquote> <p dir="auto">An example configuration is in the <a href="#configuration-examples">configuration examples</a> chapter. It's also based on <a href="https://github.com/trimstray/nginx-admins-handbook/blob/master/static/img/cheatsheets/nginx-hardening-cheatsheet-tls13.png">this</a> version of printable high-res hardening cheatsheets.</p> </blockquote> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">SSL Labs</h3><a id="user-content-ssl-labs" class="anchor" aria-label="Permalink: SSL Labs" href="#ssl-labs"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <blockquote> <p dir="auto">Read about SSL Labs grading <a href="https://community.qualys.com/docs/DOC-6321-ssl-labs-grading-2018" rel="nofollow">here</a> (SSL Labs Grading 2018).</p> </blockquote> <p dir="auto">Short SSL Labs grades explanation:</p> <blockquote> <p dir="auto"><em>A+ is clearly the desired grade, both A and B grades are acceptable and result in adequate commercial security. The B grade, in particular, may be applied to configurations designed to support very wide audiences (for old clients)</em>.</p> </blockquote> <p dir="auto">I finally got <strong>A+</strong> grade and following scores:</p> <ul dir="auto"> <li>Certificate = <strong>100%</strong></li> <li>Protocol Support = <strong>100%</strong></li> <li>Key Exchange = <strong>90%</strong></li> <li>Cipher Strength = <strong>90%</strong></li> </ul> <p dir="auto">Look also at the following recommendations. I believe the right configuration of NGINX should give the following SSL Labs scores and provides the best security for the most cases:</p> <ul dir="auto"> <li> <p dir="auto"><strong>Recommended</strong></p> <ul dir="auto"> <li>A/A+</li> <li>Certificate: 100/100</li> <li>Protocol Support: 95/100</li> <li>Key Exchange: 90/100</li> <li>Cipher Strength: 90/100</li> </ul> </li> <li> <p dir="auto"><strong>Perfect but restrictive</strong></p> <ul dir="auto"> <li>A+</li> <li>Certificate: 100/100</li> <li>Protocol Support: 100/100</li> <li>Key Exchange: 100/100</li> <li>Cipher Strength: 100/100</li> </ul> </li> </ul> <p align="center" dir="auto"> <a target="_blank" rel="noopener noreferrer" href="https://github.com/trimstray/nginx-admins-handbook/blob/master/static/img/blkcipher_ssllabs_preview.png"><img src="https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/blkcipher_ssllabs_preview.png" alt="blkcipher_ssllabs_preview" style="max-width: 100%;"></a> </p> <p dir="auto">Something about SSL Labs grading mechanism (that's an interesting point of view):</p> <blockquote> <p dir="auto"><em>The whole grading mechanism is more propaganda and public relations than actual security. If you want good security, then you must mind the details and understand how things work internally. If you want a good grade then you should do whatever it takes to have a good grade. An "A+" from SSL Labs is a very nifty thing to add at the end of a report, but it does not really equate with having rock solid security. Having an "A+" equates with being able to say "I have an A+".</em> - from <a href="https://security.stackexchange.com/a/112539" rel="nofollow">this</a> answer by <a href="https://security.stackexchange.com/users/5411/tom-leek" rel="nofollow">Tom Leek</a>.</p> </blockquote> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Mozilla Observatory</h3><a id="user-content-mozilla-observatory" class="anchor" aria-label="Permalink: Mozilla Observatory" href="#mozilla-observatory"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <blockquote> <p dir="auto">Read about Mozilla Observatory <a href="https://observatory.mozilla.org/faq/" rel="nofollow">here</a> and about <a href="https://github.com/mozilla/http-observatory/blob/master/httpobs/docs/scoring.md">Observatory Scoring Methodology</a>.</p> </blockquote> <p dir="auto">I also got the highest summary note (<strong>A+</strong>) on the Observatory with a very high test score (120/100, max. 135/100):</p> <p align="center" dir="auto"> <a target="_blank" rel="noopener noreferrer" href="https://github.com/trimstray/nginx-admins-handbook/blob/master/static/img/blkcipher_mozilla_observatory_preview.png"><img src="https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/blkcipher_mozilla_observatory_preview.png" alt="blkcipher_mozilla_observatory_preview" style="max-width: 100%;"></a> </p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Printable hardening cheatsheets</h2><a id="user-content-printable-hardening-cheatsheets" class="anchor" aria-label="Permalink: Printable hardening cheatsheets" href="#printable-hardening-cheatsheets"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">I created two versions of printable posters with hardening cheatsheets (High-Res 5000x8800) based on recipes from this handbook:</p> <blockquote> <p dir="auto">For <code>xcf</code> and <code>pdf</code> formats please see <a href="https://github.com/trimstray/nginx-admins-handbook/tree/master/static/img">this</a> directory.</p> </blockquote> <ul dir="auto"> <li> <p dir="auto"><strong>A+</strong> with all <strong>100%’s</strong> on @ssllabs and <strong>120/100</strong> on @mozilla observatory:</p> <blockquote> <p dir="auto">It provides the highest scores of the SSL Labs test. Setup is very restrictive with 4096-bit private key, only TLS 1.2, and also modern strict TLS cipher suites (non 128-bits). Think carefully about its use (no TLS 1.3, restrictive cipher suites), in my opinion, it is only suitable for obtaining the highest possible rating and seems a little impractical.</p> </blockquote> </li> </ul> <p align="center" dir="auto"> <a target="_blank" rel="noopener noreferrer" href="https://github.com/trimstray/nginx-admins-handbook/blob/master/static/img/cheatsheets/nginx-hardening-cheatsheet-tls12-100p.png"><img src="https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/cheatsheets/nginx-hardening-cheatsheet-tls12-100p.png" alt="nginx-hardening-cheatsheet-100p" width="92%" height="92%" style="max-width: 100%;"></a> </p> <ul dir="auto"> <li> <p dir="auto"><strong>A+</strong> on @ssllabs and <strong>120/100</strong> on @mozilla observatory with TLS 1.3 support:</p> <blockquote> <p dir="auto">It provides less restrictive setup with 2048-bit key for <code>RSA</code> or 256-bit key for <code>ECC</code>, TLS 1.3 and 1.2, modern strict TLS cipher suites (128/256-bits), and 2048-bit predefined <code>DH</code> groups recommended by Mozilla. The final grade is also in line with the industry standards and guidance. Recommend using this, for me, it is very reasonable configuration.</p> </blockquote> </li> </ul> <p align="center" dir="auto"> <a target="_blank" rel="noopener noreferrer" href="https://github.com/trimstray/nginx-admins-handbook/blob/master/static/img/cheatsheets/nginx-hardening-cheatsheet-tls13.png"><img src="https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/cheatsheets/nginx-hardening-cheatsheet-tls13.png" alt="nginx-hardening-cheatsheet-tls13" width="92%" height="92%" style="max-width: 100%;"></a> </p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Fully automatic installation</h2><a id="user-content-fully-automatic-installation" class="anchor" aria-label="Permalink: Fully automatic installation" href="#fully-automatic-installation"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">I created a set of scripts for unattended installation of NGINX from the raw, uncompiled code. It allows you to easily install, create a setup for dependencies (like <code>zlib</code> or <code>openssl</code>), and customized with installation parameters.</p> <p dir="auto">For more information please see <a href="https://github.com/trimstray/nginx-admins-handbook/tree/master/lib">Installing from source - Automatic installation</a> chapter which describes the installation of NGINX on systems/distros such as Ubuntu, Debian, CentOS, and FreeBSD.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Static error pages generator</h2><a id="user-content-static-error-pages-generator" class="anchor" aria-label="Permalink: Static error pages generator" href="#static-error-pages-generator"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">I created a simple to use generator for static pages to replace the default error pages that comes with any web server like NGINX.</p> <p dir="auto">For more information please see <a href="https://github.com/trimstray/nginx-admins-handbook/tree/master/lib/nginx/snippets/http-error-pages#http-static-error-pages-generator">HTTP Static Error Pages Generator</a>.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Server names parser</h2><a id="user-content-server-names-parser" class="anchor" aria-label="Permalink: Server names parser" href="#server-names-parser"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">I added scripts for fast multiple domain searching in the configuration. These tools get specific <code>server_name</code> matches and print them on the screen as a <code>server { ... }</code> blocks. Both are very helpful if you really have tons of domains or if you want to list specific vhosts from file or the active configuration.</p> <p dir="auto">You must follow one important rule to be able to use it. Your server block must have the following structure:</p> <div class="highlight highlight-source-nginx notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="server { server_name example.com example.org; ... # other directives }"><pre><span class="pl-k">server</span> { <span class="pl-k">server_name</span> example.com example.org; ... <span class="pl-c"># other directives</span> }</pre></div> <p dir="auto">Example of use:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="./snippets/server-name-parser/check-server-name.sh example.com Searching 'example.com' in '/usr/local/etc/nginx' (from disk) /usr/local/etc/nginx/domains/example.com/servers.conf:79: return 301 https://example.com$request_uri; /usr/local/etc/nginx/domains/example.com/servers.conf:252: return 301 https://example.com$request_uri; /usr/local/etc/nginx/domains/example.com/servers.conf:3825: server_name example.com; Searching 'example.com' in server contexts (from a running process) >>>>>>>>>> BEG >>>>>>>>>> server { include listen/192.168.252.10/https.example.com.conf; server_name example.com; location / { return 204 "RFC 792"; } access_log /var/log/nginx/example.com/access.log standard; error_log /var/log/nginx/example.com/error.log warn; } <<<<<<<<<< END <<<<<<<<<<"><pre class="notranslate"><code>./snippets/server-name-parser/check-server-name.sh example.com Searching 'example.com' in '/usr/local/etc/nginx' (from disk) /usr/local/etc/nginx/domains/example.com/servers.conf:79: return 301 https://example.com$request_uri; /usr/local/etc/nginx/domains/example.com/servers.conf:252: return 301 https://example.com$request_uri; /usr/local/etc/nginx/domains/example.com/servers.conf:3825: server_name example.com; Searching 'example.com' in server contexts (from a running process) >>>>>>>>>> BEG >>>>>>>>>> server { include listen/192.168.252.10/https.example.com.conf; server_name example.com; location / { return 204 "RFC 792"; } access_log /var/log/nginx/example.com/access.log standard; error_log /var/log/nginx/example.com/error.log warn; } <<<<<<<<<< END <<<<<<<<<< </code></pre></div> <p dir="auto">For more information please see <a href="https://github.com/trimstray/nginx-admins-handbook/tree/master/lib/nginx/snippets/server-name-parser">snippets/server-name-parser</a> directory.</p> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Books</h1><a id="user-content-books" class="anchor" aria-label="Permalink: Books" href="#books"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><a href="https://www.amazon.com/Nginx-Essentials-Valery-Kholodkov/dp/1785289535" rel="nofollow">Nginx Essentials</a></h4><a id="user-content-nginx-essentials" class="anchor" aria-label="Permalink: Nginx Essentials" href="#nginx-essentials"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Authors: <strong>Valery Kholodkov</strong></p> <p dir="auto"><em>Excel in Nginx quickly by learning to use its most essential features in real-life applications.</em></p> <ul dir="auto"> <li><em>Learn how to set up, configure, and operate an Nginx installation for day-to-day use</em></li> <li><em>Explore the vast features of Nginx to manage it like a pro, and use them successfully to run your website</em></li> <li><em>Example-based guide to get the best out of Nginx to reduce resource usage footprint</em></li> </ul> <p dir="auto"><sup><i>This short review comes from this book or the store.</i></sup></p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><a href="https://www.oreilly.com/library/view/nginx-cookbook/9781492049098/" rel="nofollow">Nginx Cookbook</a></h4><a id="user-content-nginx-cookbook" class="anchor" aria-label="Permalink: Nginx Cookbook" href="#nginx-cookbook"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Authors: <strong>Derek DeJonghe</strong></p> <p dir="auto"><em>You’ll find recipes for:</em></p> <ul dir="auto"> <li><em>Traffic management and A/B testing</em></li> <li><em>Managing programmability and automation with dynamic templating and the NGINX Plus API</em></li> <li><em>Securing access through encrypted traffic, secure links, HTTP authentication subrequests, and more</em></li> <li><em>Deploying NGINX to AWS, Azure, and Google cloud-computing services</em></li> <li><em>Using Docker to deploy containers and microservices</em></li> <li><em>Debugging and troubleshooting, performance tuning, and practical ops tips</em></li> </ul> <p dir="auto"><sup><i>This short review comes from this book or the store.</i></sup></p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><a href="https://www.amazon.com/Nginx-HTTP-Server-Harness-infrastructure/dp/178862355X" rel="nofollow">Nginx HTTP Server</a></h4><a id="user-content-nginx-http-server" class="anchor" aria-label="Permalink: Nginx HTTP Server" href="#nginx-http-server"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Authors: <strong>Martin Fjordvald</strong>, <strong>Clement Nedelcu</strong></p> <p dir="auto"><em>Harness the power of Nginx to make the most of your infrastructure and serve pages faster than ever.</em></p> <ul dir="auto"> <li><em>Discover possible interactions between Nginx and Apache to get the best of both worlds</em></li> <li><em>Learn to exploit the features offered by Nginx for your web applications</em></li> <li><em>Get your hands on the most updated version of Nginx (1.13.2) to support all your web administration requirements</em></li> </ul> <p dir="auto"><sup><i>This short review comes from this book or the store.</i></sup></p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><a href="https://www.amazon.com/Nginx-High-Performance-Rahul-Sharma/dp/1785281836" rel="nofollow">Nginx High Performance</a></h4><a id="user-content-nginx-high-performance" class="anchor" aria-label="Permalink: Nginx High Performance" href="#nginx-high-performance"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Authors: <strong>Rahul Sharma</strong></p> <p dir="auto"><em>Optimize NGINX for high-performance, scalable web applications.</em></p> <ul dir="auto"> <li><em>Configure Nginx for best performance, with configuration examples and explanations</em></li> <li><em>Step-by-step tutorials for performance testing using open source software</em></li> <li><em>Tune the TCP stack to make the most of the available infrastructure</em></li> </ul> <p dir="auto"><sup><i>This short review comes from this book or the store.</i></sup></p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><a href="https://www.amazon.com/Mastering-Nginx-Dimitri-Aivaliotis/dp/1849517444" rel="nofollow">Mastering Nginx</a></h4><a id="user-content-mastering-nginx" class="anchor" aria-label="Permalink: Mastering Nginx" href="#mastering-nginx"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Authors: <strong>Dimitri Aivaliotis</strong></p> <p dir="auto"><em>Written for experienced systems administrators and engineers, this book teaches you from scratch how to configure Nginx for any situation. Step-by-step instructions and real-world code snippets clarify even the most complex areas.</em></p> <p dir="auto"><sup><i>This short review comes from this book or the store.</i></sup></p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><a href="https://www.nginx.com/resources/library/modsecurity-3-nginx-quick-start-guide/" rel="nofollow">ModSecurity 3.0 and NGINX: Quick Start Guide</a></h4><a id="user-content-modsecurity-30-and-nginx-quick-start-guide" class="anchor" aria-label="Permalink: ModSecurity 3.0 and NGINX: Quick Start Guide" href="#modsecurity-30-and-nginx-quick-start-guide"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Authors: <strong>Faisal Memon</strong>, <strong>Owen Garrett</strong>, <strong>Michael Pleshakov</strong></p> <p dir="auto"><em>Learn in this ebook how to get started with ModSecurity, the world’s most widely deployed web application firewall (WAF), now available for NGINX and NGINX Plus.</em></p> <p dir="auto"><sup><i>This short review comes from this book or the store.</i></sup></p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><a href="https://www.nginx.com/resources/library/cisco-ace-nginx-migration-guide/" rel="nofollow">Cisco ACE to NGINX: Migration Guide</a></h4><a id="user-content-cisco-ace-to-nginx-migration-guide" class="anchor" aria-label="Permalink: Cisco ACE to NGINX: Migration Guide" href="#cisco-ace-to-nginx-migration-guide"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Authors: <strong>Faisal Memon</strong></p> <p dir="auto"><em>This ebook provides step-by-step instructions on replacing Cisco ACE with NGINX and off-the-shelf servers. NGINX helps you cut costs and modernize.</em></p> <p dir="auto"><em>In this ebook you will learn:</em></p> <ul dir="auto"> <li><em>How to migrate Cisco ACE configuration to NGINX, with detailed examples</em></li> <li><em>Why you should go with a software load balancer, and not hardware</em></li> </ul> <p dir="auto"><sup><i>This short review comes from this book or the store.</i></sup></p> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">External Resources</h1><a id="user-content-external-resources" class="anchor" aria-label="Permalink: External Resources" href="#external-resources"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Nginx official</h5><a id="user-content-nginx-official" class="anchor" aria-label="Permalink: Nginx official" href="#nginx-official"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://www.nginx.com/" rel="nofollow"><b>Nginx Project</b></a><br> :black_small_square: <a href="https://nginx.org/en/docs/" rel="nofollow"><b>Nginx Documentation</b></a><br> :black_small_square: <a href="https://www.nginx.com/resources/wiki/" rel="nofollow"><b>Nginx Wiki</b></a><br> :black_small_square: <a href="https://docs.nginx.com/nginx/admin-guide/" rel="nofollow"><b>Nginx Admin's Guide</b></a><br> :black_small_square: <a href="https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/" rel="nofollow"><b>Nginx Pitfalls and Common Mistakes</b></a><br> :black_small_square: <a href="http://nginx.org/en/docs/dev/development_guide.html" rel="nofollow"><b>Development Guide</b></a><br> :black_small_square: <a href="https://forum.nginx.org/" rel="nofollow"><b>Nginx Forum</b></a><br> :black_small_square: <a href="http://nginx.org/en/security_advisories.html" rel="nofollow"><b>Nginx Security Advisories</b></a><br> :black_small_square: <a href="https://docs.nginx.com/nginx/admin-guide/security-controls/" rel="nofollow"><b>Nginx Security Controls</b></a><br> :black_small_square: <a href="https://mailman.nginx.org/mailman/listinfo/nginx" rel="nofollow"><b>Nginx Mailing List</b></a><br> :black_small_square: <a href="https://github.com/nginx/nginx"><b>Nginx Read-only Mirror</b></a><br> :black_small_square: <a href="https://github.com/nginxinc/NGINX-Demos"><b>NGINX-Demos </b></a><br> :black_small_square: <a href="https://www.nginx.com/blog/thread-pools-boost-performance-9x/" rel="nofollow"><b>Thread Pools in NGINX Boost Performance 9x!</b></a><br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Nginx distributions</h5><a id="user-content-nginx-distributions" class="anchor" aria-label="Permalink: Nginx distributions" href="#nginx-distributions"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://openresty.org/" rel="nofollow"><b>OpenResty</b></a><br> :black_small_square: <a href="https://tengine.taobao.org/" rel="nofollow"><b>The Tengine Web Server</b></a><br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Comparison reviews</h5><a id="user-content-comparison-reviews" class="anchor" aria-label="Permalink: Comparison reviews" href="#comparison-reviews"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://www.hostingadvice.com/how-to/nginx-vs-apache/" rel="nofollow"><b>NGINX vs. Apache (Pro/Con Review, Uses, & Hosting for Each)</b></a><br> :black_small_square: <a href="https://github.com/jiangwenyuan/nuster/wiki/Web-cache-server-performance-benchmark:-nuster-vs-nginx-vs-varnish-vs-squid"><b>Web cache server performance benchmark: nuster vs nginx vs varnish vs squid</b></a><br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Cheatsheets & References</h5><a id="user-content-cheatsheets--references" class="anchor" aria-label="Permalink: Cheatsheets & References" href="#cheatsheets--references"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://openresty.org/download/agentzh-nginx-tutorials-en.html" rel="nofollow"><b>agentzh's Nginx Tutorials</b></a><br> :black_small_square: <a href="http://agentzh.org/misc/slides/nginx-conf-scripting/nginx-conf-scripting.html#1" rel="nofollow"><b>Introduction to nginx.conf scripting</b></a><br> :black_small_square: <a href="http://www.nginx-discovery.com/" rel="nofollow"><b>Nginx discovery journey</b></a><br> :black_small_square: <a href="http://www.nginxguts.com/" rel="nofollow"><b>Nginx Guts</b></a><br> :black_small_square: <a href="https://gist.github.com/carlessanagustin/9509d0d31414804da03b"><b>Nginx Cheatsheet</b></a><br> :black_small_square: <a href="http://www.scalescale.com/tips/nginx/" rel="nofollow"><b>Nginx Tutorials, Linux Sysadmin Configuration & Optimizing Tips and Tricks</b></a><br> :black_small_square: <a href="https://github.com/h5bp/server-configs-nginx"><b>Nginx boilerplate configs</b></a><br> :black_small_square: <a href="https://github.com/nginx-boilerplate/nginx-boilerplate"><b>Awesome Nginx configuration template</b></a><br> :black_small_square: <a href="https://github.com/SimulatedGREG/nginx-cheatsheet"><b>Nginx Quick Reference</b></a><br> :black_small_square: <a href="https://github.com/fcambus/nginx-resources"><b>A collection of resources covering Nginx and more</b></a><br> :black_small_square: <a href="https://github.com/lebinh/nginx-conf"><b>A collection of useful Nginx configuration snippets</b></a><br> :black_small_square: <a href="https://github.com/elasticweb/nginx-configs"><b>Nginx configurations for most popular CMS/CMF/Frameworks based on PHP</b></a><br> :black_small_square: <a href="https://github.com/wmnnd/nginx-certbot"><b>Boilerplate configuration for nginx and certbot with docker-compose</b></a><br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Performance & Hardening</h5><a id="user-content-performance--hardening" class="anchor" aria-label="Permalink: Performance & Hardening" href="#performance--hardening"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://github.com/denji/nginx-tuning"><b>Nginx Tuning For Best Performance by Denji</b></a><br> :black_small_square: <a href="https://thoughts.t37.net/nginx-optimization-understanding-sendfile-tcp-nodelay-and-tcp-nopush-c55cdd276765" rel="nofollow"><b>Nginx Optimization: understanding sendfile, tcp_nodelay and tcp_nopush</b></a><br> :black_small_square: <a href="https://blog.cloudflare.com/how-we-scaled-nginx-and-saved-the-world-54-years-every-day/" rel="nofollow"><b>How we scaled nginx and saved the world 54 years every day</b></a><br> :black_small_square: <a href="https://istlsfastyet.com/" rel="nofollow"><b>TLS has exactly one performance problem: it is not used widely enough</b></a><br> :black_small_square: <a href="https://www.ssllabs.com/projects/best-practices/" rel="nofollow"><b>SSL/TLS Deployment Best Practices</b></a><br> :black_small_square: <a href="https://www.ssllabs.com/projects/rating-guide/index.html" rel="nofollow"><b>SSL Server Rating Guide</b></a><br> :black_small_square: <a href="https://www.ssllabs.com/ssl-pulse/" rel="nofollow"><b>SSL Pulse</b></a><br> :black_small_square: <a href="https://www.upguard.com/blog/how-to-build-a-tough-nginx-server-in-15-steps" rel="nofollow"><b>How to Build a Tough NGINX Server in 15 Steps</b></a><br> :black_small_square: <a href="https://www.cyberciti.biz/tips/linux-unix-bsd-nginx-webserver-security.html" rel="nofollow"><b>Top 25 Nginx Web Server Best Security Practices</b></a><br> :black_small_square: <a href="https://calomel.org/nginx.html" rel="nofollow"><b>Nginx Secure Web Server</b></a><br> :black_small_square: <a href="https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html" rel="nofollow"><b>Strong SSL Security on Nginx</b></a><br> :black_small_square: <a href="https://enable-cors.org/index.html" rel="nofollow"><b>Enable cross-origin resource sharing (CORS)</b></a><br> :black_small_square: <a href="https://github.com/nbs-system/naxsi"><b>NAXSI - WAF for Nginx</b></a><br> :black_small_square: <a href="https://geekflare.com/install-modsecurity-on-nginx/" rel="nofollow"><b>ModSecurity for Nginx</b></a><br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Presentations & Videos</h5><a id="user-content-presentations--videos" class="anchor" aria-label="Permalink: Presentations & Videos" href="#presentations--videos"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://www.slideshare.net/Nginx/nginx-basics-and-best-practices" rel="nofollow"><b>NGINX: Basics and Best Practices</b></a><br> :black_small_square: <a href="https://www.slideshare.net/Nginx/nginx-installation-and-tuning" rel="nofollow"><b>NGINX Installation and Tuning</b></a><br> :black_small_square: <a href="https://www.slideshare.net/joshzhu/nginx-internals" rel="nofollow"><b>Nginx Internals (by Joshua Zhu)</b></a><br> :black_small_square: <a href="https://www.slideshare.net/feifengxlq/nginx-internals-10514355" rel="nofollow"><b>Nginx internals (by Liqiang Xu)</b></a><br> :black_small_square: <a href="https://www.slideshare.net/wallarm/how-to-secure-your-web-applications-with-nginx" rel="nofollow"><b>How to secure your web applications with NGINX</b></a><br> :black_small_square: <a href="https://www.slideshare.net/chartbeat/tuning-tcp-and-nginx-on-ec2" rel="nofollow"><b>Tuning TCP and NGINX on EC2</b></a><br> :black_small_square: <a href="https://www.slideshare.net/trygvevea/extending-functionality-in-nginx-with-modules" rel="nofollow"><b>Extending functionality in nginx, with modules!</b></a><br> :black_small_square: <a href="https://www.slideshare.net/tuxtoti/nginx-tips-and-tricks-13087831" rel="nofollow"><b>Nginx - Tips and Tricks.</b></a><br> :black_small_square: <a href="https://www.slideshare.net/TonyFabeen/nginx-scripting-extending-nginx-functionalities-with-lua" rel="nofollow"><b>Nginx Scripting - Extending Nginx Functionalities with Lua</b></a><br> :black_small_square: <a href="https://www.slideshare.net/kazeburo/advanced-nginx-in-mercari-how-to-handle-over-1200000-https-reqsmin" rel="nofollow"><b>How to handle over 1,200,000 HTTPS Reqs/Min</b></a><br> :black_small_square: <a href="https://www.slideshare.net/harukayon/ngx-lua-public" rel="nofollow"><b>Using ngx_lua / lua-nginx-module in pixiv</b></a><br> :black_small_square: <a href="https://mdounin.ru/files/mdounin-nginx-whatsnew-nginxconf2018.pdf" rel="nofollow"><b>Reading nginx CHANGES together</b></a><br> :black_small_square: <a href="https://mdounin.ru/files/mdounin-dynamic-modules-nginxconf2016.pdf" rel="nofollow"><b>Dynamic modules:how it works</b></a><br> :black_small_square: <a href="https://www.youtube.com/playlist?list=PLGz_X9w9raXewvc6tjIGGFZ6DBKHEld3k" rel="nofollow"><b>NGINX Conf 2014</b></a><br> :black_small_square: <a href="https://www.youtube.com/playlist?list=PLGz_X9w9raXdED9BR6GQ61A6d3fBzjpbn" rel="nofollow"><b>NGINX Conf 2015</b></a><br> :black_small_square: <a href="https://www.youtube.com/playlist?list=PLGz_X9w9raXcOsB_dT26iu0BvbSxWYG1g" rel="nofollow"><b>NGINX Conf 2016</b></a><br> :black_small_square: <a href="https://www.youtube.com/playlist?list=PLGz_X9w9raXeT-z_rcZ9yF0kV5SENZ-yt" rel="nofollow"><b>NGINX Conf 2017</b></a><br> :black_small_square: <a href="https://www.youtube.com/playlist?list=PLGz_X9w9raXeHhKRX6ZS7vmFKN12iYOw9" rel="nofollow"><b>NGINX Conf 2018 | Deep Dive Track</b></a><br> :black_small_square: <a href="https://www.youtube.com/playlist?list=PLGz_X9w9raXe_Vc708VKvr5KJ4gnf1WxS" rel="nofollow"><b>NGINX Conf 2018 | Keynotes and Sessions</b></a><br> :black_small_square: <a href="https://www.youtube.com/watch?v=iHxD-G0YjiU" rel="nofollow"><b>Making HTTPS Fast(er): Ilya Grigorik @ nginx.conf 2014</b></a><br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Playgrounds</h5><a id="user-content-playgrounds" class="anchor" aria-label="Permalink: Playgrounds" href="#playgrounds"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://github.com/sportebois/nginx-rate-limit-sandbox"><b>NGINX Rate Limit, Burst and nodelay sandbox</b></a><br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Config generators</h5><a id="user-content-config-generators" class="anchor" aria-label="Permalink: Config generators" href="#config-generators"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://nginxconfig.io/" rel="nofollow"><b>nginxconfig</b></a> - Nginx config generator on steroids.<br> :black_small_square: <a href="https://github.com/mozilla/ssl-config-generator"><b>ssl-config-generator</b></a> - Mozilla SSL Configuration Generator.<br> :black_small_square: <a href="https://github.com/linkedin/nginx-config-builder"><b>nginx-config-builder</b></a> - is a python library for building nginx configuration files programatically.<br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Config parsers</h5><a id="user-content-config-parsers" class="anchor" aria-label="Permalink: Config parsers" href="#config-parsers"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://github.com/nginxinc/crossplane"><b>crossplane</b></a> - quick and reliable way to convert NGINX configurations into JSON and back.<br> :black_small_square: <a href="https://github.com/fatiherikli/nginxparser"><b>nginxparser</b></a> - parses nginx configuration with Pyparsing.<br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Config managers</h5><a id="user-content-config-managers" class="anchor" aria-label="Permalink: Config managers" href="#config-managers"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://github.com/jdauphant/ansible-role-nginx"><b>ansible-role-nginx</b></a> - asible role to install and manage nginx configuration.<br> :black_small_square: <a href="https://github.com/geerlingguy/ansible-role-nginx"><b>ansible-role-nginx</b></a> - installs and configures the latest version of Nginx.<br> :black_small_square: <a href="https://github.com/nginxinc/ansible-role-nginx"><b>ansible-role-nginx</b></a> - installs NGINX, NGINX Plus, the NGINX Amplify agent, and more.<br> :black_small_square: <a href="https://github.com/voxpupuli/puppet-nginx"><b>puppet-nginx</b></a> - puppet module to manage NGINX on various UNIXes.<br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Static analyzers</h5><a id="user-content-static-analyzers" class="anchor" aria-label="Permalink: Static analyzers" href="#static-analyzers"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://github.com/yandex/gixy"><b>gixy</b></a> - is a tool to analyze Nginx configuration to prevent security misconfiguration and automate flaw detection.<br> :black_small_square: <a href="https://github.com/1connect/nginx-config-formatter"><b>nginx-config-formatter</b></a> - Nginx config file formatter/beautifier written in Python.<br> :black_small_square: <a href="https://github.com/vasilevich/nginxbeautifier"><b>nginxbeautifier</b></a> - format and beautify Nginx config files.<br> :black_small_square: <a href="https://github.com/lovette/nginx-tools/tree/master/nginx-minify-conf"><b>nginx-minify-conf</b></a> - creates a minified version of a Nginx configuration.<br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Log analyzers</h5><a id="user-content-log-analyzers" class="anchor" aria-label="Permalink: Log analyzers" href="#log-analyzers"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://goaccess.io/" rel="nofollow"><b>GoAccess</b></a> - is a fast, terminal-based log analyzer (quickly analyze and view web server statistics in real time).<br> :black_small_square: <a href="https://www.graylog.org/" rel="nofollow"><b>Graylog</b></a> - is a leading centralized log management for capturing, storing, and enabling real-time analysis.<br> :black_small_square: <a href="https://www.elastic.co/products/logstash" rel="nofollow"><b>Logstash</b></a> - is an open source, server-side data processing pipeline.<br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Performance analyzers</h5><a id="user-content-performance-analyzers" class="anchor" aria-label="Permalink: Performance analyzers" href="#performance-analyzers"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://github.com/lebinh/ngxtop"><b>ngxtop</b></a> - parses your Nginx access log and outputs useful, top-like, metrics of your Nginx server.<br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Builder tools</h5><a id="user-content-builder-tools" class="anchor" aria-label="Permalink: Builder tools" href="#builder-tools"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://github.com/TinkoffCreditSystems/Nginx-builder"><b>Nginx-builder</b></a> - is a tool for building deb or rpm package NGINX from the source code.<br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Benchmarking tools</h5><a id="user-content-benchmarking-tools" class="anchor" aria-label="Permalink: Benchmarking tools" href="#benchmarking-tools"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://httpd.apache.org/docs/2.4/programs/ab.html" rel="nofollow"><b>ab</b></a> - is a single-threaded command line tool for measuring the performance of HTTP web servers.<br> :black_small_square: <a href="https://www.joedog.org/siege-home/" rel="nofollow"><b>siege</b></a> - is an http load testing and benchmarking utility.<br> :black_small_square: <a href="https://github.com/wg/wrk"><b>wrk</b></a> - is a modern HTTP benchmarking tool capable of generating significant load.<br> :black_small_square: <a href="https://github.com/giltene/wrk2"><b>wrk2</b></a> - is a constant throughput, correct latency recording variant of wrk.<br> :black_small_square: <a href="https://github.com/tsenart/vegeta"><b>vegeta</b></a> - HTTP load testing tool and library.<br> :black_small_square: <a href="https://github.com/codesenberg/bombardier"><b>bombardier</b></a> - is a HTTP(S) benchmarking tool.<br> :black_small_square: <a href="https://github.com/cmpxchg16/gobench"><b>gobench</b></a> - is a HTTP/HTTPS load testing and benchmarking tool.<br> :black_small_square: <a href="https://github.com/rakyll/hey"><b>hey</b></a> - is a HTTP load generator, ApacheBench (ab) replacement, formerly known as rakyll/boom.<br> :black_small_square: <a href="https://github.com/tarekziade/boom"><b>boom</b></a> - is a script you can use to quickly smoke-test your web app deployment.<br> :black_small_square: <a href="https://github.com/tarekziade/httperf"><b>httperf</b></a> - the httperf HTTP load generator.<br> :black_small_square: <a href="https://jmeter.apache.org/" rel="nofollow"><b>JMeter™</b></a> - is designed to load test functional behavior and measure performance.<br> :black_small_square: <a href="https://gatling.io/" rel="nofollow"><b>Gatling</b></a> - is a powerful open-source load and performance testing tool for web applications.<br> :black_small_square: <a href="https://github.com/locustio/locust"><b>locust</b></a> - is an easy-to-use, distributed, user load testing tool.<br> :black_small_square: <a href="https://github.com/gkbrk/slowloris"><b>slowloris</b></a> - low bandwidth DoS tool. Slowloris rewrite in Python.<br> :black_small_square: <a href="https://github.com/shekyan/slowhttptest"><b>slowhttptest</b></a> - application layer DoS attack simulator.<br> :black_small_square: <a href="https://github.com/jseidl/GoldenEye"><b>GoldenEye</b></a> - GoldenEye Layer 7 (KeepAlive+NoCache) DoS test tool.<br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Debugging tools</h5><a id="user-content-debugging-tools" class="anchor" aria-label="Permalink: Debugging tools" href="#debugging-tools"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://strace.io/" rel="nofollow"><b>strace</b></a> - is a diagnostic, debugging and instructional userspace utility (linux syscall tracer) for Linux.<br> :black_small_square: <a href="https://www.gnu.org/software/gdb/" rel="nofollow"><b>GDB</b></a> - allows you to see what is going on `inside' another program while it executes.<br> :black_small_square: <a href="https://sourceware.org/systemtap/" rel="nofollow"><b>SystemTap</b></a> - provides infrastructure to simplify the gathering of information about the running Linux system.<br> :black_small_square: <a href="https://github.com/openresty/stapxx"><b>stapxx</b></a> - simple macro language extensions to SystemTap.<br> :black_small_square: <a href="https://github.com/trimstray/htrace.sh"><b>htrace.sh</b></a> - is a simple Swiss Army knife for http/https troubleshooting and profiling.<br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Security & Web testing tools</h5><a id="user-content-security--web-testing-tools" class="anchor" aria-label="Permalink: Security & Web testing tools" href="#security--web-testing-tools"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://portswigger.net/burp" rel="nofollow"><b>Burp Suite</b></a> - is a graphical tool for testing Web application security.<br> :black_small_square: <a href="http://w3af.org/" rel="nofollow"><b>w3af</b></a> - is a Web Application Attack and Audit Framework.<br> :black_small_square: <a href="https://github.com/sullo/nikto"><b>nikto</b></a> - web server scanner which performs comprehensive tests.<br> :black_small_square: <a href="https://github.com/ssllabs/ssllabs-scan"><b>ssllabs-scan</b></a> - client for SSL Labs APIs, designed for automated and/or bulk testing.<br> :black_small_square: <a href="https://github.com/mozilla/http-observatory"><b>http-observatory</b></a> - Mozilla HTTP Observatory.<br> :black_small_square: <a href="https://testssl.sh/" rel="nofollow"><b>testssl.sh</b></a> - checks a server's service on any port for the support of TLS/SSL ciphers.<br> :black_small_square: <a href="https://github.com/nabla-c0d3/sslyze"><b>sslyze</b></a> - is a fast and powerful SSL/TLS server scanning library.<br> :black_small_square: <a href="https://github.com/mozilla/cipherscan"><b>cipherscan</b></a> - is a very simple way to find out which SSL ciphersuites are supported by a target.<br> :black_small_square: <a href="https://github.com/OWASP/O-Saft"><b>O-Saft</b></a> - OWASP SSL advanced forensic tool.<br> :black_small_square: <a href="https://nghttp2.org/" rel="nofollow"><b>Nghttp2</b></a> - is an implementation of HTTP/2 and its header compression algorithm HPACK in C.<br> :black_small_square: <a href="https://github.com/summerwind/h2spec"><b>h2spec</b></a> - is a conformance testing tool for HTTP/2 implementation.<br> :black_small_square: <a href="https://github.com/gildasio/h2t"><b>h2t</b></a> - is a simple tool to help sysadmins to hardening their websites.<br> :black_small_square: <a href="https://github.com/c0nrad/http2fuzz"><b>http2fuzz</b></a> - HTTP/2 fuzzer written in Golang.<br> :black_small_square: <a href="https://github.com/s0md3v/Arjun"><b>Arjun</b></a> - HTTP parameter discovery suite.<br> :black_small_square: <a href="https://github.com/s0md3v/Corsy"><b>Corsy</b></a> - CORS misconfiguration scanner.<br> :black_small_square: <a href="https://github.com/s0md3v/XSStrike"><b>XSStrike</b></a> - most advanced XSS scanner.<br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Development</h5><a id="user-content-development" class="anchor" aria-label="Permalink: Development" href="#development"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="http://agentzh.org/misc/code/nginx/" rel="nofollow"><b>Sample ebook generated from NGINX source code.</b></a><br> :black_small_square: <a href="https://www.lua.org/pil/contents.html" rel="nofollow"><b>Programming in Lua (first edition)</b></a><br> :black_small_square: <a href="http://www.londonlua.org/scripting_nginx_with_lua/" rel="nofollow"><b>Scripting Nginx with Lua</b></a><br> :black_small_square: <a href="https://www.evanmiller.org/nginx-modules-guide.html" rel="nofollow"><b>Emiller’s Guide To Nginx Module Development</b></a><br> :black_small_square: <a href="http://www.evanmiller.org/nginx-modules-guide-advanced.html" rel="nofollow"><b>Emiller’s Advanced Topics In Nginx Module Development</b></a><br> :black_small_square: <a href="https://www.airpair.com/nginx/extending-nginx-tutorial" rel="nofollow"><b>NGINX Tutorial: Developing Modules</b></a><br> :black_small_square: <a href="https://www.openmymind.net/An-Introduction-To-OpenResty-Nginx-Lua/" rel="nofollow"><b>An Introduction To OpenResty (nginx + lua) - Part 1</b></a><br> :black_small_square: <a href="https://www.openmymind.net/An-Introduction-To-OpenResty-Part-2/" rel="nofollow"><b>An Introduction To OpenResty - Part 2 - Concepts</b></a><br> :black_small_square: <a href="https://www.openmymind.net/An-Introduction-To-OpenResty-Part-3/" rel="nofollow"><b>An Introduction To OpenResty - Part 3</b></a><br> :black_small_square: <a href="https://blog.dutchcoders.io/openresty-with-dynamic-generated-certificates/" rel="nofollow"><b>OpenResty (Nginx) with dynamically generated certificates</b></a><br> :black_small_square: <a href="https://github.com/openresty/programming-openresty"><b>Programming OpenResty</b></a><br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Online & Web tools</h5><a id="user-content-online--web-tools" class="anchor" aria-label="Permalink: Online & Web tools" href="#online--web-tools"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://www.ssllabs.com/ssltest/" rel="nofollow"><b>SSL Server Test by SSL Labs</b></a><br> :black_small_square: <a href="https://www.htbridge.com/ssl/" rel="nofollow"><b>Test SSL/TLS (PCI DSS, HIPAA and NIST)</b></a><br> :black_small_square: <a href="https://sslanalyzer.comodoca.com/" rel="nofollow"><b>SSL analyzer and certificate checker</b></a><br> :black_small_square: <a href="https://decoder.link" rel="nofollow"><b>Tools for testing SSL configuration</b></a><br> :black_small_square: <a href="https://tls.imirhil.fr/" rel="nofollow"><b>Test your TLS server configuration (e.g. ciphers)</b></a><br> :black_small_square: <a href="https://www.jitbit.com/sslcheck/" rel="nofollow"><b>Scan your website for non-secure content</b></a><br> :black_small_square: <a href="http://www.ssltools.com" rel="nofollow"><b>Analyze website security</b></a><br> :black_small_square: <a href="https://ciphersuite.info/" rel="nofollow"><b>TLS Cipher Suite Search</b></a><br> :black_small_square: <a href="https://www.ssllabs.com/ssltest/viewMyClient.html" rel="nofollow"><b>SSL/TLS Capabilities of Your Browser</b></a><br> :black_small_square: <a href="https://suche.org/sslClientInfo" rel="nofollow"><b>SSL-Client Info's</b></a><br> :black_small_square: <a href="https://2ton.com.au/dhtool/" rel="nofollow"><b>Public Diffie-Hellman Parameter Service/Tool</b></a><br> :black_small_square: <a href="https://securityheaders.com/" rel="nofollow"><b>Analyse the HTTP response headers by Security Headers</b></a><br> :black_small_square: <a href="https://observatory.mozilla.org/" rel="nofollow"><b>Analyze your website by Mozilla Observatory</b></a><br> :black_small_square: <a href="https://sslmate.com/caa/" rel="nofollow"><b>CAA Record Helper</b></a><br> :black_small_square: <a href="https://webhint.io/" rel="nofollow"><b>Linting tool that will help you with your site's accessibility, speed, security and more</b></a><br> :black_small_square: <a href="https://urlscan.io/" rel="nofollow"><b>Service to scan and analyse websites</b></a><br> :black_small_square: <a href="https://www.url-encode-decode.com/" rel="nofollow"><b>Tool from above to either encode or decode a string of text</b></a><br> :black_small_square: <a href="https://uncoder.io/" rel="nofollow"><b>Online translator for search queries on log data</b></a><br> :black_small_square: <a href="https://regex101.com/" rel="nofollow"><b>Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript</b></a><br> :black_small_square: <a href="https://regexr.com/" rel="nofollow"><b>Online tool to learn, build, & test Regular Expressions</b></a><br> :black_small_square: <a href="https://www.regextester.com/" rel="nofollow"><b>Online Regex Tester & Debugger</b></a><br> :black_small_square: <a href="https://github.com/nginxinc/NGINX-Demos/tree/master/nginx-regex-tester"><b>Tool for testing regular expressions directly within an NGINX configuration</b></a><br> :black_small_square: <a href="https://gchq.github.io/CyberChef/" rel="nofollow"><b>A web app for encryption, encoding, compression and data analysis</b></a><br> :black_small_square: <a href="https://nginx.viraptor.info/" rel="nofollow"><b>Nginx location match tester</b></a><br> :black_small_square: <a href="https://detailyang.github.io/nginx-location-match-visible/" rel="nofollow"><b>Nginx location match visible</b></a><br> </p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Other stuff</h5><a id="user-content-other-stuff" class="anchor" aria-label="Permalink: Other stuff" href="#other-stuff"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"> :black_small_square: <a href="https://developer.mozilla.org/en-US/docs/Web" rel="nofollow"><b>Web technology for developers</b></a><br> :black_small_square: <a href="https://infosec.mozilla.org/guidelines/web_security.html" rel="nofollow"><b>Mozilla Web Security</b></a><br> :black_small_square: <a href="https://appsecwiki.com/#/" rel="nofollow"><b>Application Security Wiki</b></a><br> :black_small_square: <a href="https://www.owasp.org/index.php/Category:OWASP_Application_Security_Verification_Standard_Project" rel="nofollow"><b>OWASP ASVS 3.0.1</b></a><br> :black_small_square: <a href="https://github.com/Santandersecurityresearch/asvs"><b>OWASP ASVS 3.0.1 Web App</b></a><br> :black_small_square: <a href="https://github.com/OWASP/ASVS/tree/master/4.0"><b>OWASP ASVS 4.0</b></a><br> :black_small_square: <a href="https://www.owasp.org/index.php/OWASP_Proactive_Controls" rel="nofollow"><b>OWASP Top 10 Proactive Controls 2018.</b></a><br> :black_small_square: <a href="https://www.owasp.org/index.php/OWASP_Testing_Project" rel="nofollow"><b>OWASP Testing Guide v4</b></a><br> :black_small_square: <a href="https://github.com/OWASP/DevGuide"><b>OWASP Dev Guide</b></a><br> :black_small_square: <a href="https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html" rel="nofollow"><b>Transport Layer Protection Cheat Sheet by OWASP</b></a><br> :black_small_square: <a href="https://github.com/OWASP/wstg"><b>OWASP WSTG</b></a><br> :black_small_square: <a href="https://wiki.mozilla.org/Security/Server_Side_TLS" rel="nofollow"><b>Security/Server Side TLS by Mozilla</b></a><br> :black_small_square: <a href="https://bettercrypto.org/" rel="nofollow"><b>Applied Crypto Hardening</b></a><br> :black_small_square: <a href="https://caniuse.com/#home" rel="nofollow"><b>Browser support tables for modern web technologies</b></a><br> :black_small_square: <a href="https://badssl.com/" rel="nofollow"><b>Memorable site for testing clients against bad SSL configs</b></a><br> :black_small_square: <a href="https://https.cio.gov/" rel="nofollow"><b>The HTTPS-Only Standard</b></a><br> :black_small_square: <a href="https://portswigger.net/web-security" rel="nofollow"><b>The Web Security Academy</b></a><br> :black_small_square: <a href="https://portswigger.net/kb/issues" rel="nofollow"><b>Burp Scanner - Issue Definitions</b></a><br> :black_small_square: <a href="https://odino.org/wasec-web-application-security-what-to-do-when-dot-dot-dot/" rel="nofollow"><b>Web application security: what to do when...</b></a><br> :black_small_square: <a href="https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml" rel="nofollow"><b>Transport Layer Security (TLS) Parameters</b></a><br> :black_small_square: <a href="https://github.com/GrrrDog/TLS-Redirection#technical-details"><b>TLS Redirection (and Virtual Host Confusion)</b></a><br> :black_small_square: <a href="https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/" rel="nofollow"><b>TLS Security 6: Examples of TLS Vulnerabilities and Attacks</b></a><br> :black_small_square: <a href="https://www.veracode.com/blog/2014/03/guidelines-for-setting-security-headers" rel="nofollow"><b>Guidelines for Setting Security Headers</b></a><br> :black_small_square: <a href="https://infosec.mozilla.org/guidelines/web_security.html" rel="nofollow"><b>Mozilla Guidelines - Web Security</b></a><br> :black_small_square: <a href="https://medium.freecodecamp.org/secure-your-web-application-with-these-http-headers-fd66e0367628" rel="nofollow"><b>Secure your web application with these HTTP headers</b></a><br> :black_small_square: <a href="https://zinoui.com/blog/security-http-headers" rel="nofollow"><b>Security HTTP Headers</b></a><br> :black_small_square: <a href="https://github.com/GrrrDog/weird_proxies/wiki"><b>Analysis of various reverse proxies, cache proxies, load balancers, etc.</b></a><br> :black_small_square: <a href="https://howhttps.works/" rel="nofollow"><b>How HTTPS works ...in a comic!</b></a><br> :black_small_square: <a href="https://www.regular-expressions.info/" rel="nofollow"><b>Regular-Expressions</b></a><br> :black_small_square: <a href="https://github.com/attackercan/REGEXP-SECURITY-CHEATSHEET"><b>Regexp Security Cheatsheet</b></a><br> :black_small_square: <a href="https://nickcraver.com/blog/2017/05/22/https-on-stack-overflow/#the-beginning" rel="nofollow"><b>HTTPS on Stack Overflow: The End of a Long Road</b></a><br> :black_small_square: <a href="https://www.aosabook.org/en/nginx.html" rel="nofollow"><b>The Architecture of Open Source Applications - Nginx</b></a><br> :black_small_square: <a href="http://www.bbc.co.uk/blogs/internet/entries/17d22fb8-cea2-49d5-be14-86e7a1dcde04" rel="nofollow"><b>BBC Digital Media Distribution: How we improved throughput by 4x</b></a><br> :black_small_square: <a href="http://www.kegel.com/c10k.html" rel="nofollow"><b>The C10K problem by Dan Kegel</b></a><br> :black_small_square: <a href="http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html" rel="nofollow"><b>The Secret To 10 Million Concurrent Connections</b></a><br> :black_small_square: <a href="https://hpbn.co/" rel="nofollow"><b>High Performance Browser Networking</b></a><br> :black_small_square: <a href="https://github.com/donnemartin/system-design-primer"><b>The System Design Primer</b></a><br> :black_small_square: <a href="https://github.com/binhnguyennus/awesome-scalability"><b>awesome-scalability</b></a><br> :black_small_square: <a href="https://engineering.videoblocks.com/web-architecture-101-a3224e126947" rel="nofollow"><b>Web Architecture 101</b></a><br> :black_small_square: <a href="https://github.com/leandromoreira/linux-network-performance-parameters"><b>Learn where some of the network sysctl variables fit into the Linux/Kernel network flow</b></a><br> :black_small_square: <a href="https://suniphrase.wordpress.com/2015/10/27/jemalloc-vs-tcmalloc-vs-dlmalloc/" rel="nofollow"><b>jemalloc vs tcmalloc vs dlmalloc</b></a><br> :black_small_square: <a href="https://arxiv.org/pdf/1905.01135.pdf" rel="nofollow"><b>On the Impact of Memory Allocation on High-Performance Query Processing</b></a><br> :black_small_square: <a href="https://github.blog/2018-08-08-glb-director-open-source-load-balancer/" rel="nofollow"><b>GLB: GitHub’s open source load balancer</b></a><br> </p> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">What's next?</h1><a id="user-content-whats-next" class="anchor" aria-label="Permalink: What's next?" href="#whats-next"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Go back to the <a href="#table-of-contents">Table of Contents</a> or read the next chapters:</p> <ul dir="auto"> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HTTP_BASICS.md#http-basics">HTTP Basics</a></strong><a id="user-content-toc-http-basics-2"></a> <blockquote> <p dir="auto">Introduction to HTTP.</p> </blockquote> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/SSL_TLS_BASICS.md#ssltls-basics">SSL/TLS Basics</a></strong><a id="user-content-toc-ssltls-basics-2"></a> <blockquote> <p dir="auto">Introduction to SSL/TLS.</p> </blockquote> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/NGINX_BASICS.md#nginx-basics">NGINX Basics</a></strong><a id="user-content-toc-nginx-basics-2"></a> <blockquote> <p dir="auto">Introduction and explanation of the NGINX mechanisms.</p> </blockquote> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/HELPERS.md#helpers">Helpers</a></strong><a id="user-content-toc-helpers-2"></a> <blockquote> <p dir="auto">One-liners, commands, utilities for building NGINX, and more.</p> </blockquote> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#base-rules">Base Rules (16)</a></strong><a id="user-content-toc-base-rules-2"></a> <blockquote> <p dir="auto">The basic set of rules to keep NGINX in a good condition.</p> </blockquote> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#debugging">Debugging (5)</a></strong><a id="user-content-toc-debugging-2"></a> <blockquote> <p dir="auto">A few things for troubleshooting configuration problems.</p> </blockquote> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#performance">Performance (13)</a></strong><a id="user-content-toc-performance-2"></a> <blockquote> <p dir="auto">Many methods to make sure the NGINX as fast as possible.</p> </blockquote> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#hardening">Hardening (31)</a></strong><a id="user-content-toc-hardening-2"></a> <blockquote> <p dir="auto">Security and hardening methods in line with best practices.</p> </blockquote> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#reverse-proxy">Reverse Proxy (8)</a></strong><a id="user-content-toc-reverse-proxy-2"></a> <blockquote> <p dir="auto">A few rules about the NGINX proxy server.</p> </blockquote> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#load-balancing">Load Balancing (2)</a></strong><a id="user-content-toc-load-balancing-2"></a> <blockquote> <p dir="auto">Some rules to improve NGINX as a load balancer.</p> </blockquote> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/RULES.md#others">Others (4)</a></strong><a id="user-content-toc-others-2"></a> <blockquote> <p dir="auto">Other interesting rules, not necessarily linked to NGINX.</p> </blockquote> </li> <li><strong><a href="/trimstray/nginx-admins-handbook/blob/master/doc/EXAMPLES.md#configuration-examples">Configuration Examples</a></strong><a id="user-content-toc-configuration-examples-2"></a> <blockquote> <p dir="auto">Here are some configuration examples.</p> </blockquote> </li> </ul> <hr> <br> <p align="center" dir="auto"> <a href="https://nystudio107.com/blog/stop-using-htaccess-files-no-really" rel="nofollow"> <img src="https://github.com/trimstray/nginx-admins-handbook/raw/master/static/img/nginx_meme_2.png" alt="Meme" width="50%" height="50%" style="max-width: 100%;"> </a> </p> </article></div></div></div></div></div> <!-- --> <!-- --> <script type="application/json" id="__PRIMER_DATA_:R0:__">{"resolvedServerColorMode":"day"}</script></div> </react-partial> <input type="hidden" data-csrf="true" value="CxTBJqmc9TSq3BbI3oazlIvjDYhgF3fL6UotIBG1ifuNbXlcvSg5DebR0qzajFZxOPtFqJklzkzyUsJN8KdfJg==" /> </div> <div data-view-component="true" class="Layout-sidebar"> <div class="BorderGrid about-margin" data-pjax> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <div class="hide-sm hide-md"> <h2 class="mb-3 h4">About</h2> <p class="f4 my-3"> How to improve NGINX performance, security, and other important things. </p> <h3 class="sr-only">Topics</h3> <div class="my-3"> <div class="f6"> <a href="/topics/nginx" title="Topic: nginx" data-view-component="true" class="topic-tag topic-tag-link"> nginx </a> <a href="/topics/http" title="Topic: http" data-view-component="true" class="topic-tag topic-tag-link"> http </a> <a href="/topics/security" title="Topic: security" data-view-component="true" class="topic-tag topic-tag-link"> security </a> <a href="/topics/snippets" title="Topic: snippets" data-view-component="true" class="topic-tag topic-tag-link"> snippets </a> <a href="/topics/performance" title="Topic: performance" data-view-component="true" class="topic-tag topic-tag-link"> performance </a> <a href="/topics/reference" title="Topic: reference" data-view-component="true" class="topic-tag topic-tag-link"> reference </a> <a href="/topics/notes" title="Topic: notes" data-view-component="true" class="topic-tag topic-tag-link"> notes </a> <a href="/topics/https" title="Topic: https" data-view-component="true" class="topic-tag topic-tag-link"> https </a> <a href="/topics/best-practices" title="Topic: best-practices" data-view-component="true" class="topic-tag topic-tag-link"> best-practices </a> <a href="/topics/handbook" title="Topic: handbook" data-view-component="true" class="topic-tag topic-tag-link"> handbook </a> <a href="/topics/ssllabs" title="Topic: ssllabs" data-view-component="true" class="topic-tag topic-tag-link"> ssllabs </a> <a href="/topics/nginx-proxy" title="Topic: nginx-proxy" data-view-component="true" class="topic-tag topic-tag-link"> nginx-proxy </a> <a href="/topics/cheatsheet" title="Topic: cheatsheet" data-view-component="true" class="topic-tag topic-tag-link"> cheatsheet </a> <a href="/topics/openresty" title="Topic: openresty" data-view-component="true" class="topic-tag topic-tag-link"> openresty </a> <a href="/topics/tengine" title="Topic: tengine" data-view-component="true" class="topic-tag topic-tag-link"> tengine </a> <a href="/topics/hacks" title="Topic: hacks" data-view-component="true" class="topic-tag topic-tag-link"> hacks </a> <a href="/topics/nginx-configuration" title="Topic: nginx-configuration" data-view-component="true" class="topic-tag topic-tag-link"> nginx-configuration </a> </div> </div> <h3 class="sr-only">Resources</h3> <div class="mt-2"> <a class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:readme"}" href="#readme-ov-file"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book mr-2"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> Readme </a> </div> <h3 class="sr-only">License</h3> <div class="mt-2"> <a href="#MIT-1-ov-file" class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:license"}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> MIT license </a> </div> <h3 class="sr-only">Code of conduct</h3> <div class="mt-2"> <a href="#coc-ov-file" class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:code of conduct"}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-of-conduct mr-2"> <path d="M8.048 2.241c.964-.709 2.079-1.238 3.325-1.241a4.616 4.616 0 0 1 3.282 1.355c.41.408.757.86.996 1.428.238.568.348 1.206.347 1.968 0 2.193-1.505 4.254-3.081 5.862-1.496 1.526-3.213 2.796-4.249 3.563l-.22.163a.749.749 0 0 1-.895 0l-.221-.163c-1.036-.767-2.753-2.037-4.249-3.563C1.51 10.008.007 7.952.002 5.762a4.614 4.614 0 0 1 1.353-3.407C3.123.585 6.223.537 8.048 2.24Zm-1.153.983c-1.25-1.033-3.321-.967-4.48.191a3.115 3.115 0 0 0-.913 2.335c0 1.556 1.109 3.24 2.652 4.813C5.463 11.898 6.96 13.032 8 13.805c.353-.262.758-.565 1.191-.905l-1.326-1.223a.75.75 0 0 1 1.018-1.102l1.48 1.366c.328-.281.659-.577.984-.887L9.99 9.802a.75.75 0 1 1 1.019-1.103l1.384 1.28c.295-.329.566-.661.81-.995L12.92 8.7l-1.167-1.168c-.674-.671-1.78-.664-2.474.03-.268.269-.538.537-.802.797-.893.882-2.319.843-3.185-.032-.346-.35-.693-.697-1.043-1.047a.75.75 0 0 1-.04-1.016c.162-.191.336-.401.52-.623.62-.748 1.356-1.637 2.166-2.417Zm7.112 4.442c.313-.65.491-1.293.491-1.916v-.001c0-.614-.088-1.045-.23-1.385-.143-.339-.357-.633-.673-.949a3.111 3.111 0 0 0-2.218-.915c-1.092.003-2.165.627-3.226 1.602-.823.755-1.554 1.637-2.228 2.45l-.127.154.562.566a.755.755 0 0 0 1.066.02l.794-.79c1.258-1.258 3.312-1.31 4.594-.032.396.394.792.791 1.173 1.173Z"></path> </svg> Code of conduct </a> </div> <include-fragment src="/trimstray/nginx-admins-handbook/hovercards/citation/sidebar_partial?tree_name=master"> </include-fragment> <div class="mt-2"> <a href="/trimstray/nginx-admins-handbook/activity" data-view-component="true" class="Link Link--muted"><svg text="gray" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-2"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span class="color-fg-muted">Activity</span></a> </div> <h3 class="sr-only">Stars</h3> <div class="mt-2"> <a href="/trimstray/nginx-admins-handbook/stargazers" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <strong>13.6k</strong> stars</a> </div> <h3 class="sr-only">Watchers</h3> <div class="mt-2"> <a href="/trimstray/nginx-admins-handbook/watchers" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-eye mr-2"> <path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2ZM1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5c1.473 0 2.825-.742 3.955-1.715 1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5c-1.473 0-2.825.742-3.955 1.715-1.124.967-1.954 2.096-2.366 2.717ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10Z"></path> </svg> <strong>345</strong> watching</a> </div> <h3 class="sr-only">Forks</h3> <div class="mt-2"> <a href="/trimstray/nginx-admins-handbook/forks" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <strong>1.1k</strong> forks</a> </div> <div class="mt-2"> <a class="Link--muted" href="/contact/report-content?content_url=https%3A%2F%2Fgithub.com%2Ftrimstray%2Fnginx-admins-handbook&report=trimstray+%28user%29"> Report repository </a> </div> </div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame"> <a href="/trimstray/nginx-admins-handbook/releases" data-view-component="true" class="Link--primary no-underline Link">Releases</a></h2> <div class="text-small color-fg-muted">No releases published</div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3"> <a href="/users/trimstray/packages?repo_name=nginx-admins-handbook" data-view-component="true" class="Link--primary no-underline Link d-flex flex-items-center">Packages <span title="0" hidden="hidden" data-view-component="true" class="Counter ml-1">0</span></a></h2> <div class="text-small color-fg-muted" > No packages published <br> </div> </div> </div> <div class="BorderGrid-row" hidden> <div class="BorderGrid-cell"> <include-fragment src="/trimstray/nginx-admins-handbook/used_by_list" accept="text/fragment+html"> </include-fragment> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3"> <a href="/trimstray/nginx-admins-handbook/graphs/contributors" data-view-component="true" class="Link--primary no-underline Link d-flex flex-items-center">Contributors <span title="14" data-view-component="true" class="Counter ml-1">14</span></a></h2> <include-fragment src="/trimstray/nginx-admins-handbook/contributors_list?count=14&current_repository=nginx-admins-handbook&items_to_show=14" aria-busy="true" aria-label="Loading contributors"> <ul class="list-style-none d-flex flex-wrap mb-n2"> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> </ul> </include-fragment> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3">Languages</h2> <div class="mb-2"> <span data-view-component="true" class="Progress"> <span style="background-color:#89e051 !important;;width: 89.5%;" itemprop="keywords" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#e34c26 !important;;width: 5.7%;" itemprop="keywords" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#199f4b !important;;width: 1.7%;" itemprop="keywords" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#3572A5 !important;;width: 1.6%;" itemprop="keywords" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#663399 !important;;width: 1.1%;" itemprop="keywords" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#ccc !important;;width: 0.4%;" itemprop="keywords" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> </span></div> <ul class="list-style-none"> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/trimstray/nginx-admins-handbook/search?l=shell" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#89e051;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">Shell</span> <span>89.5%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/trimstray/nginx-admins-handbook/search?l=html" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#e34c26;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">HTML</span> <span>5.7%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/trimstray/nginx-admins-handbook/search?l=vim-script" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#199f4b;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">Vim Script</span> <span>1.7%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/trimstray/nginx-admins-handbook/search?l=python" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#3572A5;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">Python</span> <span>1.6%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/trimstray/nginx-admins-handbook/search?l=css" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#663399;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">CSS</span> <span>1.1%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/trimstray/nginx-admins-handbook/search?l=gdb" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#ccc;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">GDB</span> <span>0.4%</span> </a> </li> </ul> </div> </div> </div> </div> </div></div> </div> </div> </turbo-frame> </main> </div> </div> <footer class="footer pt-8 pb-6 f6 color-fg-muted p-responsive" role="contentinfo" > <h2 class='sr-only'>Footer</h2> <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap"> <div class="d-flex flex-items-center flex-shrink-0 mx-2"> <a aria-label="Homepage" title="GitHub" class="footer-octicon mr-2" href="https://github.com"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12 1C5.9225 1 1 5.9225 1 12C1 16.8675 4.14875 20.9787 8.52125 22.4362C9.07125 22.5325 9.2775 22.2025 9.2775 21.9137C9.2775 21.6525 9.26375 20.7862 9.26375 19.865C6.5 20.3737 5.785 19.1912 5.565 18.5725C5.44125 18.2562 4.905 17.28 4.4375 17.0187C4.0525 16.8125 3.5025 16.3037 4.42375 16.29C5.29 16.2762 5.90875 17.0875 6.115 17.4175C7.105 19.0812 8.68625 18.6137 9.31875 18.325C9.415 17.61 9.70375 17.1287 10.02 16.8537C7.5725 16.5787 5.015 15.63 5.015 11.4225C5.015 10.2262 5.44125 9.23625 6.1425 8.46625C6.0325 8.19125 5.6475 7.06375 6.2525 5.55125C6.2525 5.55125 7.17375 5.2625 9.2775 6.67875C10.1575 6.43125 11.0925 6.3075 12.0275 6.3075C12.9625 6.3075 13.8975 6.43125 14.7775 6.67875C16.8813 5.24875 17.8025 5.55125 17.8025 5.55125C18.4075 7.06375 18.0225 8.19125 17.9125 8.46625C18.6138 9.23625 19.04 10.2125 19.04 11.4225C19.04 15.6437 16.4688 16.5787 14.0213 16.8537C14.42 17.1975 14.7638 17.8575 14.7638 18.8887C14.7638 20.36 14.75 21.5425 14.75 21.9137C14.75 22.2025 14.9563 22.5462 15.5063 22.4362C19.8513 20.9787 23 16.8537 23 12C23 5.9225 18.0775 1 12 1Z"></path> </svg> </a> <span> © 2025 GitHub, Inc. </span> </div> <nav aria-label="Footer"> <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3> <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading"> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to Terms","label":"text:terms"}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to privacy","label":"text:privacy"}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to security","label":"text:security"}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to status","label":"text:status"}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to docs","label":"text:docs"}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to contact","label":"text:contact"}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a> </li> <li class="mx-2" > <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"cookies","context":"subfooter","tag":"link","label":"cookies_link_subfooter_footer"}" > Manage cookies </button> </cookie-consent-link> </li> <li class="mx-2"> <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"dont_share_info","context":"subfooter","tag":"link","label":"dont_share_info_link_subfooter_footer"}" > Do not share my personal information </button> </cookie-consent-link> </li> </ul> </nav> </div> </footer> <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999" data-initial-cookie-consent-allowed="" data-cookie-consent-required="false"></ghcc-consent> <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> You can’t perform that action at this time. </div> <template id="site-details-dialog"> <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open> <summary role="button" aria-label="Close dialog"></summary> <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal"> <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div class="octocat-spinner my-6 js-details-dialog-spinner"></div> </details-dialog> </details> </template> <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;"> <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;"> </div> </div> <template id="snippet-clipboard-copy-button"> <div class="zeroclipboard-container position-absolute right-0 top-0"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> <template id="snippet-clipboard-copy-button-unpositioned"> <div class="zeroclipboard-container"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> </div> <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div> <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div> </body> </html>